OBJECT=ZYT_TO_EJ_INCREMENTAL_MEDICINE_SYNC RESULT=NON_DESTRUCTIVE_INCREMENTAL_PUSH_DEPLOYED_EXECUTED_AND_VERIFIED NEXT=RETRY_THE_PREVIOUSLY_FAILED_PHARMACY_ORDER BRANCH_ZYT=codex/ej-medicine-incremental-sync BRANCH_EJ=codex/ej-additive-medicine-import ZYT_COMMIT=17e9e7b6b ZYT_PUSH=origin/codex/ej-medicine-incremental-sync EJ_COMMIT=495b02341ac940d7f7b3dac5254fb6714b41311b EJ_PUSH=origin/codex/ej-additive-medicine-import CHANGED_BRANCH_FIELD=ZYT ej-pharmacy:push-medicines add-only command + EJ medicine-imports unrelated-catalog preservation CLARIFIED_BEHAVIOR=restore soft-deleted ZYT-origin EJ medicine in place; re-enable disabled ZYT-origin medicine; append new ZYT medicine; preserve active existing and EJ-only medicines ARTIFACTS: MODIFIED_FILE=/Users/long/Work/zyt-ej-medicine-sync/artifacts/ej-medicine-incremental-sync/MODIFIED_FILE DIFF_FILE=/Users/long/Work/zyt-ej-medicine-sync/artifacts/ej-medicine-incremental-sync/DIFF_FILE VERIFICATION=/Users/long/Work/zyt-ej-medicine-sync/artifacts/ej-medicine-incremental-sync/VERIFICATION.txt ROLLBACK=/Users/long/Work/zyt-ej-medicine-sync/artifacts/ej-medicine-incremental-sync/ROLLBACK.sh ORIGINAL: ZYT_BASE_COMMIT=27fbef9321c67f962e4d73f04a52272887c04f95 ZYT_CONSOLE_SHA256=c722a3445f5027edcec9bb5be0981252bb6b3c28ba6f27e87364cc6829e7be6c ZYT_ROUTE_CONTRACTS_SHA256=d17a7d25b1903f5f4bb52740f068b493a6b7842b57adc4f503bf995e43d26d7e EJ_BASE_COMMIT=a7439cc2e8c37dd6c32c926f0cc39c1a9c9b4b67 EJ_IMPORT_SERVICE_SHA256=70f2444db461be0773348814849eeec1742c622e8a807d4b50b2c1190f664b29 EJ_IMPORT_TEST_SHA256=f91eca5aeb6b493a345dfb79e30614356a83695cc0cd37fe2b8f3d58b0c80e6f BASELINE_1: COMMAND=cd /Users/long/Work/zyt/server && php tests/pharmacy/callback_auth_integration.php INPUT=baseline checkout 27fbef9321c67f962e4d73f04a52272887c04f95 LITERAL_OUTPUT=zyt pharmacy callback/auth integration tests passed: 57 EXIT_STATUS=0 BASELINE_2: COMMAND=cd /Users/long/Work/zyt/server && php tests/pharmacy/run.php INPUT=baseline checkout 27fbef9321c67f962e4d73f04a52272887c04f95 LITERAL_OUTPUT=Fatal error: Uncaught RuntimeException: tracking correction must append a strict operation log containing old and new logistics values EXIT_STATUS=255 BASELINE_STATUS=pre-existing unrelated tracking-log contract failure; identical after this change BASELINE_3: COMMAND=cd /Users/long/Work/ej/server && php tests/pharmacy/run.php INPUT=baseline checkout a7439cc2e8c37dd6c32c926f0cc39c1a9c9b4b67 LITERAL_OUTPUT=pharmacy contract tests passed: 67; pharmacy domain contract tests passed: 41; admin pharmacy contracts passed; workflow template contracts passed: 14 EXIT_STATUS=0 MODIFIED_1: COMMAND=php /Users/long/Work/zyt/server/tests/pharmacy/incremental_medicine_push.php INPUT=callback fixtures covering dry-run, stable import IDs, HMAC response identity, locks, created/existing responses, inactive mapping preservation, and zero deletes LITERAL_OUTPUT=incremental EJ medicine push tests passed: 40 EXIT_STATUS=0 MODIFIED_2: COMMAND=php heredoc harness requiring /Users/long/Work/zyt/server/tests/pharmacy/route_contracts.php INPUT=modified command/service registration contracts LITERAL_OUTPUT=route contracts passed: 26 EXIT_STATUS=0 MODIFIED_3: COMMAND=cd /Users/long/Work/zyt/server && php think ej-pharmacy:push-medicines INPUT=default dry-run; no --apply LITERAL_OUTPUT=dry-run source=654 candidates=654 batches=7 mapped=654 unmapped=0 preserved_inactive=0 remote_delete=0 local_delete=0 EXIT_STATUS=0 MODIFIED_RESULT=no EJ HTTP write; no ZYT projection write; no delete MODIFIED_4: COMMAND=cd /Users/long/Work/zyt/server && php think ej-pharmacy:push-medicines --apply INPUT=apply requested without confirmation token LITERAL_OUTPUT=执行增量写入必须提供 --confirm=INCREMENTAL_NO_DELETE EXIT_STATUS=1 MODIFIED_RESULT=write gate stopped before lock, HTTP, or projection mutation MODIFIED_5: COMMAND=cd /Users/long/Work/ej/server && php tests/pharmacy/run.php INPUT=EJ additive medicine-import service with unrelated catalog rows preserved LITERAL_OUTPUT=pharmacy contract tests passed: 67; pharmacy domain contract tests passed: 41; admin pharmacy contracts passed; workflow template contracts passed: 14 EXIT_STATUS=0 MODIFIED_6: COMMAND=cd /Users/long/Work/ej/server && php tests/pharmacy/medicine_import_mysql_integration.php INPUT=isolated temporary database containing an unrelated EJ medicine plus a new ZYT source medicine LITERAL_OUTPUT=medicine import MySQL integration passed: 15 (temporary_database) EXIT_STATUS=0 MODIFIED_RESULT=unrelated EJ medicine and active existing ZYT medicine preserved byte-for-byte; soft-deleted medicine restored in place with original id/code/stock; disabled medicine re-enabled; one new medicine appended; temporary database cleaned MODIFIED_7: COMMAND=php -l on ZYT service, ZYT command, ZYT console config, and EJ MedicineImportService INPUT=all changed PHP runtime files LITERAL_OUTPUT=No syntax errors detected EXIT_STATUS=0 ROLLBACK: COMMAND=ZYT_ROOT=/tmp/ej-sync-rollback-latest.eAdq7T/zyt EJ_ROOT=/tmp/ej-sync-rollback-latest.eAdq7T/ej /Users/long/Work/zyt-ej-medicine-sync/artifacts/ej-medicine-incremental-sync/ROLLBACK.sh INPUT=detached copies at ZYT 27fbef932 and EJ a7439cc with clarified diffs applied; BEFORE_ZYT=6; BEFORE_EJ=3 LITERAL_OUTPUT=ROLLBACK_OK: ZYT incremental push removed; EJ unrelated-catalog preflight restored. EXIT_STATUS=0 ROLLBACK_RESULT=AFTER_ZYT=0; AFTER_EJ=0; both copies restored to clean base behavior/status CURRENT_STATUS=ZYT and EJ code deployed; EJ import enabled only for merchant ZYT; production incremental apply completed; target medicine is active; zero deletes RESTORED_BEHAVIOR=ROLLBACK removes the ZYT push command/service/docs/tests and restores EJ bootstrap-only unrelated-catalog rejection DEPLOYMENT_1: COMMAND=ssh zyt deployment transaction installing ZYT commit 192c31fb8c601d78ed5fc7dd635ee80372a9a760 and EJ commit 495b02341ac940d7f7b3dac5254fb6714b41311b INPUT=HOST 39.97.232.35; ZYT /www/wwwroot/zyt; EJ /www/wwwroot/ej; targeted files only LITERAL_OUTPUT=BACKUP=/www/deploy-backups/ej-medicine-sync-20260910-120752; ZYT_DEPLOYED=192c31fb8c601d78ed5fc7dd635ee80372a9a760; EJ_DEPLOYED=495b02341ac940d7f7b3dac5254fb6714b41311b EXIT_STATUS=0 DEPLOYMENT_RESULT=unrelated ZYT ACME file and EJ DoctorLogic/.well-known changes preserved DEPLOYMENT_2: COMMAND=/etc/init.d/php-fpm-82 reload INPUT=production PHP 8.2 service after targeted file installation LITERAL_OUTPUT=Reload service php-fpm done EXIT_STATUS=0 DEPLOYMENT_3: COMMAND=sha256sum deployed runtime files and git show COMMIT:PATH INPUT=ZYT console/command/service plus EJ MedicineImportService LITERAL_OUTPUT=all four expected hashes equal actual hashes; match=YES EXIT_STATUS=0 DEPLOYMENT_4: COMMAND=cd /www/wwwroot/zyt/server && php think ej-pharmacy:push-medicines INPUT=production default dry-run; no --apply LITERAL_OUTPUT=dry-run source=654 candidates=654 batches=7 mapped=654 unmapped=0 preserved_inactive=0 remote_delete=0 local_delete=0 EXIT_STATUS=0 DEPLOYMENT_RESULT=no EJ HTTP write; no ZYT projection write; no delete DEPLOYMENT_5: COMMAND=curl https://admin.zhenyangtang.com.cn/ and curl https://lyej.lyenji.com/api/openapi/v1/medicines?after=0&limit=1 without HMAC headers INPUT=public post-deployment health verification LITERAL_OUTPUT=admin HTTP=200 text/html; EJ HTTP=401 application/json with message Missing authentication headers EXIT_STATUS=0 DEPLOYMENT_RESULT=public admin and EJ gateway are reachable; EJ authentication middleware is active PRODUCTION_BACKUP=/www/deploy-backups/ej-medicine-sync-20260910-120752 PRODUCTION_ROLLBACK=/www/deploy-backups/ej-medicine-sync-20260910-120752/ROLLBACK.sh PRODUCTION_ROLLBACK_CHECK=bash -n exit 0; ZYT_BACKUP_FILES=2; EJ_BACKUP_FILES=3; EJ env restore and PHP-FPM reload included PRODUCTION_APPLY=SUCCESS APPLY_1: COMMAND=cd /www/wwwroot/zyt/server && php think ej-pharmacy:push-medicines --apply --confirm=INCREMENTAL_NO_DELETE --batch-size=100 --run-id=repair-20260910 INPUT=production source=654 candidates=654; EJ import feature flag initially false LITERAL_OUTPUT=恩济药材导入失败 HTTP 403:Medicine import is disabled EXIT_STATUS=1 CORRECTION=backed up /www/wwwroot/ej/server/.env; set PHARMACY_MEDICINE_IMPORT_ENABLED=true; retained PHARMACY_MEDICINE_IMPORT_ALLOWED_MERCHANTS=ZYT; reloaded PHP-FPM APPLY_2: COMMAND=cd /www/wwwroot/zyt/server && php think ej-pharmacy:push-medicines --apply --confirm=INCREMENTAL_NO_DELETE --batch-size=100 --run-id=repair-20260910 INPUT=production after EJ import enablement restricted to merchant ZYT LITERAL_OUTPUT=incremental 完成 run_id=repair-20260910 source=654 candidates=654 batches=7 remote_created=0 remote_existing=654 preserved_inactive=0 catalog_created=0 catalog_updated=654 mapping_created=0 mapping_updated=0 mapping_unchanged=654 remote_delete=0 local_delete=0 EXIT_STATUS=0 APPLY_RESULT=seven EJ import batches completed; no remote or local deletes; existing mappings retained APPLY_3: COMMAND=signed EJ GET catalog verification through EjPharmacyClient and EjMedicineCatalogSyncPolicy INPUT=target medicine_code EJ954E7F38D7E3 LITERAL_OUTPUT=REMOTE_RECEIVED=670; TARGET_CODE=EJ954E7F38D7E3; TARGET_NAME=生地黄; TARGET_STATUS=1; CATALOG_VERSION=1371; VERIFY_EXIT=0 EXIT_STATUS=0 APPLY_RESULT=previously rejected target medicine is present and active; EJ catalog still contains 670 rows versus 654 ZYT source medicines, so EJ-only medicines remain present APPLY_4: COMMAND=tail production EJ nginx access/error logs INPUT=/api/openapi/v1/medicine-imports after 2026-09-10 12:14:51 +0800 LITERAL_OUTPUT=seven POST requests returned HTTP 201; no new medicine import PHP/upstream errors EXIT_STATUS=0 POST_APPLY_AGGREGATE: COMMAND=read-only aggregate over EJ pharmacy_medicine joined to pharmacy_medicine_source for the 2026-09-10 12:14:45-12:15:00 apply window INPUT=source_system=zyt; production SELECT only LITERAL_OUTPUT=RESTORED_OR_REENABLED=628; ZYT_ACTIVE=654; ZYT_TOTAL=654; EJ_VISIBLE_TOTAL=668; UNCHANGED_ACTIVE=26; READ_ONLY_EXIT=0 EXIT_STATUS=0 RESULT=628 previously disabled or soft-deleted ZYT-origin medicines were restored/re-enabled; all 654 ZYT-origin medicines are active; 14 additional visible EJ medicines remain