diff --git a/runtime/history/SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3.json b/runtime/history/SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3.json
new file mode 100644
index 00000000..4ea74c9c
--- /dev/null
+++ b/runtime/history/SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3.json
@@ -0,0 +1,38 @@
+{
+ "schema_version": 1,
+ "channel": "homelab-runtime",
+ "command_id": "SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3",
+ "status": "FAIL",
+ "rc": 3,
+ "host": "pve01",
+ "mode": "change",
+ "component": "gram-support-email-status-ru-codevipe-canary",
+ "started_at_utc": "2026-09-18T05:38:02Z",
+ "finished_at_utc": "2026-09-18T05:38:05Z",
+ "reference_register_checked": true,
+ "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
+ "error_register_checked": true,
+ "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
+ "command_sha256": "aecc703169fc146cba88ed910c5adb0522c51820d3c46704544a4fd188665f1f",
+ "duplicate_failed_command_blocked": false,
+ "block_reason": null,
+ "execution_started": true,
+ "change_declared": true,
+ "result_contract_valid": true,
+ "result_contract_status": "FAIL",
+ "result_contract_error": null,
+ "command_rc": 3,
+ "changes_made": true,
+ "rollback_started": true,
+ "rollback_restored": true,
+ "mutation_outcome": "ROLLED_BACK",
+ "sanitized": true,
+ "secrets_included": false,
+ "private_addresses_included": false,
+ "raw_evidence_retained_locally": true,
+ "raw_evidence_sha256": "5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a",
+ "sanitized_output_sha256": "5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a",
+ "output_truncated_in_json": false,
+ "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
+ "output": "GRAM516R3_SAFE_REPORT={\"apply\":{\"err_truncated\":false,\"guest\":{\"backup_written\":true,\"changed\":true,\"changed_template_titles\":[\"gram_support_account\",\"gram_support_staff_queue\",\"gram_support_staff_ticket\",\"gram_support_ticket\"],\"dry_self_excluded_count\":0,\"dry_staff_count\":1,\"dry_staff_target_match\":true,\"error\":\"EXCEPTION_JSONDecodeError_Expecting value: line 1 column 1 (char 0)\",\"hash_entries_updated\":4,\"mode\":\"apply\",\"ok\":false,\"origin_pre\":{\"/\":\"301|https://codevipe.ru/\",\"/support/\":\"301|https://codevipe.ru/support/\",\"/support/create/\":\"301|https://codevipe.ru/support/create/\"},\"pre_error_max\":10,\"pre_tree_sha256\":\"f4021bfa4291e0837373f85e37523e1884579626aa83f1bbb9c3ae8a2dacb452\",\"rollback_restored\":true,\"rollback_started\":true,\"slug\":\"codevipe\",\"staff_target_exact\":true,\"status_labels_ru\":{\"CLOSED\":\"\\u0417\\u0430\\u043a\\u0440\\u044b\\u0442\",\"IN_PROGRESS\":\"\\u0412 \\u0440\\u0430\\u0431\\u043e\\u0442\\u0435\",\"NEW\":\"\\u041d\\u043e\\u0432\\u044b\\u0439\",\"RESOLVED\":\"\\u0420\\u0435\\u0448\\u0451\\u043d\",\"WAITING_USER\":\"\\u041e\\u0436\\u0438\\u0434\\u0430\\u0435\\u0442 \\u043e\\u0442\\u0432\\u0435\\u0442\\u0430 \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}},\"guest_stderr_present\":false,\"inner_rc\":3,\"ok\":false,\"out_truncated\":false,\"transport_rc\":0,\"transport_stderr_bytes\":0,\"transport_stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"post_edge\":{},\"post_edge_ok\":false,\"pre_edge\":{\"/\":{\"http\":\"200\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"/support/\":{\"http\":\"303\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"/support/create/\":{\"http\":\"200\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}},\"rollback_after_edge_failure\":null}\nGRAM516R3_DECISION=HOLD_CODEVIPE_EMAIL_STATUS_CANARY\nGRAM516R3_NEXT_GATE=STOP_REVIEW_NO_BLIND_RERUN\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}\n"
+}
diff --git a/runtime/history/SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3.txt b/runtime/history/SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3.txt
new file mode 100644
index 00000000..cfcf0bc7
--- /dev/null
+++ b/runtime/history/SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3.txt
@@ -0,0 +1,36 @@
+CHAT_OUTPUT_BEGIN
+COMMAND_ID=SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3
+STATUS=FAIL
+RC=3
+HOST=pve01
+MODE=change
+COMPONENT=gram-support-email-status-ru-codevipe-canary
+REFERENCE_REGISTER_CHECK=OK
+REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
+ERROR_REGISTER_CHECK=OK
+ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
+COMMAND_SHA256=aecc703169fc146cba88ed910c5adb0522c51820d3c46704544a4fd188665f1f
+DUPLICATE_FAILED_COMMAND_BLOCKED=false
+EXECUTION_STARTED=true
+CHANGE_DECLARED=true
+RESULT_CONTRACT_VALID=true
+RESULT_CONTRACT_STATUS=FAIL
+RESULT_CONTRACT_ERROR=NONE
+COMMAND_RC=3
+CHANGES_MADE=true
+ROLLBACK_STARTED=true
+ROLLBACK_RESTORED=true
+MUTATION_OUTCOME=ROLLED_BACK
+SANITIZED=yes
+SECRETS_INCLUDED=no
+PRIVATE_ADDRESSES_INCLUDED=no
+RAW_EVIDENCE_SHA256=5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a
+SANITIZED_OUTPUT_SHA256=5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a
+OUTPUT_BEGIN
+GRAM516R3_SAFE_REPORT={"apply":{"err_truncated":false,"guest":{"backup_written":true,"changed":true,"changed_template_titles":["gram_support_account","gram_support_staff_queue","gram_support_staff_ticket","gram_support_ticket"],"dry_self_excluded_count":0,"dry_staff_count":1,"dry_staff_target_match":true,"error":"EXCEPTION_JSONDecodeError_Expecting value: line 1 column 1 (char 0)","hash_entries_updated":4,"mode":"apply","ok":false,"origin_pre":{"/":"301|https://codevipe.ru/","/support/":"301|https://codevipe.ru/support/","/support/create/":"301|https://codevipe.ru/support/create/"},"pre_error_max":10,"pre_tree_sha256":"f4021bfa4291e0837373f85e37523e1884579626aa83f1bbb9c3ae8a2dacb452","rollback_restored":true,"rollback_started":true,"slug":"codevipe","staff_target_exact":true,"status_labels_ru":{"CLOSED":"\u0417\u0430\u043a\u0440\u044b\u0442","IN_PROGRESS":"\u0412 \u0440\u0430\u0431\u043e\u0442\u0435","NEW":"\u041d\u043e\u0432\u044b\u0439","RESOLVED":"\u0420\u0435\u0448\u0451\u043d","WAITING_USER":"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f"}},"guest_stderr_present":false,"inner_rc":3,"ok":false,"out_truncated":false,"transport_rc":0,"transport_stderr_bytes":0,"transport_stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"post_edge":{},"post_edge_ok":false,"pre_edge":{"/":{"http":"200","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"/support/":{"http":"303","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"/support/create/":{"http":"200","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}},"rollback_after_edge_failure":null}
+GRAM516R3_DECISION=HOLD_CODEVIPE_EMAIL_STATUS_CANARY
+GRAM516R3_NEXT_GATE=STOP_REVIEW_NO_BLIND_RERUN
+HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3","status":"FAIL","changes_made":true,"rollback_started":true,"rollback_restored":true}
+
+OUTPUT_END
+CHAT_OUTPUT_END
diff --git a/runtime/latest.json b/runtime/latest.json
index 61e09cca..4ea74c9c 100644
--- a/runtime/latest.json
+++ b/runtime/latest.json
@@ -1,38 +1,38 @@
{
"schema_version": 1,
"channel": "homelab-runtime",
- "command_id": "SUPPORT-260918-GRAM-SUPPORT-STATUS-RU-EDGE-READONLY-516R2R3",
+ "command_id": "SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3",
"status": "FAIL",
"rc": 3,
"host": "pve01",
- "mode": "read-only",
- "component": "gram-support-status-ru-edge-readonly",
- "started_at_utc": "2026-09-18T05:29:19Z",
- "finished_at_utc": "2026-09-18T05:29:22Z",
+ "mode": "change",
+ "component": "gram-support-email-status-ru-codevipe-canary",
+ "started_at_utc": "2026-09-18T05:38:02Z",
+ "finished_at_utc": "2026-09-18T05:38:05Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
- "command_sha256": "2676544fc2dd181e3bc5f4f98570fcd25c589e595ba573499830598b5bc5e3c2",
+ "command_sha256": "aecc703169fc146cba88ed910c5adb0522c51820d3c46704544a4fd188665f1f",
"duplicate_failed_command_blocked": false,
"block_reason": null,
"execution_started": true,
- "change_declared": false,
+ "change_declared": true,
"result_contract_valid": true,
- "result_contract_status": null,
+ "result_contract_status": "FAIL",
"result_contract_error": null,
"command_rc": 3,
- "changes_made": false,
- "rollback_started": false,
- "rollback_restored": null,
- "mutation_outcome": "NO_MUTATION",
+ "changes_made": true,
+ "rollback_started": true,
+ "rollback_restored": true,
+ "mutation_outcome": "ROLLED_BACK",
"sanitized": true,
"secrets_included": false,
"private_addresses_included": false,
"raw_evidence_retained_locally": true,
- "raw_evidence_sha256": "a6e5bf8138ec51c112870bac14c73eae060532447dea04c183fa92074870bb80",
- "sanitized_output_sha256": "a6e5bf8138ec51c112870bac14c73eae060532447dea04c183fa92074870bb80",
+ "raw_evidence_sha256": "5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a",
+ "sanitized_output_sha256": "5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
- "output": "GRAM516R2R3_SAFE_REPORT={\"edge_https\":{\"/\":{\"http\":\"200\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"/support/\":{\"http\":\"303\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"/support/create/\":{\"http\":\"200\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}},\"edge_https_3of3_200\":false,\"err_truncated\":false,\"guest\":{\"error\":null,\"ok\":true,\"origin_http\":{\"/\":\"301|https://codevipe.ru/\",\"/support/\":\"301|https://codevipe.ru/support/\",\"/support/create/\":\"301|https://codevipe.ru/support/create/\"},\"runtime\":{\"addon_state\":{\"active\":1,\"version_id\":1000120,\"version_string\":\"1.0.0 Alpha 3 Unified Fix 10\"},\"error\":null,\"ok\":true,\"status_policy_constants\":{\"CLOSED\":\"CLOSED\",\"IN_PROGRESS\":\"IN_PROGRESS\",\"MAP\":{\"CLOSED\":[],\"IN_PROGRESS\":[\"WAITING_USER\",\"RESOLVED\",\"CLOSED\"],\"NEW\":[\"IN_PROGRESS\",\"WAITING_USER\",\"RESOLVED\",\"CLOSED\"],\"RESOLVED\":[\"IN_PROGRESS\",\"CLOSED\"],\"WAITING_USER\":[\"IN_PROGRESS\",\"RESOLVED\",\"CLOSED\"]},\"NEW\":\"NEW\",\"RESOLVED\":\"RESOLVED\",\"WAITING_USER\":\"WAITING_USER\"},\"status_policy_methods\":[\"all\",\"canTransition\"]},\"source\":{\"Pub/Controller/StaffSupport.php\":{\"line_count\":178,\"matched_context\":[{\"sep\":true},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"use Gram\\\\Support\\\\Notification\\\\EventDispatcher;\"},{\"line\":6,\"text\":\"use Gram\\\\Support\\\\Service\\\\Ticket\\\\Reply;\"},{\"line\":7,\"text\":\"use Gram\\\\Support\\\\Service\\\\Ticket\\\\StaffUpdate;\"},{\"line\":8,\"text\":\"use Gram\\\\Support\\\\Util\\\\StatusPolicy;\"},{\"line\":9,\"text\":\"\"},{\"line\":10,\"text\":\"final class StaffSupport extends \\\\XF\\\\Pub\\\\Controller\\\\AbstractController\"},{\"line\":11,\"text\":\"{\"},{\"line\":12,\"text\":\"private function assertStaff(bool $manage = false): void\"},{\"sep\":true},{\"line\":53,\"text\":\"'gram_support_staff_ticket',\"},{\"line\":54,\"text\":\"[\"},{\"line\":55,\"text\":\"'ticket' => $ticket,\"},{\"line\":56,\"text\":\"'messages' => $messages,\"},{\"line\":57,\"text\":\"'statusOptions' => StatusPolicy::all()\"},{\"line\":58,\"text\":\"]\"},{\"line\":59,\"text\":\");\"},{\"line\":60,\"text\":\"}\"},{\"line\":61,\"text\":\"\"},{\"sep\":true},{\"line\":92,\"text\":\"$this->assertPostOnly();\"},{\"line\":93,\"text\":\"$this->assertStaff(true);\"},{\"line\":94,\"text\":\"\"},{\"line\":95,\"text\":\"$ticket = $this->assertTicket();\"},{\"line\":96,\"text\":\"$newStatus = trim($this->filter('status', 'str'));\"},{\"line\":97,\"text\":\"$assignedUserId = (int)$this->filter('assigned_user_id', 'uint');\"},{\"line\":98,\"text\":\"\"},{\"line\":99,\"text\":\"/** @var StaffUpdate $staffUpdate */\"},{\"line\":100,\"text\":\"$staffUpdate = $this->service(StaffUpdate::class);\"},{\"line\":101,\"text\":\"$staffUpdate->validateTransition((string)$ticket->status, $newStatus);\"},{\"line\":102,\"text\":\"\"},{\"line\":103,\"text\":\"if ($assignedUserId > 0)\"},{\"line\":104,\"text\":\"{\"},{\"line\":105,\"text\":\"if (!\\\\XF::visitor()->hasPermission('gramSupport', 'assign'))\"},{\"sep\":true},{\"line\":115,\"text\":\"return $this->error(\\\\XF::phrase('gram_support_assignee_invalid'));\"},{\"line\":116,\"text\":\"}\"},{\"line\":117,\"text\":\"}\"},{\"line\":118,\"text\":\"\"},{\"line\":119,\"text\":\"$oldStatus = (string)$ticket->status;\"},{\"line\":120,\"text\":\"$oldAssigned = (int)$ticket->assigned_user_id;\"},{\"line\":121,\"text\":\"\"},{\"line\":122,\"text\":\"$db = \\\\XF::db();\"},{\"line\":123,\"text\":\"$db->beginTransaction();\"},{\"line\":124,\"text\":\"\"},{\"line\":125,\"text\":\"try\"},{\"line\":126,\"text\":\"{\"},{\"line\":127,\"text\":\"$ticket->status = $newStatus;\"},{\"line\":128,\"text\":\"$ticket->assigned_user_id = $assignedUserId;\"},{\"line\":129,\"text\":\"$ticket->updated_date = \\\\XF::$time;\"},{\"line\":130,\"text\":\"$ticket->resolved_date = $newStatus === StatusPolicy::RESOLVED\"},{\"line\":131,\"text\":\"? \\\\XF::$time\"},{\"line\":132,\"text\":\": ($newStatus === StatusPolicy::CLOSED ? (int)$ticket->resolved_date : 0);\"},{\"line\":133,\"text\":\"$ticket->save();\"},{\"line\":134,\"text\":\"\"},{\"line\":135,\"text\":\"$event = \\\\XF::em()->create('Gram\\\\Support:SupportEvent');\"},{\"line\":136,\"text\":\"$event->ticket_id = (int)$ticket->ticket_id;\"},{\"sep\":true},{\"line\":139,\"text\":\"$event->event_type = 'ticket_staff_updated';\"},{\"line\":140,\"text\":\"$event->event_date = \\\\XF::$time;\"},{\"line\":141,\"text\":\"$event->safe_payload_json = json_encode([\"},{\"line\":142,\"text\":\"'public_ref' => (string)$ticket->public_ref,\"},{\"line\":143,\"text\":\"'old_status' => $oldStatus,\"},{\"line\":144,\"text\":\"'new_status' => $newStatus,\"},{\"line\":145,\"text\":\"'old_assigned_user_id' => $oldAssigned,\"},{\"line\":146,\"text\":\"'new_assigned_user_id' => $assignedUserId,\"},{\"line\":147,\"text\":\"'is_internal' => false\"},{\"line\":148,\"text\":\"], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);\"}],\"present\":true,\"sha256\":\"6852bd0061d6e118851673bfd4099e2b22e6291bf09f429820740844996f93f9\"},\"Util/StatusPolicy.php\":{\"line_count\":29,\"matched_context\":[{\"sep\":true},{\"line\":1,\"text\":\" [self::IN_PROGRESS, self::WAITING_USER, self::RESOLVED, self::CLOSED],\"},{\"line\":14,\"text\":\"self::IN_PROGRESS => [self::WAITING_USER, self::RESOLVED, self::CLOSED],\"},{\"line\":15,\"text\":\"self::WAITING_USER => [self::IN_PROGRESS, self::RESOLVED, self::CLOSED],\"},{\"line\":16,\"text\":\"self::RESOLVED => [self::IN_PROGRESS, self::CLOSED],\"},{\"line\":17,\"text\":\"self::CLOSED => []\"},{\"line\":18,\"text\":\"];\"},{\"line\":19,\"text\":\"\"},{\"line\":20,\"text\":\"public static function canTransition(string $from, string $to): bool\"},{\"line\":21,\"text\":\"{\"},{\"line\":22,\"text\":\"return $from === $to || in_array($to, self::MAP[$from] ?? [], true);\"},{\"line\":23,\"text\":\"}\"},{\"line\":24,\"text\":\"\"}],\"present\":true,\"sha256\":\"356f4b24d4b2a562105d3c7cc4f83ce198be11d15770c71ec2bf1d9ca43310f7\"},\"_data/phrases.xml\":{\"line_count\":57,\"matched_context\":[{\"sep\":true},{\"line\":16,\"text\":\"\\u0421\\u043a\\u0440\\u0438\\u043d\\u0448\\u043e\\u0442 (\\u043d\\u0435\\u043e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e)\"},{\"line\":17,\"text\":\"\\u0421\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u0435\"},{\"line\":18,\"text\":\"\\u041e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u043e\"},{\"line\":19,\"text\":\"\\u0421\\u043e\\u0445\\u0440\\u0430\\u043d\\u0438\\u0442\\u0435 \\u044d\\u0442\\u043e\\u0442 \\u043a\\u043e\\u0434 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u0430. \\u041e\\u043d \\u043f\\u043e\\u043a\\u0430\\u0437\\u044b\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f \\u043a\\u0430\\u043a \\u0441\\u0435\\u043a\\u0440\\u0435\\u0442 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u0430 \\u043a \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u044e.\"},{\"line\":20,\"text\":\"\\u041e\\u0442\\u043a\\u0440\\u044b\\u0442\\u044c \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u0435\"},{\"line\":21,\"text\":\"\\u0421\\u0442\\u0430\\u0442\\u0443\\u0441\"},{\"line\":22,\"text\":\"\\u041e\\u0442\\u0432\\u0435\\u0442\"},{\"line\":23,\"text\":\"\\u041e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c\"},{\"line\":24,\"text\":\"\\u041c\\u043e\\u0438 \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u044f\"},{\"line\":25,\"text\":\"\\u041e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u0439 \\u043f\\u043e\\u043a\\u0430 \\u043d\\u0435\\u0442.\"},{\"sep\":true},{\"line\":28,\"text\":\"\\u0412\\u043d\\u0443\\u0442\\u0440\\u0435\\u043d\\u043d\\u044f\\u044f \\u0437\\u0430\\u043c\\u0435\\u0442\\u043a\\u0430\"},{\"line\":29,\"text\":\"ID \\u043d\\u0430\\u0437\\u043d\\u0430\\u0447\\u0435\\u043d\\u043d\\u043e\\u0433\\u043e \\u0441\\u043e\\u0442\\u0440\\u0443\\u0434\\u043d\\u0438\\u043a\\u0430\"},{\"line\":30,\"text\":\"\\u0423\\u043a\\u0430\\u0437\\u0430\\u043d\\u043d\\u044b\\u0439 \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c \\u043d\\u0435 \\u043d\\u0430\\u0439\\u0434\\u0435\\u043d.\"},{\"line\":31,\"text\":\"\\u0421\\u043b\\u0438\\u0448\\u043a\\u043e\\u043c \\u043c\\u043d\\u043e\\u0433\\u043e \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u0439. \\u041f\\u043e\\u043f\\u0440\\u043e\\u0431\\u0443\\u0439\\u0442\\u0435 \\u043f\\u043e\\u0437\\u0436\\u0435.\"},{\"line\":32,\"text\":\"\\u041f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u043a\\u0430\"},{\"line\":33,\"text\":\"\\u041f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u043a\\u0430 \\u043d\\u0435\\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043d\\u0430 \\u043e\\u0444\\u043b\\u0430\\u0439\\u043d\"},{\"line\":34,\"text\":\"\\u0414\\u043b\\u044f \\u043f\\u0440\\u043e\\u0441\\u043c\\u043e\\u0442\\u0440\\u0430 \\u0442\\u0438\\u043a\\u0435\\u0442\\u043e\\u0432 \\u0442\\u0440\\u0435\\u0431\\u0443\\u0435\\u0442\\u0441\\u044f \\u043f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u0435 \\u043a \\u0441\\u0435\\u0442\\u0438. \\u0414\\u0430\\u043d\\u043d\\u044b\\u0435 \\u0442\\u0438\\u043a\\u0435\\u0442\\u043e\\u0432 \\u043e\\u0444\\u043b\\u0430\\u0439\\u043d \\u043d\\u0435 \\u0441\\u043e\\u0445\\u0440\\u0430\\u043d\\u044f\\u044e\\u0442\\u0441\\u044f.\"},{\"line\":35,\"text\":\"\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u044f {public_ref}\"},{\"line\":36,\"text\":\"\\u041e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 \\u043e\\u0431\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u044f {public_ref}\"}],\"present\":true,\"sha256\":\"ea6e84de301145312758285cfcd63ee4c12b8e921877bcde15c17dd4c115c434\"},\"_data/templates.xml\":{\"line_count\":781,\"matched_context\":[{\"sep\":true},{\"line\":475,\"text\":\"<div class=\\\"block-row\\\">\"},{\"line\":476,\"text\":\"<a href=\\\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\\\">\"},{\"line\":477,\"text\":\"{{ $ticket.public_ref }} \\u2014 {{ $ticket.subject }}\"},{\"line\":478,\"text\":\"</a>\"},{\"line\":479,\"text\":\"<span class=\\\"u-muted\\\">{{ $ticket.status }}</span>\"},{\"line\":480,\"text\":\"</div>\"},{\"line\":481,\"text\":\"<xf:else />\"},{\"line\":482,\"text\":\"<div class=\\\"block-row\\\">{{ phrase('gram_support_no_tickets') }}</div>\"},{\"line\":483,\"text\":\"</xf:foreach>\"},{\"sep\":true},{\"line\":564,\"text\":\"<div class=\\\"block-row\\\">\"},{\"line\":565,\"text\":\"<a href=\\\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\\\">\"},{\"line\":566,\"text\":\"{{ $ticket.public_ref }} \\u2014 {{ $ticket.subject }}\"},{\"line\":567,\"text\":\"</a>\"},{\"line\":568,\"text\":\"<span class=\\\"u-muted\\\">{{ $ticket.status }}</span>\"},{\"line\":569,\"text\":\"</div>\"},{\"line\":570,\"text\":\"</xf:foreach>\"},{\"line\":571,\"text\":\"</div>\"},{\"line\":572,\"text\":\"</div>\"},{\"sep\":true},{\"line\":700,\"text\":\"\"},{\"line\":701,\"text\":\"<xf:form action=\\\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\\\" method=\\\"post\\\" class=\\\"block\\\">\"},{\"line\":702,\"text\":\"<div class=\\\"block-container\\\">\"},{\"line\":703,\"text\":\"<div class=\\\"block-body\\\">\"},{\"line\":704,\"text\":\"<xf:selectrow name=\\\"status\\\" value=\\\"{$ticket.status}\\\" label=\\\"{{ phrase('gram_support_status') }}\\\">\"},{\"line\":705,\"text\":\"<xf:foreach loop=\\\"$statusOptions\\\" value=\\\"$status\\\">\"},{\"line\":706,\"text\":\"<xf:option value=\\\"{$status}\\\">{$status}</xf:option>\"},{\"line\":707,\"text\":\"</xf:foreach>\"},{\"line\":708,\"text\":\"</xf:selectrow>\"},{\"line\":709,\"text\":\"<xf:textboxrow name=\\\"assigned_user_id\\\" type=\\\"number\\\" value=\\\"{$ticket.assigned_user_id}\\\"\"},{\"sep\":true},{\"line\":720,\"text\":\"<div class=\\\"block-container\\\">\"},{\"line\":721,\"text\":\"<h2 class=\\\"block-header\\\">{{ $ticket.public_ref }}</h2>\"},{\"line\":722,\"text\":\"<div class=\\\"block-body\\\">\"},{\"line\":723,\"text\":\"<div class=\\\"block-row\\\">\"},{\"line\":724,\"text\":\"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\"},{\"line\":725,\"text\":\"</div>\"},{\"line\":726,\"text\":\"<xf:foreach loop=\\\"$messages\\\" value=\\\"$message\\\">\"},{\"line\":727,\"text\":\"<div class=\\\"block-row gramSupport-message\\\">\"},{\"line\":728,\"text\":\"<div class=\\\"gramSupport-messageMeta\\\">{{ date_time($message.message_date) }}</div>\"},{\"sep\":true},{\"line\":748,\"text\":\"</div>\"},{\"line\":749,\"text\":\"</div>\"},{\"line\":750,\"text\":\"</xf:if>\"},{\"line\":751,\"text\":\"\"},{\"line\":752,\"text\":\"<xf:if is=\\\"$ticket.status != 'CLOSED'\\\">\"},{\"line\":753,\"text\":\"<xf:form action=\\\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\\\" method=\\\"post\\\" class=\\\"block\\\">\"},{\"line\":754,\"text\":\"<div class=\\\"block-container\\\">\"},{\"line\":755,\"text\":\"<div class=\\\"block-body\\\">\"},{\"line\":756,\"text\":\"<xf:textarearow name=\\\"message\\\" required=\\\"required\\\" rows=\\\"6\\\"\"}],\"present\":true,\"sha256\":\"1a344bd306135486d2019bf0a5cafff5eb472882f7b3433ef13af4556a4c791e\"}}},\"guest_stderr_present\":false,\"inner_rc\":0,\"ok\":true,\"out_truncated\":false,\"transport_rc\":0,\"transport_stderr_bytes\":0,\"transport_stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\nGRAM516R2R3_DECISION=HOLD_STATUS_RU_OR_EDGE_EVIDENCE_INCOMPLETE\nGRAM516R2R3_NEXT_GATE=STOP_NO_MUTATION\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260918-GRAM-SUPPORT-STATUS-RU-EDGE-READONLY-516R2R3\",\"status\":\"FAIL\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n"
+ "output": "GRAM516R3_SAFE_REPORT={\"apply\":{\"err_truncated\":false,\"guest\":{\"backup_written\":true,\"changed\":true,\"changed_template_titles\":[\"gram_support_account\",\"gram_support_staff_queue\",\"gram_support_staff_ticket\",\"gram_support_ticket\"],\"dry_self_excluded_count\":0,\"dry_staff_count\":1,\"dry_staff_target_match\":true,\"error\":\"EXCEPTION_JSONDecodeError_Expecting value: line 1 column 1 (char 0)\",\"hash_entries_updated\":4,\"mode\":\"apply\",\"ok\":false,\"origin_pre\":{\"/\":\"301|https://codevipe.ru/\",\"/support/\":\"301|https://codevipe.ru/support/\",\"/support/create/\":\"301|https://codevipe.ru/support/create/\"},\"pre_error_max\":10,\"pre_tree_sha256\":\"f4021bfa4291e0837373f85e37523e1884579626aa83f1bbb9c3ae8a2dacb452\",\"rollback_restored\":true,\"rollback_started\":true,\"slug\":\"codevipe\",\"staff_target_exact\":true,\"status_labels_ru\":{\"CLOSED\":\"\\u0417\\u0430\\u043a\\u0440\\u044b\\u0442\",\"IN_PROGRESS\":\"\\u0412 \\u0440\\u0430\\u0431\\u043e\\u0442\\u0435\",\"NEW\":\"\\u041d\\u043e\\u0432\\u044b\\u0439\",\"RESOLVED\":\"\\u0420\\u0435\\u0448\\u0451\\u043d\",\"WAITING_USER\":\"\\u041e\\u0436\\u0438\\u0434\\u0430\\u0435\\u0442 \\u043e\\u0442\\u0432\\u0435\\u0442\\u0430 \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}},\"guest_stderr_present\":false,\"inner_rc\":3,\"ok\":false,\"out_truncated\":false,\"transport_rc\":0,\"transport_stderr_bytes\":0,\"transport_stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"post_edge\":{},\"post_edge_ok\":false,\"pre_edge\":{\"/\":{\"http\":\"200\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"/support/\":{\"http\":\"303\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},\"/support/create/\":{\"http\":\"200\",\"rc\":0,\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}},\"rollback_after_edge_failure\":null}\nGRAM516R3_DECISION=HOLD_CODEVIPE_EMAIL_STATUS_CANARY\nGRAM516R3_NEXT_GATE=STOP_REVIEW_NO_BLIND_RERUN\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}\n"
}
diff --git a/runtime/latest.txt b/runtime/latest.txt
index b496ffa6..cfcf0bc7 100644
--- a/runtime/latest.txt
+++ b/runtime/latest.txt
@@ -1,36 +1,36 @@
CHAT_OUTPUT_BEGIN
-COMMAND_ID=SUPPORT-260918-GRAM-SUPPORT-STATUS-RU-EDGE-READONLY-516R2R3
+COMMAND_ID=SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3
STATUS=FAIL
RC=3
HOST=pve01
-MODE=read-only
-COMPONENT=gram-support-status-ru-edge-readonly
+MODE=change
+COMPONENT=gram-support-email-status-ru-codevipe-canary
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
-COMMAND_SHA256=2676544fc2dd181e3bc5f4f98570fcd25c589e595ba573499830598b5bc5e3c2
+COMMAND_SHA256=aecc703169fc146cba88ed910c5adb0522c51820d3c46704544a4fd188665f1f
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
-CHANGE_DECLARED=false
+CHANGE_DECLARED=true
RESULT_CONTRACT_VALID=true
-RESULT_CONTRACT_STATUS=NOT_APPLICABLE
+RESULT_CONTRACT_STATUS=FAIL
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=3
-CHANGES_MADE=false
-ROLLBACK_STARTED=false
-ROLLBACK_RESTORED=null
-MUTATION_OUTCOME=NO_MUTATION
+CHANGES_MADE=true
+ROLLBACK_STARTED=true
+ROLLBACK_RESTORED=true
+MUTATION_OUTCOME=ROLLED_BACK
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
-RAW_EVIDENCE_SHA256=a6e5bf8138ec51c112870bac14c73eae060532447dea04c183fa92074870bb80
-SANITIZED_OUTPUT_SHA256=a6e5bf8138ec51c112870bac14c73eae060532447dea04c183fa92074870bb80
+RAW_EVIDENCE_SHA256=5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a
+SANITIZED_OUTPUT_SHA256=5ae84e8c8b9ddc0e0457cf494006c1fa805f73b9ff2a5c282cfa4f3b80989e2a
OUTPUT_BEGIN
-GRAM516R2R3_SAFE_REPORT={"edge_https":{"/":{"http":"200","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"/support/":{"http":"303","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"/support/create/":{"http":"200","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}},"edge_https_3of3_200":false,"err_truncated":false,"guest":{"error":null,"ok":true,"origin_http":{"/":"301|https://codevipe.ru/","/support/":"301|https://codevipe.ru/support/","/support/create/":"301|https://codevipe.ru/support/create/"},"runtime":{"addon_state":{"active":1,"version_id":1000120,"version_string":"1.0.0 Alpha 3 Unified Fix 10"},"error":null,"ok":true,"status_policy_constants":{"CLOSED":"CLOSED","IN_PROGRESS":"IN_PROGRESS","MAP":{"CLOSED":[],"IN_PROGRESS":["WAITING_USER","RESOLVED","CLOSED"],"NEW":["IN_PROGRESS","WAITING_USER","RESOLVED","CLOSED"],"RESOLVED":["IN_PROGRESS","CLOSED"],"WAITING_USER":["IN_PROGRESS","RESOLVED","CLOSED"]},"NEW":"NEW","RESOLVED":"RESOLVED","WAITING_USER":"WAITING_USER"},"status_policy_methods":["all","canTransition"]},"source":{"Pub/Controller/StaffSupport.php":{"line_count":178,"matched_context":[{"sep":true},{"line":4,"text":""},{"line":5,"text":"use Gram\\Support\\Notification\\EventDispatcher;"},{"line":6,"text":"use Gram\\Support\\Service\\Ticket\\Reply;"},{"line":7,"text":"use Gram\\Support\\Service\\Ticket\\StaffUpdate;"},{"line":8,"text":"use Gram\\Support\\Util\\StatusPolicy;"},{"line":9,"text":""},{"line":10,"text":"final class StaffSupport extends \\XF\\Pub\\Controller\\AbstractController"},{"line":11,"text":"{"},{"line":12,"text":"private function assertStaff(bool $manage = false): void"},{"sep":true},{"line":53,"text":"'gram_support_staff_ticket',"},{"line":54,"text":"["},{"line":55,"text":"'ticket' => $ticket,"},{"line":56,"text":"'messages' => $messages,"},{"line":57,"text":"'statusOptions' => StatusPolicy::all()"},{"line":58,"text":"]"},{"line":59,"text":");"},{"line":60,"text":"}"},{"line":61,"text":""},{"sep":true},{"line":92,"text":"$this->assertPostOnly();"},{"line":93,"text":"$this->assertStaff(true);"},{"line":94,"text":""},{"line":95,"text":"$ticket = $this->assertTicket();"},{"line":96,"text":"$newStatus = trim($this->filter('status', 'str'));"},{"line":97,"text":"$assignedUserId = (int)$this->filter('assigned_user_id', 'uint');"},{"line":98,"text":""},{"line":99,"text":"/** @var StaffUpdate $staffUpdate */"},{"line":100,"text":"$staffUpdate = $this->service(StaffUpdate::class);"},{"line":101,"text":"$staffUpdate->validateTransition((string)$ticket->status, $newStatus);"},{"line":102,"text":""},{"line":103,"text":"if ($assignedUserId > 0)"},{"line":104,"text":"{"},{"line":105,"text":"if (!\\XF::visitor()->hasPermission('gramSupport', 'assign'))"},{"sep":true},{"line":115,"text":"return $this->error(\\XF::phrase('gram_support_assignee_invalid'));"},{"line":116,"text":"}"},{"line":117,"text":"}"},{"line":118,"text":""},{"line":119,"text":"$oldStatus = (string)$ticket->status;"},{"line":120,"text":"$oldAssigned = (int)$ticket->assigned_user_id;"},{"line":121,"text":""},{"line":122,"text":"$db = \\XF::db();"},{"line":123,"text":"$db->beginTransaction();"},{"line":124,"text":""},{"line":125,"text":"try"},{"line":126,"text":"{"},{"line":127,"text":"$ticket->status = $newStatus;"},{"line":128,"text":"$ticket->assigned_user_id = $assignedUserId;"},{"line":129,"text":"$ticket->updated_date = \\XF::$time;"},{"line":130,"text":"$ticket->resolved_date = $newStatus === StatusPolicy::RESOLVED"},{"line":131,"text":"? \\XF::$time"},{"line":132,"text":": ($newStatus === StatusPolicy::CLOSED ? (int)$ticket->resolved_date : 0);"},{"line":133,"text":"$ticket->save();"},{"line":134,"text":""},{"line":135,"text":"$event = \\XF::em()->create('Gram\\Support:SupportEvent');"},{"line":136,"text":"$event->ticket_id = (int)$ticket->ticket_id;"},{"sep":true},{"line":139,"text":"$event->event_type = 'ticket_staff_updated';"},{"line":140,"text":"$event->event_date = \\XF::$time;"},{"line":141,"text":"$event->safe_payload_json = json_encode(["},{"line":142,"text":"'public_ref' => (string)$ticket->public_ref,"},{"line":143,"text":"'old_status' => $oldStatus,"},{"line":144,"text":"'new_status' => $newStatus,"},{"line":145,"text":"'old_assigned_user_id' => $oldAssigned,"},{"line":146,"text":"'new_assigned_user_id' => $assignedUserId,"},{"line":147,"text":"'is_internal' => false"},{"line":148,"text":"], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);"}],"present":true,"sha256":"6852bd0061d6e118851673bfd4099e2b22e6291bf09f429820740844996f93f9"},"Util/StatusPolicy.php":{"line_count":29,"matched_context":[{"sep":true},{"line":1,"text":" [self::IN_PROGRESS, self::WAITING_USER, self::RESOLVED, self::CLOSED],"},{"line":14,"text":"self::IN_PROGRESS => [self::WAITING_USER, self::RESOLVED, self::CLOSED],"},{"line":15,"text":"self::WAITING_USER => [self::IN_PROGRESS, self::RESOLVED, self::CLOSED],"},{"line":16,"text":"self::RESOLVED => [self::IN_PROGRESS, self::CLOSED],"},{"line":17,"text":"self::CLOSED => []"},{"line":18,"text":"];"},{"line":19,"text":""},{"line":20,"text":"public static function canTransition(string $from, string $to): bool"},{"line":21,"text":"{"},{"line":22,"text":"return $from === $to || in_array($to, self::MAP[$from] ?? [], true);"},{"line":23,"text":"}"},{"line":24,"text":""}],"present":true,"sha256":"356f4b24d4b2a562105d3c7cc4f83ce198be11d15770c71ec2bf1d9ca43310f7"},"_data/phrases.xml":{"line_count":57,"matched_context":[{"sep":true},{"line":16,"text":"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)"},{"line":17,"text":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435"},{"line":18,"text":"\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043e"},{"line":19,"text":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u041e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0435\u043a\u0440\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044e."},{"line":20,"text":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435"},{"line":21,"text":"\u0421\u0442\u0430\u0442\u0443\u0441"},{"line":22,"text":"\u041e\u0442\u0432\u0435\u0442"},{"line":23,"text":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c"},{"line":24,"text":"\u041c\u043e\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f"},{"line":25,"text":"\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442."},{"sep":true},{"line":28,"text":"\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430"},{"line":29,"text":"ID \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430"},{"line":30,"text":"\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d."},{"line":31,"text":"\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435."},{"line":32,"text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},{"line":33,"text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d"},{"line":34,"text":"\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0442\u0438. \u0414\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u043e\u0444\u043b\u0430\u0439\u043d \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f."},{"line":35,"text":"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f {public_ref}"},{"line":36,"text":"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f {public_ref}"}],"present":true,"sha256":"ea6e84de301145312758285cfcd63ee4c12b8e921877bcde15c17dd4c115c434"},"_data/templates.xml":{"line_count":781,"matched_context":[{"sep":true},{"line":475,"text":"<div class=\"block-row\">"},{"line":476,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":477,"text":"{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}"},{"line":478,"text":"</a>"},{"line":479,"text":"<span class=\"u-muted\">{{ $ticket.status }}</span>"},{"line":480,"text":"</div>"},{"line":481,"text":"<xf:else />"},{"line":482,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"},{"line":483,"text":"</xf:foreach>"},{"sep":true},{"line":564,"text":"<div class=\"block-row\">"},{"line":565,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":566,"text":"{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}"},{"line":567,"text":"</a>"},{"line":568,"text":"<span class=\"u-muted\">{{ $ticket.status }}</span>"},{"line":569,"text":"</div>"},{"line":570,"text":"</xf:foreach>"},{"line":571,"text":"</div>"},{"line":572,"text":"</div>"},{"sep":true},{"line":700,"text":""},{"line":701,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":702,"text":"<div class=\"block-container\">"},{"line":703,"text":"<div class=\"block-body\">"},{"line":704,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":705,"text":"<xf:foreach loop=\"$statusOptions\" value=\"$status\">"},{"line":706,"text":"<xf:option value=\"{$status}\">{$status}</xf:option>"},{"line":707,"text":"</xf:foreach>"},{"line":708,"text":"</xf:selectrow>"},{"line":709,"text":"<xf:textboxrow name=\"assigned_user_id\" type=\"number\" value=\"{$ticket.assigned_user_id}\""},{"sep":true},{"line":720,"text":"<div class=\"block-container\">"},{"line":721,"text":"<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>"},{"line":722,"text":"<div class=\"block-body\">"},{"line":723,"text":"<div class=\"block-row\">"},{"line":724,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":725,"text":"</div>"},{"line":726,"text":"<xf:foreach loop=\"$messages\" value=\"$message\">"},{"line":727,"text":"<div class=\"block-row gramSupport-message\">"},{"line":728,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"sep":true},{"line":748,"text":"</div>"},{"line":749,"text":"</div>"},{"line":750,"text":"</xf:if>"},{"line":751,"text":""},{"line":752,"text":"<xf:if is=\"$ticket.status != 'CLOSED'\">"},{"line":753,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":754,"text":"<div class=\"block-container\">"},{"line":755,"text":"<div class=\"block-body\">"},{"line":756,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\""}],"present":true,"sha256":"1a344bd306135486d2019bf0a5cafff5eb472882f7b3433ef13af4556a4c791e"}}},"guest_stderr_present":false,"inner_rc":0,"ok":true,"out_truncated":false,"transport_rc":0,"transport_stderr_bytes":0,"transport_stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}
-GRAM516R2R3_DECISION=HOLD_STATUS_RU_OR_EDGE_EVIDENCE_INCOMPLETE
-GRAM516R2R3_NEXT_GATE=STOP_NO_MUTATION
-HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260918-GRAM-SUPPORT-STATUS-RU-EDGE-READONLY-516R2R3","status":"FAIL","changes_made":false,"rollback_started":false,"rollback_restored":null}
+GRAM516R3_SAFE_REPORT={"apply":{"err_truncated":false,"guest":{"backup_written":true,"changed":true,"changed_template_titles":["gram_support_account","gram_support_staff_queue","gram_support_staff_ticket","gram_support_ticket"],"dry_self_excluded_count":0,"dry_staff_count":1,"dry_staff_target_match":true,"error":"EXCEPTION_JSONDecodeError_Expecting value: line 1 column 1 (char 0)","hash_entries_updated":4,"mode":"apply","ok":false,"origin_pre":{"/":"301|https://codevipe.ru/","/support/":"301|https://codevipe.ru/support/","/support/create/":"301|https://codevipe.ru/support/create/"},"pre_error_max":10,"pre_tree_sha256":"f4021bfa4291e0837373f85e37523e1884579626aa83f1bbb9c3ae8a2dacb452","rollback_restored":true,"rollback_started":true,"slug":"codevipe","staff_target_exact":true,"status_labels_ru":{"CLOSED":"\u0417\u0430\u043a\u0440\u044b\u0442","IN_PROGRESS":"\u0412 \u0440\u0430\u0431\u043e\u0442\u0435","NEW":"\u041d\u043e\u0432\u044b\u0439","RESOLVED":"\u0420\u0435\u0448\u0451\u043d","WAITING_USER":"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f"}},"guest_stderr_present":false,"inner_rc":3,"ok":false,"out_truncated":false,"transport_rc":0,"transport_stderr_bytes":0,"transport_stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"post_edge":{},"post_edge_ok":false,"pre_edge":{"/":{"http":"200","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"/support/":{"http":"303","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"/support/create/":{"http":"200","rc":0,"stderr_bytes":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}},"rollback_after_edge_failure":null}
+GRAM516R3_DECISION=HOLD_CODEVIPE_EMAIL_STATUS_CANARY
+GRAM516R3_NEXT_GATE=STOP_REVIEW_NO_BLIND_RERUN
+HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260918-GRAM-SUPPORT-EMAIL-STATUS-RU-CODEVIPE-CANARY-516R3","status":"FAIL","changes_made":true,"rollback_started":true,"rollback_restored":true}
OUTPUT_END
CHAT_OUTPUT_END