knowledge-base/index.json
Gemini d49d5bbaa6 KB-PLUGIN-018: ZIP via python zipfile precisa de permissões explícitas
Entradas criadas com ZipInfo() nascem com external_attr=0; o unzip cria
os diretórios como drw------- e o webserver não consegue atravessá-los —
plugin some da lista ou dá 'Unable to load plugin information' (Plugin.php
linha 882). Inclui forma correta, sintoma do Jan 1 1980, validação do ZIP
e comando de correção no servidor. Diagnosticado no build VIP do butterfly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 14:15:25 -03:00

916 lines
25 KiB
JSON
Executable file

{
"version": "1.0.0",
"last_updated": "2026-07-31",
"records": [
{
"id": "KB-INFRA-001",
"title": "Caminho correto de plugins no container GLPI oficial",
"domain": "infrastructure",
"tags": [
"glpi",
"docker",
"plugins",
"mount",
"orbstack"
],
"status": "active",
"severity": "high",
"path": "records/infrastructure/KB-INFRA-001-glpi-plugin-path.md",
"summary": "id: KB-INFRA-001"
},
{
"id": "KB-INFRA-002",
"title": "Icone de plugin GLPI 11 requer logo.png PNG na raiz do diretorio",
"domain": "infrastructure",
"tags": [
"glpi",
"glpi11",
"plugin",
"icon",
"logo",
"marketplace"
],
"status": "active",
"severity": "low",
"path": "records/infrastructure/KB-INFRA-002-plugin-icon-logo-png.md",
"summary": "id: KB-INFRA-002"
},
{
"id": "KB-INFRA-003",
"title": "Git dual-push para Forgejo lab + mindtek-dev (sem prompt de credenciais)",
"domain": "infrastructure",
"tags": [
"git",
"forgejo",
"dual-push",
"credentials",
"sync"
],
"status": "active",
"severity": "medium",
"path": "records/infrastructure/KB-INFRA-003-git-dual-push-forgejo-lab-mindtek.md",
"summary": "id: KB-INFRA-003"
},
{
"id": "KB-INFRA-004",
"title": "\"Forgejo onmind é o origin de desenvolvimento (todo trabalho dev é versionado lá)\"",
"domain": "infrastructure",
"tags": [
"git",
"forgejo",
"origin",
"workflow",
"dev",
"sync",
"credentials"
],
"status": "active",
"severity": "high",
"path": "records/infrastructure/KB-INFRA-004-forgejo-onmind-dev-origin.md",
"summary": "id: KB-INFRA-004"
},
{
"id": "KB-INFRA-005",
"title": "GLPI 11 em subcaminho com root_doc vazio quebra rotas Symfony (form builder nao salva)",
"domain": "infrastructure",
"tags": [
"glpi",
"glpi11",
"docker",
"swarm",
"traefik",
"nginx",
"reverse-proxy",
"root_doc",
"symfony-routes",
"allowlist"
],
"status": "active",
"severity": "critical",
"path": "records/infrastructure/KB-INFRA-005-glpi11-subpath-root_doc-symfony-routes-allowlist.md",
"summary": "id: KB-INFRA-005"
},
{
"id": "KB-PLUGIN-001",
"title": "Instalacao de plugin GLPI requer callbacks install/uninstall",
"domain": "plugin-dev",
"tags": [
"glpi",
"plugin",
"install",
"setup.php",
"hooks"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-001-install-hooks-required.md",
"summary": "id: KB-PLUGIN-001"
},
{
"id": "KB-PLUGIN-002",
"title": "getCategory() deve ser sobrescrito em QuestionType de plugin GLPI 11",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"question-type",
"javascript",
"plugin"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-002-questiontype-getcategory-override.md",
"summary": "id: KB-PLUGIN-002"
},
{
"id": "KB-PLUGIN-003",
"title": "JSON em <script type=\"application/json\"> nao deve usar htmlspecialchars",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"javascript",
"json",
"xss",
"php"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-003-json-script-tag-no-htmlspecialchars.md",
"summary": "id: KB-PLUGIN-003"
},
{
"id": "KB-PLUGIN-004",
"title": "Chave do hook ADD_JAVASCRIPT deve ser o plugin key exato",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"hooks",
"javascript",
"setup.php",
"plugin-key"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-004-plugin-hook-key-must-match-plugin-key.md",
"summary": "id: KB-PLUGIN-004"
},
{
"id": "KB-PLUGIN-005",
"title": "ITILCategoryFieldStrategy LAST_VALID_ANSWER ignora subclasses de QuestionTypeItemDropdown",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"form-destination",
"itil-category",
"answer-pipeline",
"question-type"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-005-last-valid-answer-exact-class-match.md",
"summary": "id: KB-PLUGIN-005"
},
{
"id": "KB-PLUGIN-006",
"title": "Procedimento completo de renomeacao de plugin GLPI",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"plugin",
"rename",
"refactor",
"namespace",
"database"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-006-plugin-rename-full-procedure.md",
"summary": "id: KB-PLUGIN-006"
},
{
"id": "KB-PLUGIN-007",
"title": "GLPI 11 marca QuestionTypeItemDropdown como final",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"question-type",
"fatal-error"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-007-questiontypeitemdropdown-final.md",
"summary": "id: KB-PLUGIN-007"
},
{
"id": "KB-PLUGIN-008",
"title": "Interfaces de Validacao Customizada no Form Builder do GLPI 11",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"validation",
"javascript"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-008-questiontype-validation-interfaces.md",
"summary": "id: KB-PLUGIN-008"
},
{
"id": "KB-PLUGIN-009",
"title": "Validacao mandatory ignora respostas que sao arrays nao-vazios com chaves em branco",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"validation",
"answers-handler"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-009-transformconditionvalue-empty-array.md",
"summary": "id: KB-PLUGIN-009"
},
{
"id": "KB-PLUGIN-010",
"title": "Padrao correto para chamadas AJAX autenticadas em plugins GLPI 11",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"ajax",
"csrf",
"security",
"symfony",
"fetch",
"plugin"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-010-ajax-csrf-x-glpi-csrf-token.md",
"summary": "id: KB-PLUGIN-010"
},
{
"id": "KB-PLUGIN-011",
"title": "\"Procedimento de Release do Plugin Mindplace (LEGADO — GitHub)\"",
"domain": "plugin-dev",
"tags": [
"github",
"release",
"secrets",
"deprecated"
],
"status": "deprecated",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-011-mindplace-release-zip-procedure.md",
"summary": "id: KB-PLUGIN-011"
},
{
"id": "KB-PLUGIN-012",
"title": "Estendendo o sistema de Tiles do Helpdesk no GLPI 11 — padrões e armadilhas",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"helpdesk",
"tiles",
"dom-manipulation",
"mutation-observer",
"twig",
"singleton",
"plugin"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-012-helpdesk-tiles-extension-patterns.md",
"summary": "id: KB-PLUGIN-012"
},
{
"id": "KB-PLUGIN-013",
"title": "Runbook — Publicação de plugin no Mindplace (procedimento padrão)",
"domain": "plugin-dev",
"tags": [
"mindplace",
"runbook",
"publish",
"license",
"forgejo",
"release",
"kill-switch",
"workflow",
"automation",
"script"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-013-mindplace-plugin-publication-runbook.md",
"summary": "id: KB-PLUGIN-013"
},
{
"id": "KB-PLUGIN-014",
"title": "getFromDBByCrit() não limpa $fields em falha — reutilizar a mesma instância vaza estado entre iterações",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"commondbtm",
"getfromdbbycrit",
"bug",
"iteration",
"state-leak"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-014-getfromdbbycrit-stale-fields.md",
"summary": "id: KB-PLUGIN-014"
},
{
"id": "KB-PLUGIN-015",
"title": "querySelector('.row') colide com elementos de outros plugins no Helpdesk portal",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"helpdesk",
"tilesections",
"dom",
"selectors",
"bootstrap",
"cross-plugin-interference"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-015-querySelector-row-collision.md",
"summary": "id: KB-PLUGIN-015"
},
{
"id": "KB-PLUGIN-016",
"title": "\"Bypass de CSRF e Autenticação Nativa (Bearer Token) para APIs Customizadas no GLPI 11\"",
"domain": "plugin-dev",
"tags": [
"glpi-11",
"csrf",
"api",
"jwt",
"oauth",
"auth",
"stateless"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-016-glpi11-csrf-bypass-and-api-auth.md",
"summary": "id: KB-PLUGIN-016"
},
{
"id": "KB-PLUGIN-017",
"title": "\"Bug do detector de wrapper directory no instalador Mindplace mutilava nomes de arquivos\"",
"domain": "plugin-dev",
"tags": [
"mindplace",
"marketplace",
"zip",
"extractor",
"install-bug"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-017-mindplace-zip-wrapper-detector-bug.md",
"summary": "id: KB-PLUGIN-017"
},
{
"id": "KB-PLUGIN-018",
"title": "\"Convenção de wrapper directory na geração de ZIP de release de plugin (script mindplace-release.sh)\"",
"domain": "plugin-dev",
"tags": [
"mindplace",
"forgejo",
"release",
"zip",
"wrapper",
"mindplace-release-sh"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-018-plugin-release-zip-wrapper-convention.md",
"summary": "id: KB-PLUGIN-018"
},
{
"id": "KB-PLUGIN-019",
"title": "Arquitetura BFF (Backend For Frontend) e Seguranca via API no GLPI 11 (Plugin MCProtocol)",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"mcp",
"api",
"rbac",
"security",
"bff"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-019-mcprotocol-bff-architecture.md",
"summary": "id: KB-PLUGIN-019"
},
{
"id": "KB-PLUGIN-020",
"title": "Roadmap de Evolucao do MCProtocol (Views Semanticas API)",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"mcp",
"api",
"roadmap",
"bff"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-020-mcprotocol-bff-roadmap.md",
"summary": "id: KB-PLUGIN-020"
},
{
"id": "KB-PLUGIN-021",
"title": "mcprotocol — Roadmap de Resources e caso de uso N1",
"domain": "plugin-dev",
"tags": [
"mcp",
"resources",
"n1",
"knowledge-base",
"roadmap"
],
"status": "draft",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-021-mcprotocol-resources-n1-roadmap.md",
"summary": "id: KB-PLUGIN-021"
},
{
"id": "KB-PLUGIN-022",
"title": "mcprotocol — Padrões de validação e ergonomia em tool inputs",
"domain": "plugin-dev",
"tags": [
"mcp",
"tools",
"validation",
"ergonomics",
"llm",
"patterns"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-022-mcprotocol-tool-input-patterns.md",
"summary": "id: KB-PLUGIN-022"
},
{
"id": "KB-PLUGIN-023",
"title": "mcprotocol — InputValidation extraída como classe utilitária compartilhada",
"domain": "plugin-dev",
"tags": [
"mcp",
"tools",
"validation",
"refactor",
"patterns"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-023-mcprotocol-inputvalidation-extracted.md",
"summary": "id: KB-PLUGIN-023"
},
{
"id": "KB-PLUGIN-024",
"title": "mcprotocol — Bug duplo no glpi_delete_item (sucesso silencioso + ProjectTask não exposto em v2)",
"domain": "plugin-dev",
"tags": [
"mcp",
"bug",
"glpi",
"rest-api",
"delete",
"error-handling"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-024-mcprotocol-delete-item-silent-success-bug.md",
"summary": "id: KB-PLUGIN-024"
},
{
"id": "KB-PLUGIN-025",
"title": "mcprotocol — Comportamento de timezone em datas sem hora explícita",
"domain": "plugin-dev",
"tags": [
"mcp",
"tools",
"validation",
"timezone",
"gotcha"
],
"status": "active",
"severity": "low",
"path": "records/plugin-dev/KB-PLUGIN-025-mcprotocol-date-timezone-handling.md",
"summary": "id: KB-PLUGIN-025"
},
{
"id": "KB-PLUGIN-026",
"title": "mcprotocol — Snapshot de roadmap v1.2 (pós-ProjectTask + InputValidation)",
"domain": "plugin-dev",
"tags": [
"mcp",
"roadmap",
"snapshot",
"planning"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-026-mcprotocol-roadmap-snapshot-v1.2.md",
"summary": "id: KB-PLUGIN-026"
},
{
"id": "KB-PLUGIN-027",
"title": "mcprotocol — Fluxo de release Dev → Prod (manual)",
"domain": "plugin-dev",
"tags": [
"mcp",
"release",
"workflow",
"forgejo",
"mindplace"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-027-mcprotocol-dev-prod-release-flow.md",
"summary": "id: KB-PLUGIN-027"
},
{
"id": "KB-PLUGIN-028",
"title": "GLPI 11 — Plugin com menu próprio precisa registrar rights via Profile",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"profile",
"rights",
"menu",
"sidebar",
"gotcha"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-028-glpi11-plugin-rights-and-menu-visibility.md",
"summary": "id: KB-PLUGIN-028"
},
{
"id": "KB-PLUGIN-029",
"title": "GLPI 11 — Itemtypes administrativos vs. ativos (semântica de vínculo com Ticket)",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"design",
"architecture",
"ticket",
"contract",
"taxonomy"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-029-glpi11-administrative-vs-asset-itemtypes.md",
"summary": "id: KB-PLUGIN-029"
},
{
"id": "KB-PLUGIN-030",
"title": "\"GLPI 11 — Criação de tabelas exige classe Migration (Executing direct queries is not allowed!)\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"install",
"database",
"ddl",
"migration",
"gotcha"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-030-glpi11-migration-class-required-for-ddl.md",
"summary": "id: KB-PLUGIN-030"
},
{
"id": "KB-PLUGIN-031",
"title": "\"Runbook — Processo oficial de desenvolvimento de plugins GLPI (DEV → homologação → PROD)\"",
"domain": "plugin-dev",
"tags": [
"runbook",
"workflow",
"dev",
"deploy",
"forgejo",
"scaffold",
"validation",
"console",
"processo-oficial"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-031-plugin-dev-workflow-runbook.md",
"summary": "id: KB-PLUGIN-031"
},
{
"id": "KB-PLUGIN-032",
"title": "\"GLPI 11 — Segunda conexão de banco read-only via subclasse de DBmysql\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"database",
"dbmysql",
"connection",
"read-only",
"external-db",
"sync"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-032-glpi11-second-dbmysql-connection.md",
"summary": "id: KB-PLUGIN-032"
},
{
"id": "KB-PLUGIN-033",
"title": "\"GLPI 11 — Comandos de console de plugin exigem src/ e namespace de nome plugins:<key>:\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"console",
"symfony",
"command",
"cli",
"gotcha"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-033-glpi11-plugin-console-commands.md",
"summary": "id: KB-PLUGIN-033"
},
{
"id": "KB-PLUGIN-034",
"title": "\"GLPI 11 — Cifrar credenciais de sistemas externos em itemtype de plugin (GLPIKey)\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"security",
"credentials",
"glpikey",
"encryption",
"commondbtm",
"itemtype"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-034-glpi11-encrypt-external-credentials-itemtype.md",
"summary": "id: KB-PLUGIN-034"
},
{
"id": "KB-PLUGIN-035",
"title": "Modelo de dados dos KPIs de Service Desk no GLPI 11 (tools de BI do mcprotocol)",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"mcp",
"kpi",
"bi",
"tickets",
"sla",
"csat"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-035-glpi11-service-desk-kpi-data-model.md",
"summary": "id: KB-PLUGIN-035"
},
{
"id": "KB-PLUGIN-036",
"title": "\"GLPI 11 — Namespaces obrigatórios para componentes do core (Twig e RichText)\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"twig",
"namespaces",
"templaterenderer",
"richtext",
"gotcha"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-036-glpi11-namespaces-twig.md",
"summary": "id: KB-PLUGIN-036"
},
{
"id": "KB-PLUGIN-037",
"title": "\"Plugin redmine — Contrato de API GLPI → Redmine (o quê, como e por quê)\"",
"domain": "plugin-dev",
"tags": [
"redmine",
"glpi11",
"plugin",
"api",
"rest",
"integration",
"impersonation",
"custom-fields",
"time-tracking",
"producao"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-037-redmine-plugin-api-contract.md",
"summary": "id: KB-PLUGIN-037"
},
{
"id": "KB-PLUGIN-038",
"title": "\"GLPI 11 — Assets de plugin: Monaco no lugar do CodeMirror, fim do jQuery UI, add_css/add_javascript e estáticos só em public/\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"assets",
"monaco",
"codemirror",
"jquery-ui",
"add_css",
"add_javascript",
"public",
"gotcha"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md",
"summary": "id: KB-PLUGIN-038"
},
{
"id": "KB-PLUGIN-039",
"title": "\"GLPI 11 — Substrato nativo de gestão de projetos/chamados (Kanban, precedência, planning) reutilizável por plugin\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"kanban",
"project",
"projecttask",
"ticket",
"planning",
"gantt",
"precedence",
"teamwork",
"mindscrum",
"architecture"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-039-glpi11-project-ticket-pm-substrate.md",
"summary": "id: KB-PLUGIN-039"
},
{
"id": "KB-PLUGIN-040",
"title": "\"GLPI 11 — Kanban multi-itemtype num plugin (Chamados + Tarefas de Projeto): agregação, mapa coluna↔estado e escrita via update() nativo\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"kanban",
"board",
"ticket",
"projecttask",
"projectstate",
"drag-drop",
"ajax",
"twig",
"mindscrum"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-040-glpi11-unified-kanban-multi-itemtype.md",
"summary": "id: KB-PLUGIN-040"
},
{
"id": "KB-PLUGIN-041",
"title": "\"GLPI 11 — Ciclo projeto→task→chamado com sincronização (o ponto cego), modal de card componentizado e adaptador de tarefas\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"project",
"projecttask",
"ticket",
"tickettask",
"lifecycle",
"hooks",
"sync",
"flatpickr",
"mindscrum"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-041-glpi11-project-ticket-lifecycle-sync-and-componentized-card.md",
"summary": "id: KB-PLUGIN-041"
},
{
"id": "KB-PLUGIN-042",
"title": "\"GLPI 11 — ProjectTask::autoSetDate sobrescreve effective_duration (decorrido ≠ esforço); roll-up de esforço já é nativo via getTicketsTotalActionTime\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"projecttask",
"tickettask",
"actiontime",
"effective-duration",
"time-tracking",
"gotcha",
"mindscrum"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-042-glpi11-effective-duration-overwrite-native-effort-rollup.md",
"summary": "id: KB-PLUGIN-042"
},
{
"id": "KB-PLUGIN-043",
"title": "\"GLPI 11 — Padrões de UX de card kanban em plugin: anatomia do card nativo, own_ticket, is_private, TTR, cores de prioridade e gotchas de CSS\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"kanban",
"card",
"ux",
"own-ticket",
"itilfollowup",
"time-to-resolve",
"priority",
"css",
"gotcha",
"mindscrum"
],
"status": "active",
"severity": "medium",
"path": "records/plugin-dev/KB-PLUGIN-043-glpi11-kanban-card-ux-patterns.md",
"summary": "id: KB-PLUGIN-043"
},
{
"id": "KB-PLUGIN-044",
"title": "\"GLPI 11 — Visibilidade nativa em listagens de plugin (tickets/projetos) e permissionamento espelhado: receita e armadilhas\"",
"domain": "plugin-dev",
"tags": [
"glpi11",
"plugin",
"security",
"visibility",
"rights",
"profile",
"sqlprovider",
"ticket",
"project",
"hardening",
"mindscrum"
],
"status": "active",
"severity": "critical",
"path": "records/plugin-dev/KB-PLUGIN-044-glpi11-native-visibility-in-plugin-boards.md",
"summary": "id: KB-PLUGIN-044"
},
{
"id": "KB-PLUGIN-045",
"title": "Padrao de campo seguro para formulario anonimo GLPI 11 (QuestionType + Applicator)",
"domain": "plugin-dev",
"tags": [
"glpi",
"glpi11",
"form-builder",
"question-type",
"form-destination",
"anonymous",
"security",
"extform"
],
"status": "active",
"severity": "high",
"path": "records/plugin-dev/KB-PLUGIN-045-safe-anonymous-field-questiontype-applicator.md",
"summary": "id: KB-PLUGIN-045"
}
]
}