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
