diff --git a/runtime/history/SUPPORT-260918-GRAM-XF-CODEVIPE-POST-513R3-RECONCILIATION-513R3R1.json b/runtime/history/SUPPORT-260918-GRAM-XF-CODEVIPE-POST-513R3-RECONCILIATION-513R3R1.json new file mode 100644 index 00000000..7e64f8d8 --- /dev/null +++ b/runtime/history/SUPPORT-260918-GRAM-XF-CODEVIPE-POST-513R3-RECONCILIATION-513R3R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260918-GRAM-XF-CODEVIPE-POST-513R3-RECONCILIATION-513R3R1", + "status": "FAIL", + "rc": 3, + "host": "pve01", + "mode": "read-only", + "component": "gram-support-codevipe-post-513r3-reconciliation-ui-source-audit", + "started_at_utc": "2026-09-18T01:21:34Z", + "finished_at_utc": "2026-09-18T01:21:36Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "3ca37a22b0da8e6d22c78219d49f91b2547ac41d7ab53e10e5c777796298572c", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 3, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "e3c96e1bf1de6dcc1679ff9c1930c56dd4df6b908e08d489cebd0b421eeda746", + "sanitized_output_sha256": "e3c96e1bf1de6dcc1679ff9c1930c56dd4df6b908e08d489cebd0b421eeda746", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "GRAM513R3R1_WRAPPER_BEGIN=true\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nGRAM513R3R1_SAFE_REPORT={\"artifact_sha256\":\"2e31f89d3626a83c1211910aa6fd279cc04689b75ba822899952865085cf551e\",\"codevipe\":{\"ok\":true,\"state\":{\"addon\":null,\"counts\":{\"xf_content_type_field\":0,\"xf_code_event_listener\":0,\"xf_option\":0,\"xf_option_group\":0,\"xf_permission\":0,\"xf_permission_interface_group\":0,\"xf_phrase\":0,\"xf_route\":0,\"xf_template\":0,\"xf_template_modification\":0},\"support_tables\":[\"xf_gram_support_attachment_meta\",\"xf_gram_support_delivery\",\"xf_gram_support_event\",\"xf_gram_support_message\",\"xf_gram_support_rate_limit\",\"xf_gram_support_ticket\"],\"routes\":[],\"options\":[],\"permission_entries\":[],\"jobs\":[{\"job_id\":4,\"execute_class\":\"XF\\\\Job\\\\Cron\",\"manual_execute\":0},{\"job_id\":50,\"execute_class\":\"XF\\\\Job\\\\UpgradeCheck\",\"manual_execute\":0}],\"job_count\":2,\"support_job_count\":0,\"error_max\":0,\"recent_errors\":[],\"board_active\":\"1\",\"board_url\":\"https://codevipe.ru\"},\"manifest\":{\"file_count\":59,\"combined_sha256\":\"c49c44a866b3e91224cade4c43d9a4594537fc1530ba54333cb959f3afe12a32\",\"addon_files\":51,\"outside_files\":8},\"backup\":{\"exists\":true,\"files\":[\"SEALED\",\"SHA256SUMS\",\"database-pre.sql.gz\",\"prestate.json\",\"support-source-pre.tar.gz\"]},\"effective_prestate\":false},\"http\":{\"home\":{\"rc\":0,\"code\":\"200\",\"stderr_sha256\":null},\"support\":{\"rc\":0,\"code\":\"404\",\"stderr_sha256\":null}},\"fix10_ui_sources\":[{\"path\":\"upload/src/addons/Gram/Support/Attachment/TicketHandler.php\",\"sha256\":\"0def74cda843a56cdea03a8f9c40156a86424de6a09ce64ced655e5f0458361a\",\"hits\":3,\"snippets\":[{\"line\":30,\"text\":\"\\n return (bool)$visitor->user_id\\n && $visitor->hasPermission('gramSupport', 'internalNotes')\\n && (\\n $visitor->hasPermission('gramSupport', 'viewAll')\"},{\"line\":32,\"text\":\" && $visitor->hasPermission('gramSupport', 'internalNotes')\\n && (\\n $visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage')\\n );\"},{\"line\":33,\"text\":\" && (\\n $visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage')\\n );\\n }\"}]},{\"path\":\"upload/src/addons/Gram/Support/Listener/SourcePageContext.php\",\"sha256\":\"25e449317b7b48959aad49e1b73f785c84d0e14bd9d6fa55d7e3cb8ac074b253\",\"hits\":1,\"snippets\":[{\"line\":11,\"text\":\"final class SourcePageContext\\n{\\n private const SESSION_KEY = 'gramSupportSourceContext';\\n private const MAX_AGE = 600;\\n\"}]},{\"path\":\"upload/src/addons/Gram/Support/Notification/AlertConsumer.php\",\"sha256\":\"e22d0cdb0a0806c6a231504409bd17cd781caab0f28181aff7246b0295d8cd98\",\"hits\":2,\"snippets\":[{\"line\":27,\"text\":\" // Never alert a user about a ticket they cannot access.\\n $isOwner = $ticket->user_id && (int)$ticket->user_id === (int)$recipient->user_id;\\n $isStaff = $recipient->hasPermission('gramSupport', 'viewAll')\\n || $recipient->hasPermission('gramSupport', 'manage');\\n\"},{\"line\":28,\"text\":\" $isOwner = $ticket->user_id && (int)$ticket->user_id === (int)$recipient->user_id;\\n $isStaff = $recipient->hasPermission('gramSupport', 'viewAll')\\n || $recipient->hasPermission('gramSupport', 'manage');\\n\\n if (!$isOwner && !$isStaff)\"}]},{\"path\":\"upload/src/addons/Gram/Support/Notification/Dispatcher.php\",\"sha256\":\"a043d94bc91feeed0969ad218566cebac76b2d804e7c69cc2b87b94d42f5bb85\",\"hits\":2,\"snippets\":[{\"line\":58,\"text\":\" }\\n\\n if (!$staff->hasPermission('gramSupport', 'viewAll')\\n && !$staff->hasPermission('gramSupport', 'manage'))\\n {\"},{\"line\":59,\"text\":\"\\n if (!$staff->hasPermission('gramSupport', 'viewAll')\\n && !$staff->hasPermission('gramSupport', 'manage'))\\n {\\n continue;\"}]},{\"path\":\"upload/src/addons/Gram/Support/Pub/Controller/AccountSupport.php\",\"sha256\":\"236e648a240a3bde2721f3d9355ce0c48f81a0b727407e08cbaa563ae2df1dfd\",\"hits\":2,\"snippets\":[{\"line\":12,\"text\":\" {\\n $visitor = \\\\XF::visitor();\\n if (!$visitor->user_id || !$visitor->hasPermission('gramSupport', 'viewOwn'))\\n {\\n return $this->noPermission();\"},{\"line\":31,\"text\":\" {\\n $visitor = \\\\XF::visitor();\\n if (!$visitor->user_id || !$visitor->hasPermission('gramSupport', 'viewOwn'))\\n {\\n return $this->noPermission();\"}]},{\"path\":\"upload/src/addons/Gram/Support/Pub/Controller/Pwa.php\",\"sha256\":\"9e3217d9524349a8137b89d418e4693ca17f8e5f61ba5b563fff747d1014efb3\",\"hits\":2,\"snippets\":[{\"line\":12,\"text\":\"\\n if (!$visitor->user_id\\n || (!$visitor->hasPermission('gramSupport', 'manage')\\n && !$visitor->hasPermission('gramSupport', 'viewAll')))\\n {\"},{\"line\":13,\"text\":\" if (!$visitor->user_id\\n || (!$visitor->hasPermission('gramSupport', 'manage')\\n && !$visitor->hasPermission('gramSupport', 'viewAll')))\\n {\\n throw $this->exception($this->noPermission());\"}]},{\"path\":\"upload/src/addons/Gram/Support/Pub/Controller/StaffSupport.php\",\"sha256\":\"6852bd0061d6e118851673bfd4099e2b22e6291bf09f429820740844996f93f9\",\"hits\":7,\"snippets\":[{\"line\":17,\"text\":\"\\n $allowed = $manage\\n ? $visitor->hasPermission('gramSupport', 'manage')\\n : ($visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage'));\"},{\"line\":18,\"text\":\" $allowed = $manage\\n ? $visitor->hasPermission('gramSupport', 'manage')\\n : ($visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage'));\\n\"},{\"line\":19,\"text\":\" ? $visitor->hasPermission('gramSupport', 'manage')\\n : ($visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage'));\\n\\n if (!$visitor->user_id || !$allowed)\"},{\"line\":71,\"text\":\"\\n if ($isInternal\\n && !\\\\XF::visitor()->hasPermission('gramSupport', 'internalNotes'))\\n {\\n return $this->noPermission();\"},{\"line\":105,\"text\":\" if ($assignedUserId > 0)\\n {\\n if (!\\\\XF::visitor()->hasPermission('gramSupport', 'assign'))\\n {\\n return $this->noPermission();\"},{\"line\":112,\"text\":\" $assigned = \\\\XF::em()->find('XF:User', $assignedUserId);\\n if (!$assigned\\n || (!$assigned->hasPermission('gramSupport', 'viewAll')\\n && !$assigned->hasPermission('gramSupport', 'manage')))\\n {\"},{\"line\":113,\"text\":\" if (!$assigned\\n || (!$assigned->hasPermission('gramSupport', 'viewAll')\\n && !$assigned->hasPermission('gramSupport', 'manage')))\\n {\\n return $this->error(\\\\XF::phrase('gram_support_assignee_invalid'));\"}]},{\"path\":\"upload/src/addons/Gram/Support/Pub/Controller/Support.php\",\"sha256\":\"6cb34b1d27e9f0132263637cefa62fe0e998a9a86620b7ac33199f41ee86f9d4\",\"hits\":2,\"snippets\":[{\"line\":31,\"text\":\" $visitor = \\\\XF::visitor();\\n\\n if ($visitor->user_id && !$visitor->hasPermission('gramSupport', 'create'))\\n {\\n return $this->noPermission();\"},{\"line\":198,\"text\":\" {\\n if ((int)$ticket->user_id !== (int)$visitor->user_id\\n || !$visitor->hasPermission('gramSupport', 'replyOwn'))\\n {\\n return $this->noPermission();\"}]},{\"path\":\"upload/src/addons/Gram/Support/Security/GuestTicketSession.php\",\"sha256\":\"9637043a10b7f2806c50ee9da04ea076d25a6924d7636b0533a2ea59212975e1\",\"hits\":1,\"snippets\":[{\"line\":9,\"text\":\"final class GuestTicketSession\\n{\\n private const KEY = 'gramSupportGuestTickets';\\n\\n public static function grant(Ticket $ticket): void\"}]},{\"path\":\"upload/src/addons/Gram/Support/Security/TicketAccess.php\",\"sha256\":\"f486abd65893052dbaafad550ad0d147ba638661e0e7ed73d7e2b3e046bec4a5\",\"hits\":5,\"snippets\":[{\"line\":12,\"text\":\" public static function canView(Ticket $ticket, User $visitor): bool\\n {\\n if ($visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage'))\\n {\"},{\"line\":13,\"text\":\" {\\n if ($visitor->hasPermission('gramSupport', 'viewAll')\\n || $visitor->hasPermission('gramSupport', 'manage'))\\n {\\n return true;\"},{\"line\":22,\"text\":\" && (int)$ticket->user_id === (int)$visitor->user_id)\\n {\\n return $visitor->hasPermission('gramSupport', 'viewOwn');\\n }\\n\"},{\"line\":35,\"text\":\" public static function canManageAttachments(Ticket $ticket, User $visitor): bool\\n {\\n if ($visitor->hasPermission('gramSupport', 'manage'))\\n {\\n return true;\"},{\"line\":44,\"text\":\" && (int)$ticket->user_id === (int)$visitor->user_id)\\n {\\n return $visitor->hasPermission('gramSupport', 'replyOwn');\\n }\\n\"}]},{\"path\":\"upload/src/addons/Gram/Support/Util/SiteConfig.php\",\"sha256\":\"db246e35b477c55d4fb1d464b0de0829a91e09ed42058bf704d667ae7b23e3b8\",\"hits\":4,\"snippets\":[{\"line\":9,\"text\":\" public static function siteId(): string\\n {\\n $siteId = trim((string)\\\\XF::options()->gramSupportSiteId);\\n if ($siteId === '')\\n {\"},{\"line\":19,\"text\":\" public static function guestTokenTtlSeconds(): int\\n {\\n $days = max(1, min(365, (int)\\\\XF::options()->gramSupportGuestTokenTtlDays));\\n return $days * 86400;\\n }\"},{\"line\":25,\"text\":\" public static function guestRateLimitCount(): int\\n {\\n return max(1, min(100, (int)\\\\XF::options()->gramSupportGuestRateLimitCount));\\n }\\n\"},{\"line\":30,\"text\":\" public static function guestRateLimitWindowSeconds(): int\\n {\\n return max(60, min(86400, (int)\\\\XF::options()->gramSupportGuestRateLimitWindowSeconds));\\n }\\n}\"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/option_groups.xml\",\"sha256\":\"357e532805c40e424fec654349241ecb322e1cb8ee2560f9abb964f10a55cdda\",\"hits\":1,\"snippets\":[{\"line\":3,\"text\":\"\\n\\n \\n\"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/options.xml\",\"sha256\":\"499d0a3b543eb838d5497f2da1b0cd13e5510e9f7e10aded7b06cb422cab8143\",\"hits\":8,\"snippets\":[{\"line\":3,\"text\":\"\\n\\n \"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/permission_interface_groups.xml\",\"sha256\":\"f54be0d872f43813e0f57d75a73420da70d37091f408d3cbdf9e943d4f67c1ad\",\"hits\":1,\"snippets\":[{\"line\":3,\"text\":\"\\n\\n \\n\"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/permissions.xml\",\"sha256\":\"c0cf9d60702b670355f3f0928e0afde20a5c7becf065536c3487289211a4bbee\",\"hits\":9,\"snippets\":[{\"line\":3,\"text\":\"\\n\\n \\n \\n \"},{\"line\":4,\"text\":\"\\n \\n \\n \\n \"},{\"line\":5,\"text\":\" \\n \\n \\n \\n \"},{\"line\":6,\"text\":\" \\n \\n \\n \\n \"},{\"line\":7,\"text\":\" \\n \\n \\n \\n \"},{\"line\":8,\"text\":\" \\n \\n \\n \\n \"},{\"line\":9,\"text\":\" \\n \\n \\n \\n \"},{\"line\":10,\"text\":\" \\n \\n \\n \\n\"},{\"line\":11,\"text\":\" \\n \\n \\n\"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/phrases.xml\",\"sha256\":\"ea6e84de301145312758285cfcd63ee4c12b8e921877bcde15c17dd4c115c434\",\"hits\":17,\"snippets\":[{\"line\":40,\"text\":\" В обращении {public_ref} есть обновление. Откройте страницу доступа: {access_url}\\n Вложения\\n Gram Support\\n Настройки Gram Support\\n Gram Support\"},{\"line\":41,\"text\":\" Вложения\\n Gram Support\\n Настройки Gram Support\\n Gram Support\\n ID сайта Gram Support\"},{\"line\":42,\"text\":\" Gram Support\\n Настройки Gram Support\\n Gram Support\\n ID сайта Gram Support\\n Уникальный серверный идентификатор сайта, например NF или KOW.\"},{\"line\":43,\"text\":\" Настройки Gram Support\\n Gram Support\\n ID сайта Gram Support\\n Уникальный серверный идентификатор сайта, например NF или KOW.\\n Срок действия гостевого кода, дней\"},{\"line\":44,\"text\":\" Gram Support\\n ID сайта Gram Support\\n Уникальный серверный идентификатор сайта, например NF или KOW.\\n Срок действия гостевого кода, дней\\n Лимит гостевых обращений за окно\"},{\"line\":45,\"text\":\" ID сайта Gram Support\\n Уникальный серверный идентификатор сайта, например NF или KOW.\\n Срок действия гостевого кода, дней\\n Лимит гостевых обращений за окно\\n Окно лимита гостевых обращений, секунд\"},{\"line\":46,\"text\":\" Уникальный серверный идентификатор сайта, например NF или KOW.\\n Срок действия гостевого кода, дней\\n Лимит гостевых обращений за окно\\n Окно лимита гостевых обращений, секунд\\n Просмотр поддержки\"},{\"line\":47,\"text\":\" Срок действия гостевого кода, дней\\n Лимит гостевых обращений за окно\\n Окно лимита гостевых обращений, секунд\\n Просмотр поддержки\\n Создание обращений\"},{\"line\":48,\"text\":\" Лимит гостевых обращений за окно\\n Окно лимита гостевых обращений, секунд\\n Просмотр поддержки\\n Создание обращений\\n Просмотр своих обращений\"},{\"line\":49,\"text\":\" Окно лимита гостевых обращений, секунд\\n Просмотр поддержки\\n Создание обращений\\n Просмотр своих обращений\\n Ответ в своих обращениях\"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/template_modifications.xml\",\"sha256\":\"04f338a8107a80bd3c17b6f6888faea596a5057140556ce6f4f1673d2034628b\",\"hits\":4,\"snippets\":[{\"line\":3,\"text\":\"\\n\\n \\n <div class=\\\"p-footer-row-opposite\\\">\\n <xf:include template=\\\"gram_support_launcher\\\" />\"},{\"line\":4,\"text\":\"\\n \\n <div class=\\\"p-footer-row-opposite\\\">\\n <xf:include template=\\\"gram_support_launcher\\\" />\\n<div class=\\\"p-footer-row-opposite\\\">\"},{\"line\":5,\"text\":\" \\n <div class=\\\"p-footer-row-opposite\\\">\\n <xf:include template=\\\"gram_support_launcher\\\" />\\n<div class=\\\"p-footer-row-opposite\\\">\\n \"},{\"line\":6,\"text\":\" <div class=\\\"p-footer-row-opposite\\\">\\n <xf:include template=\\\"gram_support_launcher\\\" />\\n<div class=\\\"p-footer-row-opposite\\\">\\n \\n\"}]},{\"path\":\"upload/src/addons/Gram/Support/_data/templates.xml\",\"sha256\":\"d719aeb2586cf76679d956b50556de65ea6d510b3891ff5437fe8c96a86ecdcf\",\"hits\":61,\"snippets\":[{\"line\":9,\"text\":\"</xf:macro>\\n\\n \n \\n \n