CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260918-GRAM-XF-CODEVIPE-PARTIAL-STATE-INSTALLABILITY-RCA-513R3R2
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=gram-support-codevipe-partial-state-installability-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=2007a08bdd3a7e3c5541e130c8f14d46a334da28d493dc7aaa74707f6ed4d2b7
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=f8164218838f14dc4258bebe0143a275376e0dd5cd30c7c34d38151d3b94a72d
SANITIZED_OUTPUT_SHA256=f8164218838f14dc4258bebe0143a275376e0dd5cd30c7c34d38151d3b94a72d
OUTPUT_BEGIN
GRAM513R3R2_WRAPPER_BEGIN=true
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
GRAM513R3R2_SAFE_REPORT={"artifact":{"sha256":"2e31f89d3626a83c1211910aa6fd279cc04689b75ba822899952865085cf551e","version_id":1000120,"version_string":"1.0.0 Alpha 3 Unified Fix 10","setup_sha256":"4977f90ec0444e2e3a1e4ee9b79a4e88098c5a3ae37b30d63e77cff2e1fcb971","template_modifications_sha256":"04f338a8107a80bd3c17b6f6888faea596a5057140556ce6f4f1673d2034628b"},"setup_hits":[{"line":15,"text":"public function installStep1(): void","context":"    use StepRunnerUninstallTrait;\\n\\n    public function installStep1(): void\\n    {\\n        $sm = $this->schemaManager();\\n        $sm->createTable('xf_gram_support_ticket', function($table) {"},{"line":17,"text":"$sm = $this->schemaManager();","context":"    public function installStep1(): void\\n    {\\n        $sm = $this->schemaManager();\\n        $sm->createTable('xf_gram_support_ticket', function($table) {\\n            $table->addColumn('ticket_id', 'int')->unsigned()->autoIncrement();\\n            $table->addColumn('public_ref', 'varchar', 64);"},{"line":18,"text":"$sm->createTable('xf_gram_support_ticket', function($table) {","context":"    {\\n        $sm = $this->schemaManager();\\n        $sm->createTable('xf_gram_support_ticket', function($table) {\\n            $table->addColumn('ticket_id', 'int')->unsigned()->autoIncrement();\\n            $table->addColumn('public_ref', 'varchar', 64);\\n            $table->addColumn('site_id', 'varchar', 32);"},{"line":44,"text":"$sm->createTable('xf_gram_support_message', function($table) {","context":"            $table->addKey(['site_id','status','updated_date'], 'site_status_updated');\\n        });\\n        $sm->createTable('xf_gram_support_message', function($table) {\\n            $table->addColumn('message_id', 'int')->unsigned()->autoIncrement();\\n            $table->addColumn('ticket_id', 'int')->unsigned();\\n            $table->addColumn('user_id', 'int')->unsigned()->setDefault(0);"},{"line":56,"text":"$sm->createTable('xf_gram_support_event', function($table) {","context":"            $table->addKey(['ticket_id','is_internal','message_date'], 'ticket_public_date');\\n        });\\n        $sm->createTable('xf_gram_support_event', function($table) {\\n            $table->addColumn('event_id', 'int')->unsigned()->autoIncrement();\\n            $table->addColumn('ticket_id', 'int')->unsigned();\\n            $table->addColumn('site_id', 'varchar', 32);"},{"line":68,"text":"$sm->createTable('xf_gram_support_attachment_meta', function($table) {","context":"        });\\n\\n        $sm->createTable('xf_gram_support_attachment_meta', function($table) {\\n            $table->addColumn('attachment_id', 'int')->unsigned();\\n            $table->addColumn('ticket_id', 'int')->unsigned();\\n            $table->addColumn('message_id', 'int')->unsigned()->setDefault(0);"},{"line":78,"text":"$sm->createTable('xf_gram_support_delivery', function($table) {","context":"            $table->addKey('message_id');\\n        });\\n        $sm->createTable('xf_gram_support_delivery', function($table) {\\n            $table->addColumn('delivery_key', 'char', 64);\\n            $table->addColumn('event_id', 'int')->unsigned();\\n            $table->addColumn('consumer', 'varchar', 32);"},{"line":94,"text":"$sm->createTable('xf_gram_support_rate_limit', function($table) {","context":"            $table->addKey(['state','lease_expires'], 'state_lease');\\n        });\\n        $sm->createTable('xf_gram_support_rate_limit', function($table) {\\n            $table->addColumn('rate_key', 'char', 64);\\n            $table->addColumn('window_start', 'int')->unsigned();\\n            $table->addColumn('hit_count', 'int')->unsigned()->setDefault(0);"},{"line":104,"text":"public function uninstallStep1(): void","context":"    }\\n\\n    public function uninstallStep1(): void\\n    {\\n        $sm = $this->schemaManager();\\n        foreach (['xf_gram_support_attachment_meta','xf_gram_support_delivery','xf_gram_support_rate_limit','xf_gram_support_event','xf_gram_support_message','xf_gram_support_ticket'] as $name) {"},{"line":106,"text":"$sm = $this->schemaManager();","context":"    public function uninstallStep1(): void\\n    {\\n        $sm = $this->schemaManager();\\n        foreach (['xf_gram_support_attachment_meta','xf_gram_support_delivery','xf_gram_support_rate_limit','xf_gram_support_event','xf_gram_support_message','xf_gram_support_ticket'] as $name) {\\n            $sm->dropTable($name);\\n        }"},{"line":108,"text":"$sm->dropTable($name);","context":"        $sm = $this->schemaManager();\\n        foreach (['xf_gram_support_attachment_meta','xf_gram_support_delivery','xf_gram_support_rate_limit','xf_gram_support_event','xf_gram_support_message','xf_gram_support_ticket'] as $name) {\\n            $sm->dropTable($name);\\n        }\\n    }\\n}"}],"templates":{"gram_support.less":{"version_id":"1000100","version_string":"1.0.0 Alpha 3 Unified Fix 8","content":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n\n/* gram-support-footer-center-v1 */\n.gramSupport-launcher\n{\n    position: static;\n    inset: auto;\n    z-index: auto;\n    flex: 1 1 auto;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: auto;\n    max-width: none;\n    padding: 5px 18px;\n}\n\n.gramSupport-launcher .button.button--primary\n{\n    position: relative;\n    overflow: hidden;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-width: 220px;\n    min-height: 52px;\n    padding: 11px 24px;\n    border: 1px solid rgba(255, 213, 122, .78);\n    border-radius: 14px;\n    color: #fff1c4;\n    background-image:\n        linear-gradient(110deg, transparent 0%, transparent 43%, rgba(255, 255, 255, .42) 50%, transparent 57%, transparent 100%),\n        linear-gradient(135deg, #533100 0%, #9a6208 24%, #d8a63a 48%, #a76d0b 70%, #4a2b00 100%);\n    background-size: 260% 100%, 100% 100%;\n    background-position: 180% 0, 0 0;\n    box-shadow: inset 0 0 0 1px rgba(255, 246, 210, .12), 0 0 22px rgba(220, 166, 49, .38), 0 9px 26px rgba(0, 0, 0, .30);\n    text-shadow: 0 1px 1px rgba(0, 0, 0, .45);\n    animation: gramSupportFooterShimmer 4.8s ease-in-out infinite;\n    transition: transform .18s ease, box-shadow .18s ease, filter .18s ease;\n}\n\n.gramSupport-launcher .button.button--primary:hover,\n.gramSupport-launcher .button.button--primary:focus-visible\n{\n    filter: brightness(1.10) saturate(1.08);\n    transform: translateY(-1px);\n    box-shadow: inset 0 0 0 1px rgba(255, 249, 224, .20), 0 0 28px rgba(235, 184, 67, .50), 0 11px 30px rgba(0, 0, 0, .34);\n}\n\n.gramSupport-launcher .button-text\n{\n    position: relative;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 10px;\n    font-size: 17px;\n    font-weight: 600;\n    letter-spacing: .01em;\n}\n\n.gramSupport-launcher .button-text::before\n{\n    content: \"\";\n    flex: 0 0 auto;\n    width: 20px;\n    height: 16px;\n    box-sizing: border-box;\n    border: 2px solid currentColor;\n    border-bottom: 0;\n    border-radius: 12px 12px 0 0;\n}\n\n.gramSupport-launcher .button-text::after\n{\n    content: \"\";\n    position: absolute;\n    left: 0;\n    top: 50%;\n    width: 4px;\n    height: 8px;\n    border-radius: 3px;\n    background: currentColor;\n    box-shadow: 16px 0 0 currentColor;\n    transform: translateY(-5%);\n}\n\n@keyframes gramSupportFooterShimmer\n{\n    0%, 56% { background-position: 180% 0, 0 0; }\n    82%, 100% { background-position: -80% 0, 0 0; }\n}\n\n@media (max-width: 650px)\n{\n    .p-footer-row\n    {\n        flex-wrap: wrap;\n    }\n\n    .gramSupport-launcher\n    {\n        order: 3;\n        flex: 0 0 100%;\n        width: 100%;\n        max-width: none;\n        padding: 10px 0 2px;\n    }\n\n    .gramSupport-launcher .button.button--primary\n    {\n        width: calc(100% - 32px);\n        max-width: 320px;\n    }\n}\n\n@media (prefers-reduced-motion: reduce)\n{\n    .gramSupport-launcher .button.button--primary\n    {\n        animation: none;\n        transition: none;\n    }\n}\n\n/* gram-support-footer-align-v2 */\n@media (min-width: 901px)\n{\n    .p-footer-row\n    {\n        position: relative;\n        min-height: 64px;\n    }\n\n    .gramSupport-launcher\n    {\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        right: auto;\n        bottom: auto;\n        inset: auto;\n        transform: translate(-50%, -50%);\n        flex: 0 0 auto;\n        width: auto;\n        max-width: none;\n        padding: 0;\n        margin: 0;\n        z-index: 2;\n    }\n}\n\n@media (max-width: 900px)\n{\n    .p-footer-row\n    {\n        flex-wrap: wrap;\n    }\n\n    .gramSupport-launcher\n    {\n        position: static;\n        inset: auto;\n        transform: none;\n        order: 3;\n        flex: 0 0 100%;\n        width: 100%;\n        max-width: none;\n        padding: 10px 0 2px;\n        margin: 0;\n        z-index: auto;\n    }\n\n    .gramSupport-launcher .button.button--primary\n    {\n        width: calc(100% - 32px);\n        max-width: 320px;\n    }\n}\n\n/* gram-support-footer-align-v3-mobile-center */\n@media (max-width: 900px)\n{\n    .gramSupport-launcher\n    {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        text-align: center;\n    }\n\n    .gramSupport-launcher .button.button--primary\n    {\n        margin-left: auto;\n        margin-right: auto;\n    }\n}\n\n/* gram-support-footer-align-v4-desktop-inset */\n@media (min-width: 901px)\n{\n    .gramSupport-launcher\n    {\n        inset: 50% auto auto 50%;\n        transform: translate(-50%, -50%);\n    }\n}\n\n/* gram-support-footer-align-v5-gap-grid */\n@media (min-width: 901px)\n{\n    .p-footer-row\n    {\n        display: grid;\n        grid-template-columns: max-content minmax(0, 1fr) max-content;\n        align-items: center;\n        column-gap: 16px;\n    }\n\n    .p-footer-row-main\n    {\n        grid-column: 1;\n        min-width: 0;\n    }\n\n    .p-footer-row > .gramSupport-launcher\n    {\n        grid-column: 2;\n        grid-row: 1;\n        position: static;\n        inset: auto;\n        transform: none;\n        width: auto;\n        margin: 0;\n        justify-self: center;\n        align-self: center;\n    }\n\n    .p-footer-row-opposite\n    {\n        grid-column: 3;\n        min-width: 0;\n        justify-self: end;\n    }\n}\n\n/* gram-support-footer-align-v6-gap-grid-force */\n@keyframes gramSupportFooterShimmerV6\n{\n    0% { background-position: 0% 50%; }\n    100% { background-position: 200% 50%; }\n}\n\nhtml body .p-footer .p-footer-row\n{\n    position: relative !important;\n}\n\nhtml body .p-footer .p-footer-row > .gramSupport-launcher.button\n{\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    gap: .45em !important;\n    box-sizing: border-box !important;\n    min-height: 38px !important;\n    max-width: 100% !important;\n    padding: 8px 16px !important;\n    border: 1px solid rgba(255, 225, 128, .88) !important;\n    border-radius: 999px !important;\n    color: #241700 !important;\n    background: linear-gradient(120deg, #7c4b00 0%, #c88a16 18%, #f0c85a 36%, #fff1a8 50%, #d9a52f 66%, #8a5404 84%, #c88a16 100%) !important;\n    background-size: 220% 100% !important;\n    box-shadow: 0 0 14px rgba(235, 176, 44, .42), 0 0 28px rgba(235, 176, 44, .16), inset 0 1px 0 rgba(255, 255, 255, .45) !important;\n    font-weight: 700 !important;\n    line-height: 1.2 !important;\n    text-decoration: none !important;\n    white-space: nowrap !important;\n    animation: gramSupportFooterShimmerV6 3.2s linear infinite !important;\n}\n\nhtml body .p-footer .p-footer-row > .gramSupport-launcher.button::before\n{\n    content: \" \" !important;\n    display: inline-block !important;\n    flex: 0 0 16px !important;\n    width: 16px !important;\n    height: 14px !important;\n    box-sizing: border-box !important;\n    margin-right: .10em !important;\n    color: #2b1a00 !important;\n    border: 2px solid currentColor !important;\n    border-bottom: 0 !important;\n    border-radius: 9px 9px 2px 2px !important;\n    background:\n        linear-gradient(currentColor, currentColor) left bottom / 3px 6px no-repeat,\n        linear-gradient(currentColor, currentColor) right bottom / 3px 6px no-repeat !important;\n}\n\n@media (min-width: 901px)\n{\n    html body .p-footer .p-footer-row\n    {\n        display: grid !important;\n        grid-template-columns: max-content minmax(0, 1fr) max-content !important;\n        align-items: center !important;\n        column-gap: 16px !important;\n    }\n\n    html body .p-footer .p-footer-row-main\n    {\n        grid-column: 1 !important;\n        grid-row: 1 !important;\n        float: none !important;\n        min-width: 0 !important;\n        margin-left: 0 !important;\n        margin-right: 0 !important;\n    }\n\n    html body .p-footer .p-footer-row-opposite\n    {\n        grid-column: 3 !important;\n        grid-row: 1 !important;\n        float: none !important;\n        min-width: 0 !important;\n        margin-left: 0 !important;\n        margin-right: 0 !important;\n        justify-self: end !important;\n    }\n\n    html body .p-footer .p-footer-row > .gramSupport-launcher.button\n    {\n        grid-column: 2 !important;\n        grid-row: 1 !important;\n        position: static !important;\n        inset: auto !important;\n        top: auto !important;\n        right: auto !important;\n        bottom: auto !important;\n        left: auto !important;\n        transform: none !important;\n        width: max-content !important;\n        margin: 0 !important;\n        float: none !important;\n        justify-self: center !important;\n        align-self: center !important;\n    }\n}\n\n@media (max-width: 900px)\n{\n    html body .p-footer .p-footer-row\n    {\n        display: grid !important;\n        grid-template-columns: minmax(0, 1fr) !important;\n        align-items: center !important;\n        row-gap: 8px !important;\n    }\n\n    html body .p-footer .p-footer-row-main\n    {\n        grid-column: 1 !important;\n        grid-row: 1 !important;\n        float: none !important;\n        min-width: 0 !important;\n        margin-left: 0 !important;\n        margin-right: 0 !important;\n        justify-self: stretch !important;\n    }\n\n    html body .p-footer .p-footer-row-opposite\n    {\n        grid-column: 1 !important;\n        grid-row: 2 !important;\n        float: none !important;\n        min-width: 0 !important;\n        margin-left: 0 !important;\n        margin-right: 0 !important;\n        justify-self: stretch !important;\n    }\n\n    html body .p-footer .p-footer-row > .gramSupport-launcher.button\n    {\n        grid-column: 1 !important;\n        grid-row: 3 !important;\n        position: static !important;\n        inset: auto !important;\n        top: auto !important;\n        right: auto !important;\n        bottom: auto !important;\n        left: auto !important;\n        transform: none !important;\n        width: max-content !important;\n        margin: 4px 0 0 !important;\n        float: none !important;\n        justify-self: center !important;\n        align-self: center !important;\n    }\n}\n\n","sha256":"4482bdc4eadbbaa7cd515303a1a76500eb4be2dfeb1a4d0ebd41ea99b2465e17"},"gram_support_launcher":{"version_id":"1000050","version_string":"1.0.0 Alpha 3 Unified Fix 3","content":"\n<xf:css src=\"gram_support.less\" />\n\n<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"eb8510732480507f86c2401a5d49c465820c225c9a3519530f751f6f501eaf5d"}},"codevipe":{"ok":true,"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"],"support_table_rows":{"xf_gram_support_attachment_meta":0,"xf_gram_support_delivery":0,"xf_gram_support_event":0,"xf_gram_support_message":0,"xf_gram_support_rate_limit":0,"xf_gram_support_ticket":0},"routes":[],"jobs":[{"job_id":4,"execute_class":"XF\\Job\\Cron","manual_execute":0},{"job_id":50,"execute_class":"XF\\Job\\UpgradeCheck","manual_execute":0}],"error_max":0,"recent_errors":[],"schema_manager_createTable":{"ok":true,"class":"XF\\Db\\SchemaManager","parameters":[{"name":"tableName","optional":false},{"name":"toApply","optional":false}],"file_basename":"SchemaManager.php","start":187,"end":200,"source_sha256":"be6c143b9b8321148d841530fe0e5f8388b5fa178a96a8a1fe759e8208eb71a4","key_lines":[{"line":187,"text":"public function createTable($tableName, \\Closure $toApply)"},{"line":189,"text":"$create = $this->newTable($tableName);"},{"line":193,"text":"$toApply($create);"},{"line":194,"text":"$create->apply();"},{"line":198,"text":"$this->handleException($e, $tableName, $create);"}]},"board_active":"1","board_url":"https://codevipe.ru"},"assessment":{"expected_partial_state":true,"support_tables_all_empty":true,"schema_createTable_truthy_optional_default":false,"schema_createTable_exists_signal":false,"setup_createTable_hits":6,"setup_dropTable_hits":1,"retry_without_delete_candidate":false},"requested_footer_patch":{"goal":"center button in remaining gap between left footer block and right footer links; vertical center aligned with footer text","css_override":".p-footer-row {\n    align-items: center;\n}\n.gramSupport-launcher {\n    position: static;\n    flex: 1 1 auto;\n    min-width: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    align-self: center;\n    margin: 0 16px;\n}\n.gramSupport-launcher .button {\n    margin: 0;\n}","strategy":"launcher already inserted immediately before p-footer-row-opposite; make launcher flex-grow and center contents"}}
GRAM513R3R2_DECISION=PASS_PARTIAL_STATE_INSTALLABILITY_RCA
GRAM513R3R2_NEXT_GATE=HOLD_REQUIRES_INSTALL_PATH_DECISION_NO_DELETE
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260918-GRAM-XF-CODEVIPE-PARTIAL-STATE-INSTALLABILITY-RCA-513R3R2","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}

OUTPUT_END
CHAT_OUTPUT_END
