@praxisui/table 10.0.0-rc.0 → 10.0.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,45 @@
1
+ # Detalhe de tabela com apresentação por linha ou inferior
2
+
3
+ Estado: decisão autorizada para implementação; gates de execução no registro `../table-bottom-detail-progress.md`.
4
+
5
+ ## Inventário e decisão
6
+
7
+ O Core já define fonte, schema, renderização, altura e lazy load dentro de `TableExpansionConfig.detail`. A Table já resolve/renderiza esse documento, publica diagnósticos e mantém seleção por identidade. O editor de comportamento já edita fontes e o editor global implementa SettingsValueProvider. Os tokens Core de detalhe e os providers Charts são reutilizados.
8
+
9
+ | Necessidade | Aderência | Decisão |
10
+ |---|---|---|
11
+ | Composição rica, referências a campos, chartRef e fontes | ja-suportado-mal-nomeado-ou-mal-materializado | Promover integralmente o detalhe para `behavior.detail`, sem segundo dialeto |
12
+ | Identidade e seleção | ja-suportado-so-ux | Consumir `selection.selected` e reconciliação existente; não criar seleção paralela |
13
+ | Apresentação inferior e recolhimento inicial | lacuna-real-de-contrato | Acrescentar enabled e presentation no tipo promovido do Core |
14
+ | Altura automática | ja-suportado-mal-nomeado-ou-mal-materializado | Materializar `height.mode: dynamic` no runtime e no editor; manter altura fixa como escolha explícita |
15
+ | Continuidade com toolbar/paginação | lacuna-real-de-contrato | Acrescentar `bottomStackPosition`, com `afterControls` como default para manter os controles da coleção unidos à grade |
16
+ | Ausência total sem seleção/conteúdo | lacuna-real-de-contrato | Acrescentar `emptyBehavior`, preservando mensagem orientativa como default e permitindo `hide` |
17
+ | Resolução concorrente e refresh | suportado-parcialmente | Coordenar tokens internos por contexto/registro; invalidar resultados obsoletos |
18
+ | Callout, cartão semântico, ícone, texto formatado e CTA | ja-suportado-mal-nomeado-ou-mal-materializado | Incorporar `praxis.rich-content@1.0.0` por um node-ponte e delegar runtime/editor ao dono canônico |
19
+ | Edição de conteúdo estruturado | suportado-parcialmente | Inspector Table organiza o shell; `PraxisRichContentConfigEditor` edita o documento rico com round-trip explícito |
20
+
21
+ O dado ausente é a escolha authorada de apresentação do detalhe. Core é a fonte canônica; Table é o runtime/editor, e hosts, Page Builder, docs e registry são consumidores. A prova mínima inclui migração sem perda/idempotente/conflitante, builds Core/Table/consumidor, seleção, async, editor e browser.
22
+
23
+ ## D1–D9 adotadas
24
+
25
+ 1. Promover o corpo completo de expansion.detail a TableDetailConfig/behavior.detail; remover o antigo em migração integrada.
26
+ 2. Defaults apenas em runtime; row depende de expansão; bottom depende de seleção. Conflitos fecham com diagnóstico e operações explícitas aplicam as mutações acopladas do roteiro.
27
+ 3. Zero/uma/várias seleções têm estados próprios. ID estável é obrigatório no bottom. Registro fora da página não resolve corpo; refresh não inventa selectionChange.
28
+ 4. Migração finita preserva irmãos/nodes desconhecidos, rejeita dois caminhos diferentes e não faz leitura dupla no runtime nem mutação remota.
29
+ 5. Compartilhar o template recursivo e corpo/estado no dono Table, sem duplicar switch ou novo componente público.
30
+ 6. Não salvar resultado do adapter de apresentação; preservar referências, rascunhos inválidos e nodes avançados. `richContent.document` usa o editor e o validator canônicos; Table só mantém o envelope e o dispatch host-mediated. Descartar rascunho e restaurar defaults são operações distintas.
31
+ 7. Token imutável por registro/contexto/geração, invalidação antes de limpeza, descarte tardio e finally condicionado. Preservar cache/cancelamento efetivos; sem retry automático.
32
+ 8. Fonte resolve documento de detalhe, não entidade. Preservar allowlist, autorização, sanitização e providers. Perfis restritos devem fechar também resolver resource.
33
+ 9. Painel fora do viewport. Por padrão, toolbar inferior e paginação permanecem imediatamente após a grade e o painel fecha a pilha visual; `beforeControls` preserva a composição alternativa quando ela for deliberadamente authorada. Altura ausente e `dynamic` usam o tamanho natural do conteúdo; `fixed` cria uma região rolável (baseline editorial de 192px). `emptyBehavior: hide` remove toda a superfície e sua geometria quando não há registro elegível ou documento renderizável; os demais estados continuam acessíveis e o foco é preservado.
34
+
35
+ ## Evidência de layout
36
+
37
+ As referências iniciais de master/detail (MUI X, AG Grid, Kendo e TanStack) demonstram detalhe dentro da linha. Elas não sustentam colocar um painel contextual persistente entre a grade e seus controles de coleção. A implementação anterior seguiu a decisão D9 original, mas o laboratório mostrou perda de continuidade entre a tabela e a paginação. A decisão foi corrigida para manter o chrome da coleção agrupado e tratar o painel inferior como superfície contextual posterior.
38
+
39
+ O AG Grid documenta alturas fixa, automática e calculada para master/detail e alerta para o custo de virtualização da altura automática em grids de detalhe. No Praxis, o painel inferior fica fora do viewport virtual da tabela; `dynamic` acompanha o conteúdo e `fixed` cria uma região rolável com altura governada.
40
+
41
+ ## Coordenação e plano
42
+
43
+ A coordenação autorizou usar os perfis preexistentes de `praxis-table.metadata.ts` como baseline e editar apenas paths/restrições exigidos por D8 em T04/T07, com specs adversariais e diff focal. Outros deltas preexistentes permanecem preservados.
44
+
45
+ Execução: T01 caracteriza; T02 corrige async; T03 compartilha renderer; T04 migra contrato/consumidores; T05 materializa bottom; T06 editor; T07 IA/perfis; T08 browser/derivados. Um gate por vez. A mudança é breaking no path e exige migração operacional separada antes de integração/release quando houver documentos antigos remotos. Não há autorização de publicação nesta tarefa.
@@ -138,7 +138,7 @@ Resumo:
138
138
  Para payload inválido de filtro:
139
139
 
140
140
  - HTTP `400`
141
- - `errors[].properties.code = FILTER_PAYLOAD_INVALID`
141
+ - `errors[].code = FILTER_PAYLOAD_INVALID`
142
142
 
143
143
  ## Regras práticas para hosts
144
144
 
@@ -99,7 +99,7 @@ O backend rejeitou o payload durante normalização ou construção da specifica
99
99
 
100
100
  ### Resposta esperada
101
101
 
102
- HTTP `400` com `errors[].properties.code = FILTER_PAYLOAD_INVALID`.
102
+ HTTP `400` com `errors[].code = FILTER_PAYLOAD_INVALID`.
103
103
 
104
104
  ## Sintoma: range não filtra ou filtra errado
105
105
 
@@ -34,3 +34,6 @@ Não se trata de persistência de seleção: novos objetos, outra projeção/ord
34
34
  atualização explícita continuam passando pela política `persistOnDataUpdate` /
35
35
  `persistSelection`. Nenhuma identidade é reconstruída pela posição visual e a
36
36
  precedência entre `resourcePath`, `data` e conexão persistida permanece inalterada.
37
+ ## Corporate context changes
38
+
39
+ The existing `EnterpriseRuntimeContextService` governs context transitions. Table clears the previous local view and selection and rejects the previous `data` array during subsequent local recomputation. The host must supply a new array for the effective context and cancel or reject its own late responses. Mutating the same array, refreshing settings or preserving selection by record ID cannot restore eligibility across contexts. This does not change local/remote precedence or replace server authorization.
@@ -0,0 +1,205 @@
1
+ # Progresso — detalhe contextual inferior da tabela
2
+
3
+ Data: 2026-09-10. Roteiro: `../../../../docs/2026-09-10-table-contextual-detail-implementation-runbook.md` na raiz agregadora (referência lógica; documento fora deste repositório).
4
+
5
+ > Revisão abrangente posterior: os gates abaixo registram as execuções históricas de T00–T08, não certificação corporativa. Consulte `table-bottom-detail-review.md` para os defeitos encontrados, correções e validações posteriores.
6
+
7
+ ## Revisão visual de empilhamento e editor — 2026-09-10
8
+
9
+ A decisão histórica D9 (painel antes dos controles e altura sempre fixa) foi substituída após validação visual. O contrato público agora oferece `presentation.bottomStackPosition` (`afterControls` por default) e `presentation.emptyBehavior`; o runtime/editor materializam `height.mode=dynamic` já existente no Core e mantêm `fixed` como escolha explícita. A rota `/table-bottom-detail-lab` isola os cenários de conteúdo, altura, ausência, ordem, toolbar, paginação e largura.
10
+
11
+ Validação desta rodada: 76/76 testes focais de runtime/editor/manifesto; builds canônicos Core e Table com suas dependências aprovados. O build do host sem `CI=1` encerrou com o abort nativo/cache já documentado neste registro; com `CI=1 NG_BUILD_MAX_WORKERS=2` o bundle do consumidor passou em 26 s. Registry regenerado com catálogo PASS, zero erros/warnings e authoring 20/20; snapshot do Config Starter aprovado em 9/9 testes. No navegador interno, a rota dedicada confirmou ausência total em `hide`, título de identidade legível e ordem toolbar inferior → paginação → detalhe. O servidor permanece aberto na porta 4003 para validação do usuário.
12
+
13
+ ## Estado dos gates
14
+
15
+ | Tarefa | Estado | Arquivos próprios | Comando/evidência | Pendência | Próxima ação |
16
+ |---|---|---|---|---|---|
17
+ | T00 | concluída com evidência | registro, baseline.txt e ADR | Inventário por rg/git; MCP Angular 21; runners Jasmine confirmados | Nenhum conflito semântico pendente em T00 | T01 |
18
+ | T01 | concluída com evidência | expansion-runtime.spec.ts e registro | 20 baseline + 30 host + 15 seleção passam; C01/C02/C05 passam, C03/C04/C06 reproduzem races | Regressões caracterizadas, previstas por G01 | T02 |
19
+ | T02 | concluída com evidência | runtime-state.ts/spec, praxis-table.ts, expansion-runtime.spec, host integration e remote-regression spec | 187 SUCCESS | Nenhuma falha focal | T03 |
20
+ | T03 | concluída com evidência | praxis-table.html | 63 SUCCESS | — | T04 |
21
+ | T04 | concluída com evidência | Core modelo/defaults; Table runtime/editor/AI/perfis/specs; hosts; adapter da landing | M01–M06; Core 5, manifesto/perfis 59, expansão/P03 34; builds Core/Table/Page Builder passam | Derivados editoriais/registry em T08; operações acopladas em T07 | T05 |
22
+ | T05 | concluída com evidência | runtime/template/estilos/i18n; bottom-detail.spec; host integration; remote-regression harness | 145 SUCCESS, B01–B10 e checkbox real em viewport virtual | Browser visual em T08 | T06 |
23
+ | T06 | concluída com evidência | detail editor/helper/specs; config editor; behavior; filter settings; rules editor; projection delta; i18n e host | Save/remoção/rehidratação 108 SUCCESS; limpeza+host 63 SUCCESS; descarte/composição/SettingsProvider 16 SUCCESS | Builds e jornadas visuais finais em G08 | T07 |
24
+ | T07 | concluída com evidência | manifesto/catálogo/compilador Table; executor determinístico no Config Starter; snapshot | Angular 62; backend 112; browser A04 passou; catálogo PASS; authoring 20/20 PASS | LLM live não executado (runner publica em storage remoto) | T08 |
25
+ | T08 | concluída com evidência local | exemplo direto e Page Builder; E2E; docs/registry/snapshot; fixtures | 6 E2E PASS; Table/Page Builder builds PASS; 95 specs Angular; 94 backend + 48 no fechamento; gates editoriais e registry PASS | Sem IA live, backend remoto ou migração remota; ver limites abaixo | Pronto para revisão local |
26
+
27
+ ## Baseline histórico e classificação
28
+
29
+ - Classe: `contrato-publico`, com impacto transversal.
30
+ - Repositório: `praxis-ui-angular`; HEAD `9dc08061483c79a1ba9cb4f1cc4765365077e6e3`.
31
+ - Checkout compartilhado e sujo, com alterações preexistentes em Core, Table, Page Builder e outras bibliotecas. Nenhuma alteração preexistente foi revertida ou editada nesta execução.
32
+ - Comandos executados: `git -C praxis-ui-angular status --short`, `git -C praxis-ui-angular rev-parse HEAD`, `git -C praxis-ui-angular diff -- projects/praxis-table/src/lib/praxis-table.metadata.ts projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.ts projects/praxis-table/src/lib/praxis-table.ts`.
33
+ - Leituras: roteiro, AGENTS raiz/workspace/Core/Table e guia MCP. A leitura integral de todas as instruções e skills necessárias ainda não foi concluída; isso continua obrigatório antes de runtime.
34
+ - Runners confirmados em `package.json`: `test:table` usa `ng test praxis-table --watch=false --progress=false`; builds Core/Table usam `scripts/build-libs.js --prod --only`.
35
+ - MCP ainda não executado. Nenhum código runtime editado, teste executado ou gate aprovado.
36
+
37
+ ## Sobreposição histórica e orientação recebida
38
+
39
+ O diff preexistente de `projects/praxis-table/src/lib/praxis-table.metadata.ts` introduz `runtimeProfiles` (`public-local-volatile` e `public-resource-read`). Ambos acrescentam constraints sobre `config.behavior.expansion.detail.source.mode`, com `none-of` para `resourcePath`, `hypermedia`, `surface`.
40
+
41
+ T04/T07 e D8 exigem modificar exatamente essas constraints: promover o path para `config.behavior.detail.source.mode` e testar/bloquear também o provider `resource` nos perfis restritos. Portanto, há sobreposição direta de edição com trabalho recente, e não somente arquivos sujos sem relação. A instrução de execução exige parar a etapa afetada e pedir orientação quando houver colisão com código recente. Não foi feita alteração nesses trechos.
42
+
43
+ Proposta para retomada: tratar os perfis atuais como baseline autorizado, preservar sua estrutura e demais constraints, e aplicar apenas a migração/validação definida por D8 em T04/T07, coordenando com a tarefa que os introduziu. Autorizado pela coordenação na retomada: incorporar os perfis atuais como baseline e aplicar somente o delta de D8 em T04/T07.
44
+
45
+ As alterações preexistentes inspecionadas em `behavior-config-editor.component.ts` tratam defaults de resizing; em `praxis-table.ts`, tratam resizing e persistência concorrente de colunas. Não foram classificadas como conflito arquitetural do detalhe apenas por estarem nos mesmos arquivos.
46
+
47
+ ## Mapa de impacto inicial, ainda sujeito ao inventário T00
48
+
49
+ - Fonte canônica: Core para `TableDetailConfig`; Table para resolução, renderer, seleção consumida, editor, authoring e metadata.
50
+ - Consumidores: hosts de expansão, Page Builder e referências existentes ao caminho antigo; Charts mantém providers/tokens existentes.
51
+ - Derivados: documentação Table, recipes, registry e referências na landing/corpus a inventariar. Ainda não é possível declarar ausência de derivados.
52
+ - Validação: G01–G08 do roteiro, incluindo specs focais, builds produtor/consumidor, perfis, authoring e browser.
53
+ - Breaking change: remoção de `behavior.expansion.detail`; migração finita e sem fallback silencioso. Nenhuma migração remota autorizada.
54
+ - D1–D9 permanecem propostas de implementação do roteiro, não decisões já materializadas ou validadas. ADR final ainda não escrito.
55
+
56
+ Nenhum processo auxiliar persistente iniciado; nenhum push, PR, deploy, release ou mutação remota executado.
57
+
58
+ ## G00 — conclusão na retomada
59
+
60
+ Registro anterior acima é histórico. Preparação MCP concluída usando Client/StdioClientTransport do SDK instalado e `npx -y @angular/cli mcp`, com fechamento do cliente em finally. list_projects confirmou Angular 21 e Jasmine; get_best_practices foi consultado com workspacePath absoluto. Ferramentas: ai_tutor, get_best_practices, search_documentation, find_examples, list_projects, onpush_zoneless_migration. Busca inicialmente falhou por rede restrita; repetição com acesso autorizado retornou searchedVersion=21 e https://v21.angular.dev/api/common/NgTemplateOutlet e https://v21.angular.dev/api/core/DestroyRef.
61
+
62
+ Recomendações selecionadas para os patches subsequentes: tipos estritos/unknown; transformações puras; componentes focados/OnPush; Reactive Forms; controle de fluxo nativo e preservação de foco/ARIA. Ainda não são apresentadas como implementação realizada.
63
+
64
+ Node v22.22.2 do macOS e pacote nativo @esbuild/darwin-arm64 confirmados. AGENTS Core/Table/Rich Content/Charts/Page Builder/Settings Panel/registry e codex-rules lidos, além de raiz/workspace. Skills de runtime/seleção/authoring-settings/Rich Content/validação Angular e guidance de authoring/UX consultados. Referências adicionais de UI serão aplicadas antes das etapas de UI.
65
+
66
+ Inventário bruto reproduzível em table-bottom-detail-baseline.txt: HEAD/status Angular, landing e corpus HTTP, referências pontuadas, getters e objetos expansion aninhados. Classificação dos grupos encontrados:
67
+ - Canônicos: Core table-config-v2 e tokens; Table runtime/template/editor/i18n/manifest/capabilities/context-pack/adapter/metadata.
68
+ - Consumidores: hosts table-expansion-renders-demo e table-expansion-funcionarios-demo; recipe praxis-dynamic-page.remote-list; landing playground-source.adapters e exemplos documentais de Table.
69
+ - Derivados: vendor json-api da landing, site.data, guias de segurança, Table json-api, registry e smoke prompts.
70
+ - Testes: expansion-runtime, host integration e demais fixtures de expansão (migrar em T04); somente fixtures explícitas de migração manterão caminho antigo.
71
+ - Histórico: este registro, ADR/relatórios de investigação e inventário capturado; não executar substituição nesses documentos.
72
+
73
+ Fonte versionada de praxis-table-authoring-settings não encontrada em codex-skills nesta baseline. Guidance instalado cita table-authoring-changes.ts, também ausente: usar handlers existentes onBehaviorChange/onToolbarActionsChange e provar merge focal em T06; registrar gap, sem inventar helper a partir do nome.
74
+
75
+ ADR table-detail-presentation.md registra aderência, D1–D9, mapa de impacto e plano. Não existe TableDetailConfig nem bottom no runtime inspecionado. Cache.enabled/cancelOnCollapse são os campos lazyLoad efetivamente consumidos encontrados; TTL/dedupe/retry não têm consumidor de detalhe encontrado. Essa leitura ainda será caracterizada por testes. Nenhum contrato/backend/endpoint novo fora de D1 é necessário.
76
+
77
+ ## T01 — falha da baseline executável
78
+
79
+ Comando: `npm run test:table -- --include=projects/praxis-table/src/lib/praxis-table.expansion-runtime.spec.ts` em praxis-ui-angular. Resultado: exit 134 durante `Building...`, sem resultados Jasmine. Nenhum teste ou runtime desta tarefa tinha sido editado. Aviso de baseline-browser-mapping desatualizado foi emitido, mas não há evidência de que seja a causa; nenhuma dependência foi instalada/alterada.
80
+
81
+ Diagnóstico somente leitura: relatório macOS `/Users/rodrigo/Library/Logs/DiagnosticReports/node-2026-09-10-094433.ips`, captura 2026-09-10 09:44:33 -0300, PID 90349. EXC_CRASH/SIGABRT, Abort trap 6; stack contém `___BUG_IN_CLIENT_OF_LIBMALLOC_POINTER_BEING_FREED_WAS_NOT_ALLOCATED`, módulo nativo `node.napi.node`, destruição de `ExtendedEnv`. Isso prova um abort nativo do processo; não identifica com segurança o pacote causador nem prova falha de uma asserção de Table. Heap configurado reportado pelo Node: 4144 MB; não há evidência coletada de OOM.
82
+
83
+ A Table usa `@angular/build:karma`; ao contrário de Core, suas opções base não declaram karmaConfig headless. O runner headless existente `tools/karma/karma.headless.conf.cjs` pode ser passado por CLI quando o build voltar a funcionar. Nenhum arquivo de configuração foi modificado.
84
+
85
+ Por instrução explícita de parar a etapa em falha preexistente, não avançado para T02 e não adicionados C01–C06 ainda. Próxima ação proposta: diagnóstico focal do addon nativo e tentativa controlada do runner existente, sem editar configurações/dependências nem limpar checkout. Aguardando orientação sobre essa falha da baseline. G01 não aprovado. Processo de teste encerrado (exit 134); clientes MCP fechados.
86
+
87
+ ## G01 — caracterização concluída
88
+
89
+ Usuário autorizou prosseguir com diagnóstico em 2026-09-10. ExtendedEnv foi localizado no addon lmdb. Um worker sem compilação TS paralela ainda abortou; CI=true desativa cache local conforme normalize-cache.js do Angular instalado e permitiu build. O sandbox bloqueou bind do Karma; execução com permissão ampliada passou. Nenhuma dependência/configuração foi alterada e nenhum cache foi apagado.
90
+
91
+ Prefixo focal usado: `CI=true NG_BUILD_PARALLEL_TS=0 NG_BUILD_MAX_WORKERS=1 npm run test:table -- --karma-config=tools/karma/karma.headless.conf.cjs`, acrescido de `--include=projects/praxis-table/src/lib/<spec>`.
92
+
93
+ Resultados:
94
+ - expansion-runtime original: 20 SUCCESS (table-detail-t01-headless.log em /private/tmp).
95
+ - expansion-runtime + columns-sanitization: 38 SUCCESS, 3 FAILED; 15 specs de seleção preexistentes passaram. Uma falha C04 inicial era fixture sem interpolação válida, corrigida para path fixo/allowlist real.
96
+ - expansion-runtime + expansion-detail-host.integration: 54 SUCCESS, 2 FAILED (C03/C06); 30 specs de host passaram.
97
+ - C04 foi refinado para response.text como Promise controlada, garantindo que finally conclua dentro de flushMicrotasks. Execução final: 23 SUCCESS, 3 FAILED exclusivamente C03/C04/C06 (`/private/tmp/table-detail-t01-confirmed.log`). C01/C02/C05 passam. Não houve alteração de expectativas para esconder races.
98
+
99
+ Falhas comprovadas: A antiga sobrescreve A reaberta; finally antigo remove controller atual; fonte antiga sobrescreve a nova após invalidação. São regressões caracterizadas previstas pelo roteiro para T02, não falhas inesperadas que impedem avançar G01. Nenhum runtime editado em T01.
100
+
101
+ ## G02 — tokens e refresh
102
+
103
+ Tokens imutáveis por chave/revisão/geração; clear, mudança de config/resourcePath, reconciliação de dataset e destroy invalidam antes da limpeza. Results obsoletos não materializam nem disparam fallback de outra fonte. Finally HTTP só remove seu próprio controller. Colapso invalida requests sem apagar cache concluído quando retenção está habilitada. Nenhum evento público acrescentado.
104
+
105
+ Comando com o prefixo G01 e cinco includes: detail/table-detail-runtime-state.spec.ts, praxis-table.expansion-runtime.spec.ts, praxis-table.expansion-detail-host.integration.spec.ts, praxis-table.columns-sanitization.spec.ts, praxis-table.remote-regression.spec.ts. Resultado final: 187 SUCCESS (`/private/tmp/table-detail-t02-final.log`).
106
+
107
+ Primeira rodada: 183 SUCCESS/2 FAILED. Harness Object.create do teste de wiring ngOnChanges não inicializava mapas; atualizado com spy explícito da invalidação e asserção correspondente. Teste HTTP de host disparava resolução privada duplicada após clicar; ajustado para fakeAsync/tick e somente interação real no botão, preservando assert de conteúdo/fonte. Segunda rodada passou integralmente. R01 prova destruição do owner de requests; R02 cache ligado/desligado; R03 refresh; R04 cancelamento tardio; R05 nova tentativa explícita; R06 ausência de requests duplicados. Retry público do painel ainda pertence a T05.
108
+
109
+ Contrato antigo preservado neste gate; nenhum export público, manifesto ou artefato derivado de contrato mudou em T02. Docs finais serão sincronizadas em T08. Alterações de resizing/persistência preexistentes foram preservadas.
110
+
111
+ ## G03 — renderer compartilhado
112
+
113
+ `praxis-table.html` agora declara `tableDetailBodyTemplate` com parâmetros detailState/row/index e `expansionDetailNodeTemplate` no escopo da Table. A célula de expansão usa ngTemplateOutlet. O corpo e o switch de nodes foram movidos sem duplicação; preservados classes, casos, sanitização e ações. Preparação já estava separada no método ensureExpansionDetailPrepared; getExpansionDetailViewState continua verificando isRowExpanded.
114
+
115
+ Comando com prefixo G01, includes expansion-runtime e expansion-detail-host.integration: 63 SUCCESS (`/private/tmp/table-detail-t03.log`). Host prova rich lists, cards, timeline, ações, tabs e chartRef. Nenhuma nova apresentação anunciada neste gate.
116
+
117
+ ## G04 — promoção e migração local
118
+
119
+ Core promoveu o corpo completo para TableDetailConfig e behavior.detail; barrel já exporta o arquivo de modelos. Runtime consulta apenas getDetailConfig(). Migração pura em detail/table-detail-config-migration.ts é explicitamente operacional e não importada no runtime; M01–M06 passam. Inventário AST/dry-run de arquivos TypeScript identificados precedeu aplicação focal por ranges; não foi usado printer/formatação integral. Helpers de hosts e adapter da landing foram migrados explicitamente. A recipe remote-list citada inicialmente usa contrato de List (sections), não Table: não foi alterada.
120
+
121
+ Editor de comportamento agora hidrata/salva behavior.detail; conteúdo de configuração permanece preservado. As operações detail.configure, detail.source.configure e detail.presentation.configure substituem IDs antigos; acoplamento semântico completo será fechado em T07 conforme roteiro. Perfis incorporados com autorização preservam outras constraints e bloqueiam resource/resourcePath/hypermedia/surface e fallback externo no path novo.
122
+
123
+ Validações: 6 migrations SUCCESS; primeira matriz T04 150 SUCCESS/2 FAILED apenas por catálogo ausente e minProperties, corrigidos; rodada focal manifesto/perfis 59 SUCCESS; Core table-config.model.spec 5 SUCCESS; expansão com P03 34 SUCCESS. Builds build:praxis-core e build:praxis-table passaram pelo script canônico com sincronização; build praxis-page-builder passou. O closure de Core inclui AI/Dialog/Cron/Fields/Settings/VisualBuilder/MetadataEditor/RichContent/DynamicForm; não é suite integral por escolha ad hoc. Nenhum pacote foi editado manualmente.
124
+
125
+ Busca ativa Angular não encontra path antigo fora de fixtures explícitas de migração/P03 e chaves textuais i18n históricas (que não são config paths). Public docs/JSON examples em strings, vendor docs e registry são derivados pendentes de T08, sem anúncio de funcionalidade concluída. Bottom permanece bloqueado para expansão no runtime de T04. Migração remota não executada nem presumida necessária; inventário operacional continua gate de integração quando aplicável.
126
+
127
+ Logs: /private/tmp/table-detail-t04-{migration,core-build,table-build,consumer,core-spec,specs,contracts,path-removal}.log.
128
+
129
+ ## G05 — painel inferior
130
+
131
+ Painel externo ao viewport e antes da toolbar inferior, com identidade canônica, estados zero/uma/múltiplas seleções, bloqueios de configuração/identidade, retenção fora da página sem corpo, refresh interno, recolhimento explícito, altura segura e renderer compartilhado. Textos pt-BR/en-US no catálogo Table. Seleção permanece no SelectionModel existente.
132
+
133
+ Rodada final: 145 SUCCESS, includes bottom-detail, expansion-detail-host.integration e remote-regression, com o prefixo CI/headless de G01 (`/private/tmp/table-detail-t05-final.log`). Os testes de estado cobrem B01–B10; host prova seleção e desseleção pelo checkbox real, ausência de toolbar e painel externo ao viewport virtual. Duas fixtures inicialmente incompletas foram corrigidas para fornecer schemaContract/rendering obrigatórios. NG0100 no host era causado pela mutação direta da seleção, sem evento da view virtual; interação DOM real passa sem desabilitar checkNoChanges. Prova visual de altura/foco/temas e jornadas de persistência permanecem em T08; não foram declaradas como executadas.
134
+
135
+ ## G06 — implementação parcial e bloqueio comprovado
136
+
137
+ Inventário: a composição e os presenters já existem no runtime (`ja-suportado-so-ux`); a autoria de fonte estava restrita à expansão (`ja-suportado-mal-nomeado-ou-mal-materializado`). Nenhum contrato público adicional foi criado. Helper interno aplica mutações explícitas de apresentação; árvore mantém nós originais e chaves de edição somente em WeakMap. Seção Detalhes integrada ao SettingsValueProvider com estado inválido/dirty, JSON avançado, descarte e reset. Presets de observação, status/ícone, progresso e timeline foram executados pelo renderer real do host. A prévia local mostra valores de observação/texto/status/progresso e declara sua limitação; não resolve providers, gráficos ou ações. Fonte duplicada removida da UI de expansão. Controles privados antigos ainda sustentam fixtures e projeção do editor de comportamento; limpeza adicional deve ser revisada antes de fechar a etapa.
138
+
139
+ Validações executadas com o prefixo CI/headless de G01:
140
+ - baseline do editor: 30 SUCCESS (`/private/tmp/table-detail-t06-baseline.log`).
141
+ - novos testes de árvore/JSON/mutações/reset e editores: 34 SUCCESS (`/private/tmp/table-detail-t06-editor.log`).
142
+ - matriz com host real, presets e SettingsValueProvider: 67 SUCCESS (`/private/tmp/table-detail-t06-host.log`).
143
+ - comparação integral E01 de save esparso: 4 SUCCESS, 1 FAILED (`/private/tmp/table-detail-t06-sparse.log`). Expectativa preservada, sem skip.
144
+
145
+ Reprodução: abrir `{columns: []}`, editar somente `toolbar.title` e salvar. Resultado acrescenta `behavior.filtering` habilitado, `advancedFilters.enabled=true`, `settings.showAdvanced=false`, `rowConditionalStyles=[]` e `rowConditionalRenderers=[]`. A alteração de título não solicita esses campos.
146
+
147
+ Causa delimitada: `onSave`/`getSettingsValue` fazem flush de `syncFilterSettingsFromEditor` e `syncRulesFromEditor`; defaults dos filhos são tratados como autoria. Esses trechos não foram alterados por T06. Para confirmar, copiamos TS/HTML/SCSS do editor diretamente de HEAD `9dc08061483c79a1ba9cb4f1cc4765365077e6e3` para arquivos temporários, mantendo dependências do checkout migrado. O mesmo teste contra esse editor original reproduziu exatamente as três propriedades extras (1 FAILED, `/private/tmp/table-detail-t06-baseline-reproduction.log`). Isso prova a origem no fluxo preexistente do editor; não é execução de um checkout integral de HEAD.
148
+
149
+ As cópias temporárias foram removidas do workspace e arquivadas em `/private/tmp/table-detail-t06-baseline-proof/`. O teste permanente E01 permanece em `praxis-table-config-editor.init.spec.ts`. A etapa foi interrompida pela condição de parada para falha preexistente; não foi aplicada correção adicional em filtros/regras, nem relaxada a comparação integral.
150
+
151
+ Próxima correção concreta: distinguir projeção inicial dos subeditores de alterações explícitas no flush canônico, preservar configuração esparsa e provar edição/remoção intencional de filtros e regras. Em seguida, completar G06 (incluindo revisão do descarte e dos controles avançados), operações/execução agentic G07 e browser/builds/derivados G08. A skill instalada menciona helper de merge ausente; não foi criada uma fachada com esse nome para esconder a lacuna.
152
+
153
+ G06 não aprovado. T07/T08 não iniciadas. Nenhum build das alterações T06 ou jornada browser final executado; compilação via runner focal passou. Documentação pública/registry/skills ainda não sincronizados, pois a implementação não está concluída. Nenhum push, PR, deploy, release ou mutação remota. Runners encerrados; nenhum dev server foi iniciado.
154
+
155
+ ### G06 — desbloqueio e aprovação após coordenação
156
+
157
+ A coordenação esclareceu que corrigir o flush preexistente é parte de E01/T06 e da implementação autorizada. O bloqueio acima é histórico e foi resolvido; não houve nova aprovação exigida nem expansão para host/compatibilidade.
158
+
159
+ Plano focal aplicado: baseline editorial nos donos de filtros/regras; diferença entre projeção inicial e edição atual aplicada ao documento fonte pelo helper interno `table-editor-projection-delta.ts`. Hidratação não serializa defaults. Arrays são valores semânticos: lista vazia explícita/remover campo continua alteração. Filtros preservam valores padrão autorados e chaves desconhecidas; `cloneFilterSettings` não cria propriedades ausentes com undefined. Regras preservam documento no flush passivo, reidratam baseline ao receber configuração, mantêm propriedades desconhecidas em edição e removem renderers derivados das regras removidas, preservando renderers manuais. Mantidas as migrações explícitas já existentes (debugLayout retirado; Apply explícito de regras canonicaliza efeitos legados).
160
+
161
+ Provas: 102 SUCCESS após correção focal; 108 SUCCESS com novos casos de defaults explícitos, limpeza de listas, remoção de regra/renderer derivado, payload inteiro, rehidratação, reset e flush repetido (`/private/tmp/table-detail-t06-save-proof.log`). Não houve skip ou enfraquecimento de E01.
162
+
163
+ Limpeza: controles privados expansionDetail*, serialização de fonte e validadores duplicados foram removidos do BehaviorConfigEditor. Provas de fonte/JSON foram transferidas ao editor de detalhe. Host usa fixture de teste explícita, sem entrada de compatibilidade no runtime. Rodada behavior+detail+host: 63 SUCCESS (`/private/tmp/table-detail-t06-cleanup.log`).
164
+
165
+ Revisão final G06: descarte só desfaz acoplamentos que ainda pertencem ao subeditor; mudanças de seleção vindas de outra seção são preservadas. Tabs recebem tab/content válidos quando o usuário insere conteúdo dentro delas. Campos visuais de timeline e chartDocumentRef disponíveis; provider ausente é explicado e preservado. Preview local de valores não participa do payload. Detail+SettingsProvider: 16 SUCCESS (`/private/tmp/table-detail-t06-final-editor.log`). G06 aprovado pelos casos E01–E09; browser, builds de produtor/consumidor e persistência com reload permanecem gates de G08.
166
+
167
+ ## G07 — operações e registry
168
+
169
+ Classe contrato-publico/transversal: Core permanece dono do shape, Table define o manifesto/editor/runtime e Config Starter executa a semântica declarada. Lacuna real: o executor de domínio não acoplava detalhe/expansão/seleção. Handler table-detail-configure implementado sem endpoint ou storage paralelo; preserva documento desconhecido e rejeita conflitos. Catálogo cobre detail.configure, detail.source.configure, detail.presentation.configure e expansion.configure. Nenhum roteamento primário por texto foi criado.
170
+
171
+ Angular manifesto/perfis/compiler: 62 SUCCESS (/private/tmp/table-detail-t07-angular.log). Backend executor/validator: 112 testes sem falhas (/private/tmp/table-detail-t07-backend-final.log). Build Table passou (/private/tmp/table-detail-t07-table-build.log). Geração encontrou acesso encadeado a schema não resolvido pelo extrator; schema de placement passou a constante canônica direta. affectedPaths de operações somente de apresentação/interação não declaram alteração da fonte. Catálogo PASS e authoring acceptance 20/20 PASS (/private/tmp/table-detail-t08-{catalog,authoring}.log).
172
+
173
+ A04 browser passou com resposta de operação semântica controlada pelo transporte, aplicação pelo assistente e runtime em row; não representa seleção real de operação pela LLM. A lane live padrão publica catálogos em storage remoto e não foi executada. O E2E antigo em /funcionarios espera a antiga Tabela Direta, ausente no host atual; não foi enfraquecido nem anunciado como aprovado. A nova prova usa /table-expansion-renders-demo. Descoberta Playwright precisou de path absoluto ancorado para excluir cópias em .worktrees; uma tentativa reutilizou o host anterior durante encerramento, diagnosticada por connection refused.
174
+
175
+ ## G08 — fechamento em andamento
176
+
177
+ Exemplo local na rota existente: observação longa, status com ícone, progresso, timeline, chartRef resolvido pelo token canônico para provider Charts e ação explícita de contexto. Sem endpoint novo nem seleção persistida pelo host. Requests de E2E são interceptados, inclusive persistência; sem mutações remotas. Primeiro browser revelou allowlist insuficiente no exemplo; corrigida e inclusão de preset visual agora estende apenas os tipos explicitamente authorados. Hidratação não altera allowlist. Colapso bottom usa a invalidação/cache canônica da expansão; 8 testes passam (/private/tmp/table-detail-t08-collapse.log).
178
+
179
+ Browser seleção/disclosure/altura/temas e A04: 2 passed (/private/tmp/table-detail-t08-browser-second.log). Capturas revelaram tema inicial dark (nomes dos arquivos corrigidos) e mínimo intrínseco de grid do host; grid minmax(0,1fr) e tokens no exemplo corrigidos. Provas adicionais de foco e persistência em execução.
180
+
181
+ Registry: npm generate:registry:ingestion compilou tools e metadados, mas npx tentou baixar ts-node ausente e falhou por rede. Executada a mesma fonte já compilada por build:tools via node dist/tools/ai-registry/generate-registry-ingestion.js, seguida do sync-config-starter-registry-snapshot.js e validadores oficiais. Sem instalar dependências. Snapshot e hashes de teste sincronizados.
182
+
183
+ Landing: vendor-docs:sync executado; Table manifests, published guides (145) e sitemap passaram. Warning de guia cron sem Mermaid é preexistente e fora do escopo. Fonte versionada da skill table-authoring-settings não localizada em codex-skills; gap do helper ausente permanece registrado, sem inventar guidance.
184
+
185
+ ### G08 — evidências finais
186
+
187
+ - Browser oficial `http://localhost:4003/table-expansion-renders-demo`, Playwright/Chromium: **6 passed** em `/private/tmp/table-detail-t08-browser-complete.log`. Seleção A/B por teclado/checkbox, múltipla, desseleção, foco devolvido ao disclosure quando ação focada desaparece, recolhimento estável, altura fixa, texto longo e viewport 560×900, dark/light, visual save→reload→reopen sem dados selecionados no payload, chartRef com canvas do Charts e ação explícita recebendo B, fonte HTTP controlada com loading→503→retry→ready sem deslocamento da paginação, Page Builder materializando o mesmo contrato. Desktop 1440×1000.
188
+ - Na primeira prova HTTP faltava paramsMap no documento do teste; runtime rejeitou corretamente antes de qualquer request. Fixture corrigida com `paramsMap: { id: 'id' }`; nenhuma validação relaxada.
189
+ - Builds canônicos Table (incluindo closure/bridge) e consumidor Page Builder passaram: `/private/tmp/table-detail-t08-table-build.log` e `...-consumer.log`. Core havia passado em G04 e não sofreu alteração posterior de contrato.
190
+ - Matriz final Angular: **95 SUCCESS** em `/private/tmp/table-detail-t08-final-specs.log` (detail editor, host renderer, operações e manifesto). Colapso assíncrono: 8 SUCCESS. Demais suites registradas em G01–G06 não foram repetidas sem mudança relevante.
191
+ - Backend: **94 testes, zero falhas** em `/private/tmp/table-detail-t08-backend-complete.log`; após acrescentar prova de segurança de source aninhado e sincronizar o snapshot final, **48 testes, zero falhas** em `...-backend-snapshot-final.log`. Paths esperados nas fixtures seguem agora o patch atômico `behavior` e o documento `behavior.detail.source`; expectativas de rejeição de URL externa preservadas.
192
+ - Registry final: catálogo PASS sem warnings e authoring **20/20 PASS**; snapshot canônico sincronizado, hashes validados. Logs `/private/tmp/table-detail-t08-{catalog,authoring,snapshot}-final.log`.
193
+ - Landing: manifests Table, 145 guias e sitemap passaram. Vendor docs final sincronizado e validado: 73 arquivos. Sem mudanças de rotas; corpus HTTP não possui uso ativo do contrato antigo (a recipe List mantém sua própria semântica). Não há outro derivado HTTP a atualizar. README e json-api Table, projeções textuais/adapter da landing e snapshot do Config Starter atualizados. Busca residual: apenas migração, baseline/ADR/notas históricas e chaves i18n antigas sem consumidor runtime; nenhuma leitura dupla.
194
+ - Revisão visual: corrigido overflow intrínseco do grid do exemplo, mantidos controles/paginação acessíveis no estreito e contraste por tokens. Capturas finais em `/Users/rodrigo/.codex/visualizations/2026/09/10/01a08b54-9d6b-70e3-886f-64350a466eb5/table-detail-evidence/`: light/dark/narrow, editor, error, chart/action. A altura limitada exige scroll para gráfico/timeline, por decisão D9; não é recorte permanente de conteúdo.
195
+ - O runner deixou um ng serve órfão; PID 57248 identificado pelo horário/comando desta execução e encerrado explicitamente. Não há shell interativo ou dev server desta tarefa a manter.
196
+
197
+ ### Limites e integração externa
198
+
199
+ Gates locais concluídos; não foi executada LLM live, integração com backend remoto real, migração de documentos em storage remoto nem publicação. A04 comprova transporte/review/materialização da operação declarada, e não capacidade de escolha por uma LLM real. O runner live disponível publica catálogos em storage remoto e não cabe na autorização atual. Configurações remotas antigas precisam de inventário e migração finita antes de eventual integração/release; não há fallback runtime para escondê-las.
200
+
201
+ Não rodadas suites integrais, build completo da landing nem live HTTP de produção; validação focal foi suficiente para os contratos alterados e seus consumidores diretos locais. Nenhum push, PR, deploy ou release. Alterações preexistentes foram preservadas, inclusive derivações geradas pelo sincronizador oficial a partir do checkout compartilhado. Fonte canônica da skill ausente: sem alteração ou sync de skill nesta tarefa.
202
+
203
+ ## Fechamento da revisão abrangente posterior
204
+
205
+ Ver `table-bottom-detail-review.md`. Corrigidos isolamento de estado em troca corporativa, escopo de extensões nos executores, validação estrutural conhecida, Apply/hidratação de `initiallyCollapsed` e adição na raiz tabs. Validação: 223 specs Angular + 4 de operações após ajuste final; 166 Java; 6 E2E; builds Table/Page Builder; registry e vendor docs aprovados. T00–T08 continuam sendo evidência de implementação local, sem certificar transporte/segurança multi-tenant real, persistência backend ou IA live. Pendência prioritária: integração corporativa da fonte `resourcePath`, cujo `fetch` não usa interceptores Angular.
@@ -0,0 +1,159 @@
1
+ # Revisão abrangente do detalhe contextual — 2026-09-10
2
+
3
+ ## Escopo e método
4
+
5
+ Revisão das implementações T00–T08 do detalhe contextual, comparadas com o runbook da raiz agregadora, o código atual e os testes. O checkout contém outras alterações preexistentes; este documento não certifica o monorepo inteiro. Classificação final: `transversal` + `contrato-publico`, devido à formalização de `EnterpriseRuntimeRequestHeaders` e `effectiveRequestHeaders()` no Core. É uma projeção explícita das fontes de headers já existentes, não uma segunda fonte de contexto. Fontes canônicas: Core para modelo de detalhe/contexto corporativo; Table para consumo, editor e runtime; Config Starter para execução determinística de operações authoradas por IA. Não foi introduzido roteamento textual de intenção.
6
+
7
+ Mapa de impacto: Table, executor Java, consumidor Page Builder, docs públicas/registry e projeção vendorizada da landing. Validação mínima: testes focais dos dois executores, host real, builds Table/consumidor e browser de editor/persistência. A mudança de elegibilidade de dados em troca de contexto é intencional: hosts locais precisam entregar um novo array e rejeitar suas próprias respostas antigas.
8
+
9
+ ## Achados
10
+
11
+ | Prioridade | Achado e consequência | Tratamento/evidência |
12
+ |---|---|---|
13
+ | P1 | O evento corporativo fechava editores, mas mantinha linhas, seleção e detalhe. Um mesmo ID em outro tenant podia continuar associado ao estado anterior na UI. | Corrigido em `handleEnterpriseContextChange`: identidade baseada no contrato existente, invalidação de requisições/linhas/discovery/seleção; bloqueio do array local anterior. Host real exercita A→B, resposta tardia A e nova linha B com mesmo ID. Teste remoto rejeita dados A após novo carregamento B. Não demonstra acesso indevido no backend. |
14
+ | P2 | `detail.source.configure` no executor Java interpretava uma extensão `source.presentation` como comando de apresentação. Divergia do TypeScript e podia ativar seleção/expansão fora da intenção resolvida. | Corrigido: source altera apenas source; extensões são preservadas sem efeito de comando. Testes Java/TS. |
15
+ | P2 | JSON válido sintaticamente com grupos em arrays, booleanos em string ou modo de fonte desconhecido passava por caminhos de authoring. | Validação dos grupos/discriminadores conhecidos no helper, editor e documento completo; executor Java equivalente. Extensões desconhecidas permanecem preservadas. Não se trata de validação exaustiva de todos os providers/nós de terceiros. |
16
+ | P2 | `initiallyCollapsed` só era aplicado via input/config externo; hidratação assíncrona e Apply interno divergiam do roteiro. | Reset centralizado nos três caminhos. Host testa Apply; V07 de browser passa a exigir checkbox salvo, corpo recolhido após Save e após reload/hidratação. |
17
+ | P2 | Inserir conteúdo diretamente na raiz `layout: tabs` criava nó que o renderer não materializava. | Editor envolve o novo conteúdo em `tab`, inclui o tipo na allowlist existente e preserva o conteúdo. Regressão do editor. |
18
+ | P2 | O painel inferior era inserido entre a grade e paginação/toolbar, quebrando a leitura visual da coleção. A decisão D9 original não era sustentada pelas referências iniciais, que tratavam detalhe inline. | Default corrigido para `afterControls`; `beforeControls` permanece uma escolha explícita. O laboratório dedicado permite comparar as duas ordens com paginação e toolbar inferior. |
19
+ | P2 | O Core já aceitava altura dinâmica, mas runtime/editor bloqueavam esse modo e sempre reservavam uma região fixa. | `dynamic` agora acompanha o conteúdo; `fixed` mantém região rolável e exige pixels positivos. `emptyBehavior=hide` remove a superfície sem seleção elegível ou com documento vazio. |
20
+ | P2 | O editor apresentava altura ausente como automática, enquanto o runtime aplicava silenciosamente 192 px. | Altura ausente agora é dinâmica em editor, runtime e documentação; 192 px permanece apenas como baseline do modo fixo. Regressão focal cobre a ausência da configuração. |
21
+ | P2 | `emptyBehavior=hide` removia o elemento em alguns estados, mas os arredondamentos de tabela/paginação ainda consideravam um painel inferior presente. | A elegibilidade da superfície inclui seleção visível não ambígua e documento inline ou já resolvido não vazio. Erros, bloqueios e conflitos continuam renderizados para diagnóstico. |
22
+ | P2 | O editor de detalhe apresentava controles planos e não explicava impacto de posição, altura e estado vazio. | Reorganizado em Apresentação, Fonte, Composição, Inspector, Prévia e JSON avançado, com escolhas visuais e textos de consequência. |
23
+ | P2 | No painel lateral, hints de duas linhas invadiam os campos seguintes e o grid esticava inputs curtos até a altura do vizinho. | Os `MatFormField` agora dimensionam o subtexto dinamicamente e o grid alinha campos pelo início. O E2E mede que hints terminam antes dos controles seguintes. |
24
+ | P2 | Alterações feitas pelos controles visuais de Detalhes eram válidas e atualizavam a configuração, mas o estado local do editor continuava informando `dirty=false`. Isso podia deixar o comando de salvar incoerente com o conteúdo mostrado. | Corrigido comparando somente `behavior.detail` com o baseline do editor. Regressão prova `dirty=true` após inserir um callout e retorno a `false` após descartar. |
25
+ | P2 | Uma ação declarada apenas dentro de `richContent.document` era considerada disponível mesmo sem existir em `actions.row.actions[]`. O conteúdo visual passava a introduzir um comando fora do catálogo da Table. | Corrigido em modo fail-closed: referências não declaradas ficam indisponíveis; ações declaradas continuam no pipeline `rowAction`, com capability, confirmação e autorização mantidas pelos donos existentes. README, JSON API e skill registram a regra. |
26
+ | P2 | O tipo público de `inlineSchema` aceitava um documento ou um único `TableDetailSchemaNode`, mas o normalizador tratava todo objeto como documento e descartava um nó isolado. Com `emptyBehavior=hide`, conteúdo válido também podia desaparecer. | O normalizador agora envolve nós isolados em um documento stack e converte um nó `tabs` na raiz para o layout correspondente. A elegibilidade de conteúdo usa a mesma normalização. Regressão focal cobre o nó único. |
27
+ | P2 | O painel anunciava loading/erro duas vezes, pela região de estado do shell e pelo renderer compartilhado. O host Rich Content também não materializava `requiresCapabilities`, apesar de o contexto corporativo já publicar capabilities. | O shell anuncia apenas estados sem `detailState`; loading/erro ficam sob o renderer que já possui `status`/`alert`. `RichBlockHostCapabilities.hasCapability` consulta exclusivamente `EnterpriseRuntimeContext.capabilities`; authorities não são inferidas como capabilities. |
28
+ | P3 | A remoção de itens dentro de `card.content[].compose.items[]` era imediata, embora os demais níveis aninhados exigissem confirmação. | Alinhada ao fluxo confirmar/cancelar do editor canônico e coberta por teste focal. |
29
+ | P3 | O título da confirmação iniciada por Rich Content estava fixo em português. | Substituído por `table.detail.confirmActionTitle`, com recursos `pt-BR` e `en-US` e suporte a override de localização da Table. |
30
+ | P2 | O editor Rich Content ficava comprimido dentro do inspector e permitia que o usuário saísse com um rascunho interno ainda não aplicado, fazendo o Save externo persistir o documento anterior. O JSON avançado ainda podia substituir esse rascunho. | O authoring rico passou para largura total, assina `isDirty$`/`isValid$`, mostra estado sincronizado/pendente/inválido e bloqueia Save, troca de nó, reorder, remoção, novos presets e substituição via JSON até Aplicar composição ou descartar. Quick starts, rótulos semânticos e navegação roving por teclado reduzem carga cognitiva. |
31
+ | P1 | O editor visual não materializava um `inlineSchema` composto por um único nó, apesar de esse shape fazer parte do contrato público e funcionar no runtime. | A árvore visual usa a mesma normalização semântica do runtime; o nó fica selecionável e, na primeira edição explícita, é salvo como documento stack preservando extensões. |
32
+ | P1 | `source.mode=resource` não podia ser concluído pelo editor visual porque `kind` e `version` estavam ocultos; fontes incompletas ainda eram consideradas válidas pelo Settings Panel. | O editor expõe a identidade completa do recurso, método/allowlist/fallback do caminho HTTP e bloqueia fontes explícitas incompletas ou inseguras antes de Apply/Save. |
33
+ | P1 | Uma resposta HTTP 404 com corpo semelhante a schema podia ser materializada como detalhe válido. | Todo status não-2xx agora falha fechado; o corpo de erro não entra no renderer e somente o fallback governado pode assumir a resolução. |
34
+ | P1 | O manifesto Rich Content declarava `root-class-safe`, mas editor e runtime não aplicavam o validador a `rootClassName`. | O owner Rich Content agora bloqueia tokens inválidos no editor e descarta o valor no runtime caso um host contorne o authoring. |
35
+ | P3 | O modo dinâmico mantinha `scrollbar-gutter: stable` mesmo sem overflow, deixando um trilho visual vazio ao lado de cards curtos. | O modo dinâmico usa gutter automático; o modo fixo preserva a região rolável estável. Conteúdo que ultrapassa o teto responsivo de `40dvh` continua rolável por desenho. |
36
+ | P1 | O fallback `resource` podia ser selecionado enquanto seus campos `kind/id/version` ficavam ocultos, e um fallback igual à fonte primária era aceito embora nunca pudesse ser executado. | A identidade do recurso permanece visível quando ele é fallback; ciclos são recusados pelo editor e pelo executor semântico. |
37
+ | P1 | O JSON avançado podia persistir Rich Content inválido e referências de ação inexistentes; o runtime apenas as suprimia depois. Os presets ainda inventavam `review-request` para qualquer domínio. | A Table reutiliza os validadores públicos do owner Rich Content, bloqueia `actionId` local não declarado e os quick starts criam composição neutra, sem ação de negócio inventada. O runtime continua sendo a segunda defesa para documentos remotos. |
38
+ | P2 | Voltar de altura fixa para dinâmica preservava `px`, deixando uma instrução inativa e ambígua no documento. | O editor remove somente `height.px` ao selecionar altura dinâmica e preserva extensões desconhecidas do grupo. |
39
+ | P1 | `lazyLoad.enabled/actionId/cache.ttlMs/retry.maxAttempts/dedupeByRowKey` existiam no tipo público, mas não tinham efeito runtime comprovado. | Os campos foram marcados como compatibilidade depreciada e documentados como não operacionais. Apenas retenção por `cache.enabled` e cancelamento por `cancelOnCollapse` são assumidos pelo runtime atual. |
40
+ | P3 | O registro de progresso misturava baseline histórico com estado final e podia sugerir certificação mais ampla. | Seções históricas identificadas e este relatório vinculado. Evidência local separada de backend real, IA live e adoção corporativa. |
41
+
42
+ ## Planejado × executado × documentado
43
+
44
+ | Área do roteiro | Resultado da revisão |
45
+ |---|---|
46
+ | T02: concorrência por registro/contexto | Tokens por detalhe já existiam, mas faltava conectar o evento corporativo real e invalidar elegibilidade da linha. Corrigido sem novo contrato. |
47
+ | T04: um único contrato de detalhe | `behavior.detail` permanece canônico, expansão possui interação. Migração finita sem leitura dupla; nenhum novo campo `x-ui`. |
48
+ | T05: exatamente uma seleção visível | Sem seleção paralela; troca corporativa elimina retenção por ID do contexto anterior. |
49
+ | T06: editor, preview, persistência | Corrigidas validação estrutural, raiz tabs e aplicação do estado recolhido. Save/reload de browser usa storage HTTP simulado; não é prova de ETag/conflito de backend real. |
50
+ | T07: operação semântica e execução | Corrigida divergência de escopo Java/TS. Testes exercitam compilação determinística depois da escolha de operação; não provam escolha pela LLM live. |
51
+ | T08: consumidores e derivados | Build do consumidor e jornadas focais repetidos; docs/registry/landing sincronizados conforme evidências abaixo. |
52
+ | D9: altura e empilhamento do bottom | A decisão original foi revista após evidência visual. Altura dinâmica é suportada; altura fixa é opcional e validada. O default mantém controles da coleção antes do painel contextual. |
53
+
54
+ ## Inventário de aderência
55
+
56
+ - `ja-suportado-mal-nomeado-ou-mal-materializado`: contexto corporativo, cancelamento por geração, seleção canônica, `initiallyCollapsed` e estrutura de abas já existiam; faltavam conexões de consumo.
57
+ - `suportado-parcialmente`: validação conhecida de documentos e paridade de operações; cobertura ampliada sem descartar extensões.
58
+ - `ja-suportado-mal-nomeado-ou-mal-materializado`: `height.mode=dynamic` já existia no Core, mas não era materializado pelo runtime/editor inferior.
59
+ - `ja-suportado-so-ux`: composição Rich Content, bindings de campos e identidade canônica já existiam; o editor e o laboratório agora tornam essa capacidade visível.
60
+ - `lacuna-real-de-contrato`: `bottomStackPosition` e `emptyBehavior` eram dados ausentes para authorar ordem e ausência total de superfície. Foram adicionados à fonte canônica Core e publicados no manifesto Table.
61
+
62
+ ## Avaliação corporativa e pendências
63
+
64
+ **Não há certificação corporativa completa.** A revisão agora comprova isolamento de estado no componente e endurecimento do endereço/transporte `resourcePath`. Permanecem gates específicos:
65
+
66
+ 1. **P1 residual, autorização de detalhe `resourcePath`:** o runtime agora exige URL relativa na origem real do host, canonicaliza o pathname antes da allowlist, rejeita traversal/representações ambíguas e redirects, usa credenciais same-origin e incorpora `EnterpriseRuntimeContextService.effectiveRequestHeaders()`. Continua usando Fetch para impedir o encaminhamento prévio de headers/corpo em redirects. Por isso interceptors Angular de autenticação/XSRF não participam. `resourceAllowList` é guardrail do documento, não autorização nem política por método. Hosts dependentes desses interceptors devem usar `source.mode=resource` com o resolver governado ou configurar os headers no contexto enterprise. O backend continua responsável por autorização de GET/POST e objeto.
67
+ 2. A integração HTTP isolada do quickstart provou contexto/tenant/perfil, troca de tenant, identidade derivada do principal em modo corporativo, autorização fail-closed e ETag de referência. Ainda faltam revogação durante uma requisição, resposta deliberadamente atrasada, autorização de objeto/campo/ação do endpoint concreto de detalhe e persistência após restart contra PostgreSQL. A invalidação de linhas não certifica essas fronteiras.
68
+ 3. Em `data` local, a Table não conhece a proveniência de um novo array entregue pelo host. O host deve rejeitar respostas antigas e fornecer dados do contexto efetivo. Reutilizar o array antigo fica bloqueado; uma nova referência não é prova de autorização.
69
+ 4. IA live, persistência PostgreSQL com restart/conflitos, CSP corporativa, tecnologias assistivas reais, carga/volumetria e políticas específicas de providers externos não foram exercitadas nesta revisão. Existem credenciais de provider nos arquivos governados locais, mas o procedimento live oficial também aponta os dois datasources para PostgreSQL externo; ele não foi iniciado para evitar mutação compartilhada não autorizada. As jornadas automatizadas usam API simulada. O laboratório interno cobre altura dinâmica/fixa, conteúdo curto/abas/longo/vazio, ausência orientada/oculta, duas ordens de empilhamento, paginação, toolbar inferior e larguras ampla/média/estreita.
70
+ 5. A altura dinâmica tem teto operacional de `40dvh`; splitter e limites min/max authoráveis não fazem parte do contrato atual.
71
+ 6. O transporte Fetch de `resourcePath` lê o corpo completo antes do parse e ainda não possui orçamento de bytes configurável no cliente. Em uso corporativo, gateway e endpoint precisam impor limites de resposta e timeout; promover esse orçamento para configuração exigirá uma decisão canônica e testes de compatibilidade.
72
+
73
+ ### Revisão de integridade posterior — fallback, Rich Content e registry
74
+
75
+ - O editor agora mantém `kind`, `id` e `version` visíveis quando `resource` é apenas o fallback e remove da lista o modo primário atual. Editor Angular e executor Java recusam fallback cíclico ou incompleto após mesclar o patch parcial com a configuração persistida.
76
+ - A validação da Table percorre todo `inlineSchema` ativo, reutiliza o validador canônico do Rich Content, valida `rootClassName` e bloqueia `actionId` que não exista em `actions.row.actions[]`. Presets neutros não inventam ações de domínio.
77
+ - O manifesto Table publica `detail-source-fallback-valid`, `detail-inline-rich-content-valid` e `detail-action-reference-declared`; o Config Starter executa esses IDs de forma determinística. O gate de aceitação do registry voltou a `20/20 PASS` depois da sincronização do executor e do snapshot.
78
+ - `lazyLoad.enabled`, `actionId`, `cache.ttlMs`, `retry.maxAttempts` e `dedupeByRowKey` foram marcados como compatibilidade depreciada porque não têm efeito runtime comprovado. `cache.enabled` e `cancelOnCollapse` continuam sendo os comportamentos operacionais atuais.
79
+ - Evidência focal desta rodada: Table `87/87`, Rich Content `51/51`, executor Java `44/44`, laboratório Playwright `3/3`, build oficial da Table aprovado, catálogo com zero erros/warnings e authoring `20/20`.
80
+
81
+ ## Skills e documentação
82
+
83
+ Atualizada a skill canônica `codex-skills/praxis-table-authoring/SKILL.md` com escopo das operações, estado de seleção, altura, persistência, teste de contexto, Rich Content contextual e a separação entre allowlist, transporte e autorização. Como os scripts `sync-praxis-skills.ps1`/`bootstrap-praxis-skills.ps1` não existem neste workspace, essa skill foi sincronizada de forma focal com a cópia instalada e comparada byte a byte. A fonte canônica versionada da skill específica `praxis-rich-content-authoring-settings` não existe em `codex-skills/`; o novo suporte a `compose` aninhado foi documentado no README canônico da lib e o gap da skill permanece registrado, sem criar uma segunda fonte improvisada.
84
+
85
+ Atualizados README Core/Table, JSON API, contrato de dados locais e registro de progresso. Não há endpoint ou payload HTTP novo. O novo tipo/método público apenas materializa, com precedência explícita, headers que já podiam vir de global factory, host factory, fallback e snapshot. Consumidores impactados: Table `resourcePath` e hosts que optarem pela operação; `headers()` preserva sua semântica context-only para evitar recursão em factories existentes. Registry/snapshot e documentação vendorizada foram sincronizados.
86
+
87
+ ## Validação desta revisão
88
+
89
+ - Revisão visual de empilhamento/editor: 76/76 testes focais de runtime, editor e manifesto; builds Core e Table aprovados; bundle do host aprovado com cache persistente desabilitado pelo modo `CI=1` já documentado.
90
+ - Laboratório `/table-bottom-detail-lab`: verificados estado orientativo, ausência total com `emptyBehavior=hide`, altura dinâmica, conteúdo em abas, identidade selecionada legível e ordem toolbar inferior → paginação → detalhe. A mesma rota expõe altura fixa, conteúdo longo/vazio, ordem alternativa e três larguras para inspeção manual.
91
+ - Registry regenerado: catálogo PASS com zero erros/warnings, authoring 20/20 e snapshot Config Starter 9/9. O hash canônico permaneceu estável na segunda regeneração após o ajuste editorial do JSON API.
92
+ - Angular: 223/223 testes focais aprovados (`table-detail-review-specs-final.log`), incluindo host corporativo e resposta remota tardia. Após o último ajuste de extensão em `detail.configure`, 4/4 testes de operações reexecutados (`table-detail-review-operation-final.log`).
93
+ - Endurecimento `resourcePath`: 51/51 testes Table aprovados após a correção final, incluindo colisão do marcador interno de wildcard. Evidência final: `/private/tmp/table-detail-resourcepath-table-51-final.evidence.txt` (resumo registrado da execução interativa, sem se apresentar como stdout bruto).
94
+ - Headers corporativos Core: 9/9 testes aprovados, incluindo precedência case-insensitive, `includeGlobalFetchHeaders=false` e factory global que consome `headers()` sem recursão. Evidência final: `/private/tmp/table-detail-resourcepath-core-9-final.evidence.txt` (resumo registrado da execução interativa, sem se apresentar como stdout bruto).
95
+ - Java: 166 testes aprovados, sem falhas/erros, incluindo operações, validadores, manifesto e snapshot regenerado (`table-detail-review-backend-final.log`).
96
+ - Após alinhar a política de path/query e regenerar o snapshot: 98/98 testes Java focais aprovados (`AgenticAuthoringValidatorRegistryTest`, `TableDetailAuthoringSemanticsTest`, `AgenticAuthoringManifestServiceTest`, `AiRegistrySnapshotContractTest`).
97
+ - Build oficial Table e sua cadeia de dependências aprovado; build Page Builder aprovado. Após o último ajuste interno de operação, novo build focal Table aprovado (`table-detail-review-build-final.log`).
98
+ - Após formalizar `EnterpriseRuntimeRequestHeaders`/`effectiveRequestHeaders()`, o build oficial de Core→Table e dependências foi novamente aprovado. O bundle completo do host com a API final também foi aprovado em 26 s (`CI=1 NG_BUILD_MAX_WORKERS=2 ... ng build ...`); stdout/stderr bruto final: `/private/tmp/table-detail-review-host-build-final.log`. O `exit 134` anterior foi reproduzido e isolado no cache persistente LMDB usado pelo Angular dentro do sandbox macOS: desabilitar efetivamente esse cache via ambiente de CI eliminou o abort sem alterar código, AOT ou source maps. Um symlink circular acidental `node_modules/node_modules -> node_modules` também foi removido, mas sua remoção isolada não resolveu o abort. Referência upstream: `angular/angular-cli#33413`.
99
+ - Browser: 6/6 jornadas aprovadas (`table-detail-review-browser.log`), incluindo Save/reload recolhido. Executadas antes do último ajuste de interpretação de extensão; esse ajuste foi coberto pelo teste focal posterior, sem repetir jornadas que não usam essa extensão.
100
+ - Browser interno visível: a jornada abrangente confirmou foco nomeado da região rolável, `End` até chart/ação final, foco visível, paginador fora do corpo e utilizável, mensagem de seleção fora da página, retorno, estado explícito de múltipla seleção, troca Aurora→Boreal com atualização para 80% e recolhimento/reabertura preservando Boreal. Após a correção interna do marcador de wildcard, que não altera a UI, a prova repetiu rota, seleção Aurora, foco, rolagem com `End` e isolamento do paginador sobre o código servido com cache persistente desabilitado. A rota dedicada foi reaberta nesta revisão e permanece disponível para inspeção manual.
101
+ - Quickstart corporativo com HTTP/H2 isolado: 12/12 testes aprovados nas classes `EnterpriseRuntimeContextQuickstartIntegrationTest` (5), `ReactiveDeterminationTenantScopeHttpTest` (3) e `GovernedUiCompositionTemplateReferenceQuickstartIntegrationTest` (4). Essas classes sobem Spring Boot em porta aleatória com H2 e provam propagação e troca de contexto/tenant/perfil, escopo derivado do principal do servidor com headers conflitantes ignorados, resolução governada/fail-closed de template e comportamento de ETag, sem escrever no PostgreSQL configurado. Evidência bruta: `praxis-api-quickstart/target/surefire-reports/TEST-com.example.praxis.apiquickstart.config.EnterpriseRuntimeContextQuickstartIntegrationTest.xml`, `praxis-api-quickstart/target/surefire-reports/TEST-com.example.praxis.apiquickstart.config.ReactiveDeterminationTenantScopeHttpTest.xml` e `praxis-api-quickstart/target/surefire-reports/TEST-com.example.praxis.apiquickstart.config.GovernedUiCompositionTemplateReferenceQuickstartIntegrationTest.xml`.
102
+ - Quickstart, políticas diretas sem servidor HTTP: 9/9 testes aprovados em `QuickstartGovernedPlatformRequestAuthorizationProviderTest` (6) e `ProductionDemoAuthenticationGuardTest` (3). Eles provam delegação e rejeições fail-closed de origem/path, além da proteção de segredo em produção. Evidência bruta: `praxis-api-quickstart/target/surefire-reports/TEST-com.example.praxis.apiquickstart.security.QuickstartGovernedPlatformRequestAuthorizationProviderTest.xml` e `praxis-api-quickstart/target/surefire-reports/TEST-com.example.praxis.apiquickstart.security.ProductionDemoAuthenticationGuardTest.xml`.
103
+ - Registry: catálogo PASS, zero errors/warnings; authoring 20/20 PASS. Snapshot sincronizado com Config Starter e validado nos testes Java.
104
+ - Revisão criteriosa posterior: 95/95 testes focais de detalhe, integração do host e manifesto aprovados. As regressões adicionais provam bloqueio fail-closed e substituição por placeholder seguro, conforme a política configurada, de estilo inseguro em presenter Rich Content vindo do schema remoto; presenters de cartões, mídia e schemas repetidos agora passam também pelo validador canônico Rich Content. O manifesto passou a publicar `contextMap` e `fallbackMode`, textos hardcoded foram substituídos por i18n e `emptyText` authorado passou a ser respeitado.
105
+ - Após essa revisão, a ingestão foi regenerada com catálogo PASS, zero errors/warnings e authoring 20/20 PASS; o contrato do snapshot no Config Starter aprovou 9/9 testes.
106
+ - Revisão final de coerência visual e de defaults: 29/29 testes focais de runtime/editor e, após ampliar os casos reais, 3/3 jornadas Playwright do laboratório aprovadas. As jornadas verificam ordem toolbar inferior → paginação → detalhe, ausência de geometria residual em seleção/documento vazio, altura automática/fixa, seções do editor, não sobreposição dos hints, callout com ícone/tom/ação, card contextual, espaçamento mínimo e ausência de overflow no modo estreito.
107
+ - Segunda revisão de integridade: 73/73 testes focais da Table e 40/40 do editor Rich Content aprovados. A bateria cobre estado `dirty`, equivalência estrutural independente da ordem das propriedades JSON, disponibilidade fail-closed de ações não declaradas, dispatch de ação declarada, edição guiada de `compose` dentro de card e remoção confirmada. O build oficial de Core → Table e dependências passou; as 3/3 jornadas Playwright do laboratório foram repetidas sem cliques condicionais ou tentativas adaptativas.
108
+ - Revisão arquitetural adicional do runtime: 54/54 testes focais aprovados após alinhar `inlineSchema` de nó único ao contrato público, eliminar anúncios duplicados durante resolução assíncrona e mediar `requiresCapabilities` pelo contexto corporativo. O aviso Angular sobre `showToolbar` no harness já existia e não falhou a suíte.
109
+ - Revisão hands-on de Design/UX: especialistas montaram callout e card pelo editor real, verificaram temas claro/escuro e larguras ampla/média/estreita. A integração final aprovou 78/78 testes combinados de editor/runtime; após preservar extensões do nó raiz `tabs`, o spec de bottom detail aprovou 16/16. O E2E atualizado aprovou 3/3 cenários, incluindo card mode responsivo e ausência de overflow horizontal. O host local permite Aplicar composição; Salvar e fechar depende do endpoint de persistência e foi provado no E2E com API simulada.
110
+ - Landing: 73/73 documentos vendorizados em sincronia; manifests Table, 145 guias e sitemap aprovados. Aviso editorial preexistente: guia `praxis-cron-builder-overview` sem Mermaid oficial, fora deste escopo.
111
+ - Revalidação documental final: 73/73 vendors, manifest com 25 itens e sitemap em sincronia. `git diff --check` passou nos arquivos tocados; o check global da Landing ainda encontra whitespace preexistente em `playground-source.adapters.ts:2624`, fora deste escopo.
112
+ - `git diff --check` focal sem erros. Processos Playwright foram encerrados; o servidor do laboratório permanece na porta 4003 para a validação visual solicitada nesta sessão.
113
+
114
+ Artefatos finais desta rodada: `/private/tmp/table-detail-resourcepath-table-51-final.evidence.txt`, `/private/tmp/table-detail-resourcepath-core-9-final.evidence.txt` e `/private/tmp/table-detail-review-host-build-final.log`. Os dois primeiros são resumos explícitos de execuções interativas; o terceiro contém stdout/stderr bruto. Logs históricos como `table-detail-resourcepath-focal-final.log` (74 testes) e `table-detail-resourcepath-core-2.log` (6 testes), assim como globs genéricos, não identificam a evidência final e não devem ser citados para esses resultados. Nenhum deles é artefato de release.
115
+
116
+ Falhas intermediárias de compilação/fixture e os aborts de bundle diagnosticados acima não contam como gates aprovados. Não havia listener oficial em 8088. A auditoria dos nomes, sem leitura ou exposição dos valores, confirmou credenciais OpenAI nos arquivos locais e datasources JDBC externos; por isso o smoke live oficial não foi iniciado. HTTP corporativo isolado foi executado; IA live e persistência externa não. Suites integrais não foram repetidas. A validação focal cobre os fluxos alterados. Os gates remanescentes exigem outro ambiente corporativo isolado, com PostgreSQL, proxy/autenticação e provedores dedicados; não resta validação local independente, autorizada e executável neste workspace sem tocar estado externo compartilhado.
117
+
118
+ ### Nota operacional para o sandbox macOS
119
+
120
+ O Angular 21 habilita por padrão o cache persistente local em `.angular/cache`. Nesse sandbox, o binding nativo LMDB tenta usar semáforos System V bloqueados pelo seatbelt e encerra o processo com `SIGABRT`/134 antes que o `try/catch` JavaScript consiga reportar a causa. Para builds e `ng serve` de validação neste ambiente, usar `CI=1` desabilita o cache porque a configuração padrão é `environment: local`; confirme com `npx ng cache info`. Isso é uma adaptação do ambiente de validação e não deve ser gravado como desativação global no produto. Fora do sandbox, preserve o cache normal.
121
+
122
+ ## Encaminhamento executado — transporte corporativo de resourcePath
123
+
124
+ **Estado: política de endereço e redirect corrigida; adoção corporativa permanece condicionada ao modelo de autenticação do host e a prova HTTP real.** A promoção para bottom reutiliza o mesmo resolver de row. A correção foi feita nesse ponto comum, sem criar uma segunda implementação.
125
+
126
+ Revisão editorial posterior classificou a configuração de mensagens e Rich Content assim:
127
+
128
+ - `ja-suportado-so-ux`: textos do shell `table.detail.*` já aceitam override por `localization.translations`, mas o editor de Detalhes não oferece campos dedicados.
129
+ - `ja-suportado-mal-nomeado-ou-mal-materializado`: `contextMap` e `fallbackMode` já existiam no contrato/runtime e foram publicados no schema das operações do manifesto; `emptyText` de lista passou a ser respeitado no template.
130
+ - `suportado-parcialmente`: o corpo selecionado usa presenters Rich Content e o editor guiado cobre os presets frequentes, enquanto propriedades avançadas continuam no JSON; bindings `*Expr` resolvem paths e composições multi-campo usam nós `compose`.
131
+ - `lacuna-real-de-contrato`: zero/múltipla seleção e demais estados do shell ainda não aceitam um `RichContentDocument`. Uma futura evolução deve reutilizar o modelo canônico do Core, sem criar campos locais de cor, ícone ou HTML na Table.
132
+
133
+ Inventário de fronteiras existentes:
134
+
135
+ - [Table: execução atual](../src/lib/praxis-table.ts#L8400) aceita GET/POST, interpola valores com `encodeURIComponent`, exige `resourceAllowList`, resolve pela base real do documento e compara a origem final com `location.origin`. O request usa a URL absoluta canonicalizada, `credentials: same-origin`, `redirect: error` e `referrerPolicy: same-origin`. Rotas sem barra inicial preservam a semântica da base do documento somente quando essa base também pertence à origem confiável.
136
+ - `projects/praxis-core/src/lib/services/resource-discovery.service.ts:141` já usa `HttpClient`, mas `fetchJson` é GET e `resolveHref:161` resolve relativos contra a API configurada, não necessariamente contra a origem do documento. Não é substituto transparente para GET/POST same-origin.
137
+ - `projects/praxis-core/src/lib/tokens/table-detail-resource-resolver.token.ts:14` é a fronteira existente de documentos governados em `source.mode=resource`; não é um executor genérico de `resourcePath`. Um host pode implementar esse modo declarado com seu transporte autorizado, mas não deve usá-lo como alias oculto de URLs arbitrárias.
138
+ - `projects/praxis-core/src/lib/services/enterprise-runtime-context.service.ts:100` mantém `headers()` como projeção context-only e publica `effectiveRequestHeaders()` para agregar headers globais permitidos, factory do host, fallback e snapshot efetivo com precedência case-insensitive; `includeGlobalFetchHeaders=false` também vale para essa superfície. A separação evita recursão quando `PAX_FETCH_HEADERS` chama `headers()`. Os headers efetivos só são anexados depois do gate same-origin e não substituem autorização de backend.
139
+
140
+ **Achado P1 de fronteira de rota corrigido:** a comparação lexical foi substituída por política isolada e testável. Segmentos `.`/`..`, separadores codificados ou duplamente codificados, barras invertidas, schemes, protocol-relative e base externa são rejeitados antes do fetch. A allowlist compara somente o pathname canonicalizado; query continua contrato do endpoint. O marcador usado durante a canonicalização de wildcards é escolhido sem colisão com o valor literal da regra. Redirect é rejeitado pelo próprio request antes de reutilizar headers/corpo em outro destino.
141
+
142
+ Cenários afetados: detalhe row e bottom com `resourcePath`, GET e POST; hosts com Bearer/XSRF/interceptores de tenant/perfil; rotas relativas/proxy; allowlists amplas e redirecionamentos. Inline não usa esse transporte. `resource` depende do provider do host; `hypermedia` possui sua própria cadeia de discovery. Nenhum desses outros modos foi certificado apenas por esta comparação.
143
+
144
+ Resultado do plano (classe `arquitetural`, impacto comportamental fail-closed):
145
+
146
+ 1. **Core + Table:** política same-origin/canonical pathname aplicada antes de obter e encaminhar headers; todos os redirects são rejeitados.
147
+ 2. **Core:** contexto enterprise permanece a fonte única. `headers()` conserva o contrato context-only; `effectiveRequestHeaders()` honra factory/global/fallback/snapshot e evita duplicatas por variação de caixa.
148
+ 3. **Table:** token de geração, cancelamento, fallback, sanitização, `paramsMap`, GET/POST e corpo mínimo foram preservados. GET/POST positivo e bloqueios de rota não chamam fetch fora da política.
149
+ 4. **Config/authoring:** validator Java rejeita as mesmas formas ambíguas no path/allowlist; query não é reinterpretada como path. README, JSON API, contexto de IA e skill registram o limite de autorização.
150
+ 5. **Gate ainda aberto:** autenticação/XSRF baseada exclusivamente em interceptors Angular, autorização real por tenant/perfil/objeto/método, revogação e proxy oficial precisam de prova HTTP autenticada. Isso não pode ser inferido dos mocks. Um eventual contrato host-owned por método seria `lacuna-real-de-contrato`; não foi criado sem evidência de adoção porque `source.mode=resource` já oferece a fronteira governada para hosts com transporte próprio.
151
+
152
+ ## Referências dos achados corrigidos
153
+
154
+ - Contexto e elegibilidade: `src/lib/praxis-table.ts:3656`, `:2646` e `:17461`; regressões `praxis-table.expansion-detail-host.integration.spec.ts` e `praxis-table.remote-regression.spec.ts`.
155
+ - Escopo de operação: `src/lib/detail/table-detail-authoring.ts:20` e `praxis-config-starter/src/main/java/org/praxisplatform/config/ai/authoring/TableDetailAuthoringSemantics.java:17`.
156
+ - Estrutura: `src/lib/detail/table-detail-authoring.ts:80`, `src/lib/table-editor-capability.ts:109` e executor Java `:93`.
157
+ - Estado recolhido: `src/lib/praxis-table.ts:6263`, chamadas em hidratação/Apply; E2E `test-dev/e2e/table-bottom-detail.playwright.spec.ts:92`.
158
+ - Raiz tabs: `src/lib/detail/table-detail-editor.component.ts:151` e `table-detail-authoring.ts` (`TableDetailTreeDraft.add`).
159
+ - Skill canônica alterada: `codex-skills/praxis-table-authoring/SKILL.md:100`. Skills específicas ausentes e sincronização instalada não executada permanecem explicitadas acima.