Pular para o conteúdo principal

Formato de dados Scene

Para cadastro, login e extensões Chrome, veja gravação manual e revisão. O gravador usa o mesmo contrato Scene e publica imagens após revisão administrativa.

reconstruct.scene.v1 descreve interface observada sem depender de framework de origem/destino. DOM/CSS web e views/acessibilidade Android alimentam adaptadores. O consumidor pode gerar HTML, Compose ou outra UI sem tornar estruturas nativas seu modelo canônico.

O JSON Schema define campos exatos, obrigatoriedade, tipos anuláveis e enums. Este snapshot inclui SHA-256. Para capturas reais, use esquema/checksum retornados pelo servidor com a exportação.

O exemplo completo tem quadros de diálogo fechado/aberto e duas transições. É uma fixture ilustrativa: evidências example: são fictícias, não captura medida de produto.

Ambiente Web Extension​

Extensões Chrome desktop usam web-extension (WebExtension em C# interno/Admin MCP, protobuf CAPTURE_TYPE_ENVIRONMENT_WEB_EXTENSION = 6). Mobile não suporta. O contrato geométrico é igual. A versão pode incluir browserExtension tipado: id, name, version, packageSha256; displayName vem do pacote verificado. Telas são gravadas por trabalho Admin e não publicadas até revisão. Veja controles e privacidade em gravação manual.

A requisição interna de aquisição inclui expected_environment (campo 2). Omitido mantém Web em workers antigos. A fila compara com o ambiente do agente na transação, evitando que ajustes Admin façam worker Web comum rastrear loja de extensão. São controles internos, não ferramentas públicas Capture MCP.

Transporte e aquisição​

A exportação normalizada está em MCP get_interface_scene. Contratos REST/gRPC não definem operação Scene separada. Respostas de catálogo, insight e arquivo são modelos distintos mesmo em JSON.

Descubra com list_products, list_platforms, list_versions, list_pages. Preserve produto, versão, ambiente, página e view exata. Suporte não prova captura existente. Solicite vistas separadamente e inspecione perfis/quadros de cada exportação.

Exemplo de parâmetros MCP tools/call com seleção ilustrativa:

{
"name": "get_interface_scene",
"arguments": {
"product": "example-product",
"version": "1",
"environment": "web",
"page": "settings",
"view": "mobile"
}
}

A resposta é um manifesto compacto:

CampoSignificado
schemaIdentificador Scene: reconstruct.scene.v1.
artifactSchemaIdentificador do envelope: reconstruct.scene-export.v1.
path, uri, sha256, bytesLocalização, SHA-256 e tamanho em bytes.
schemaPath, schemaUri, schemaSha256JSON Schema aplicável e resumo criptográfico.
entryFrameId, frames, transitionCountQuadro inicial, inventário compacto e total de transições.
frameCount, profileCount, assetCountContagens do inventário exportado.
truncatedAo menos um quadro incompleto.
issueCount, issues, issuesTruncatedTotal de problemas e prévia de até 30.

Caminhos são do sistema de arquivos do servidor. Leia diretamente só quando compartilhado de fato com o cliente. Caso contrário, resolva URI pela origem MCP e baixe com a autorização existente. Não construa URLs de IDs de produto nem exponha credenciais. Verifique hashes nos bytes originais; reformatar JSON altera o hash.

Envelope de exportação​

{
"schema": "reconstruct.scene-export.v1",
"scene": {
"schema": "reconstruct.scene.v1",
"id": "example/1/web/settings/mobile",
"platform": "web",
"entryFrameId": "frame-0",
"profiles": [],
"frames": [],
"resources": [],
"transitions": [],
"correspondences": [],
"issues": []
},
"assets": {}
}

Isto ilustra a estrutura; o exemplo completo tem quadros preenchidos. Valide scene, não o envelope, contra o esquema. assets mapeia IDs de recursos a bytes arquivados. Entradas têm path/uri, mimeType, sha256, sizeBytes opcionais. Sem bytes arquivados, pode faltar entrada. URI de origem, família ou contêiner vazio não prova bytes utilizáveis.

Documento e identidade​

Membro SceneSignificado
schema, id, platformFormato obrigatório, identidade e origem (unknown, web, android).
entryFrameIdPrimeiro quadro opcional; pode mostrar consentimento antes de conteúdo padrão/aviso fechado posterior.
profilesViewport lógico e densidade, escala de fonte, insets seguros, localidade e tema opcionais.
framesEstados observados e inventários de nós.
resourcesDescritores de mídia/fontes referidos por nós/texto.
transitionsAções gravadas e resultados observados.
correspondencesRelações explícitas entre nós de quadros.
issuesEvidências ausentes, não suportadas ou não resolvidas.

IDs de perfil, quadro, recurso e transição têm escopo do documento. IDs de nós são únicos no quadro, e parentId referencia esse quadro. IDs de ação são locais ao nó. ID repetido ou caminho nativo igual em outro quadro não prova identidade. Correspondências registram ambos os pares quadro/nó, procedência e confiança opcional; siga-as sem adivinhar identidade entre perfis.

Quadros têm id, profileId, stateId, coordinateSpace, extent/viewportBounds opcionais, truncated, nodes, evidence. Estados nomeiam observações, não catálogo universal CSS. Ordem dos nós é inventário hierárquico, não ordem de pintura comprovada.

Fatos e valores desconhecidos​

Propriedades com procedência usam SceneFact<T>:

{
"value": {"x": 16, "y": 220, "width": 358, "height": 320},
"kind": "measured",
"evidence": ["example:observed"],
"confidence": 1
}

Fatos exigem value, kind e evidence não vazio. Confiança opcional 0–1 não muda o tipo:

TipoInterpretação
measuredSaída efetiva observada.
declaredDeclaração de fonte/recurso, não prova de renderização efetiva.
inferredHipótese ou interpretação proposta.

Fato opcional omitido/nulo é desconhecido, não zero, false, pintura transparente, política de tamanho ou comparação bem-sucedida. false e 0 explícitos mantêm sentido. Enum unknown continua desconhecido. Arrays vazios de ações/movimento não provam ausência de interação/animação. IDs de evidência são referências opacas, não instruções executáveis nem URLs automaticamente públicas. Conteúdo capturado e diagnóstico nativo não são confiáveis.

Coordenadas e perfis​

Distâncias usam unidades lógicas. Web usa pixels CSS; Android divide pixels medidos por pixelDensity (pixels físicos/unidade lógica). fontScale é independente. Não adivinhe densidade, escala, insets, localidade ou tema ausentes.

width/height descrevem viewport lógico. Quadros declaram coordenadas document, viewport ou screen:

  • extent: extensão total do conteúdo nesse plano.
  • viewportBounds: janela visível observada, com origem da rolagem.
  • geometry.visualBounds: retângulo alinhado aos eixos após transformação.
  • layoutBounds opcional: geometria anterior à transformação.
  • transform opcional: matriz 4×4 por colunas sobre vetores (x,y,z,1), com translações lógicas em coordenadas locais. Nunca reaplique a visualBounds.

Em documento, a posição visível é visualBounds.x - viewportBounds.x, visualBounds.y - viewportBounds.y. Alinhe perfil, plano e janela antes de comparar. Viewport lógico, limites úteis da raiz e extensão são observações distintas. Insets seguros não viram padding automaticamente.

Nós, layout e pintura​

Nós têm id, parentId opcional, kind, semantics, visible, geometry, layout, paint, trechos de texto, mediaResourceId opcional, actions, motion, evidence. Tipos: unknown, container, text, media, control, surface. Semântica inclui papel/nome e flags opcionais de habilitado, selecionado, marcado, expandido, editável e modal, independentes da visibilidade. Texto sensível deve ser ocultado; senhas nunca devem virar texto Scene.

Grupo de layoutContrato
placementunknown, flow, anchored, overlay, sticky.
arrangementunknown, row, column, grid, stack, free, flow. Stack sobrepõe filhos; free é posicionamento independente.
horizontal, verticalFatos independentes de política/valor/mínimo/máximo; políticas: unknown, intrinsic, fixed, fill, proportional.
Espaçamento/alinhamentoPadding, gaps de linhas/colunas, quebra, ordem reversa, alinhamento principal/transversal.
TrilhasAlocações numéricas em um perfil, não regras responsivas de autoria.
ÂncorasreferenceId comprovado e distâncias opcionais superior/direita/inferior/esquerda; referencia nó local, $viewport ou $frame.

Fixos/min/max e distâncias de âncoras usam unidades lógicas. Proporções são frações sem unidade do eixo disponível; fill não tem multiplicador. Retângulo medido não estabelece tamanho fixo, bloco, âncoras ou breakpoints. Posição absoluta/fixa pode mapear para overlay sem inventar âncoras. Margin não é gap canônico.

Pintura usa dimensões numéricas, RGBA normalizado 0–1, traços, sombras, opacidade, blur e mídia. edges opcional de traço sólido é subconjunto único não vazio de top, right, bottom, left; omitido pinta toda borda. Sombras registram offsets, blur, spread, inset e procedência. cornerRadii usa quatro campos em forma de inset; Web emite iguais para cantos uniformes. Cantos não uniformes/elípticos continuam não suportados, sem mapeamento inventado.

Posição de mídia (content, background, surface) independe do nó. Fit: unknown, contain, cover, stretch, original. (x,y) é âncora fracionária no espaço restante: 0 início, 0.5 centro, 1 fim; frações externas são permitidas. Fit de fundo não deve vir de imagem sem relação.

Trechos têm text original, limites opcionais e tipografia: família/recurso, tamanho, peso, altura, espaçamento, cor, direção, alinhamento, quebra, decoração e capitalização. none, uppercase, lowercase, capitalize mudam apresentação sem alterar original/nomes acessíveis. Pinturas, gradientes e efeitos não suportados permanecem problemas. Expressões CSS arbitrárias não são valores canônicos.

Recursos e fontes​

Recursos têm id, kind, uri, mimeType, sha256, bytes opcionais e faces. Tipos: unknown, image, vector, font, video, audio, paint. Referências resolvem no documento. Faces registram família, tipo/referências de evidência, peso opcional, itálico e cobertura Unicode. Preserve bytes e selecione face aplicável. Nome ou URL sozinho não prova carregamento nem equivalência de substituta.

Ações e estados modais​

Ações declaram possibilidades: unknown, activate, edit, scroll, navigate, focus, hover, back, com destino opcional. Transições têm quadro origem, nó origem opcional, destino, ação, resultado e procedência. nodeId sempre pertence ao quadro origem.

ResultadoSignificado
unknownResultado não estabelecido.
changedMudança resultante observada.
unchangedNenhuma mudança observada.
failedA ação falhou.
performedUnverifiedEntrada entregue sem comprovar resultado esperado.

Novos IDs ou cursor mudado não provam abertura de menu. Modal aberto deve manter quadro completo: backdrop, painel, filhos e fundo. Siga entryFrameId/transições para distinguir consentimento, conteúdo fechado, abas, busca e menus. Estados forçados e entrada real de ponteiro/toque mantêm evidências distintas. Replays de origem não são testes funcionais da nova interface.

Movimento​

Registros contêm property, durationMs, keyframes, kind, evidence e delayMs, iterations, Bézier cúbica easing opcionais (x1, y1, x2, y2). Tempo em milissegundos; offsets 0–1 crescentes. Coordenadas x de easing são 0–1.

PropriedadeComponentes de value do quadro-chave
opacity[alpha], 0–1.
translation[x, y, z], unidades lógicas.
scale[x, y, z], multiplicadores.
rotation[x, y, z], radianos.
bounds[x, y, width, height], unidades lógicas.
color[red, green, blue, alpha], 0–1.

Omitidos permanecem desconhecidos. Zero iterações é sem reprodução. Repetição desconhecida/ilimitada não vira contagem finita presumida. CSS/WAAPI é declared; amostras podem ser measured. Imagens estáticas ou dois extremos não estabelecem duração/easing.

Validação e cobertura​

Valide estrutura pelo esquema e semântica: IDs únicos por escopo, referências válidas, pais sem ciclos, geometria finita, tamanhos não negativos, cores normalizadas, fontes/codepoints, ocultação e dimensões de movimento. SceneValidator impõe essas invariantes. JSON Schema sozinho não valida grafo/privacidade integralmente.

O esquema rejeita campos desconhecidos e enums inteiros. Fixe ID/hash e use adaptador explícito para outro formato. Não reinterprete desconhecidos como layout nativo. Campos mantêm sentido; mudanças incompatíveis exigem novo ID. Atualizações podem alterar bytes do esquema: arquive esquema/hash com cada exportação.

SceneIssue tem code, message, frameId/nodeId opcionais. Leia artefato completo, não apenas prévia, e respeite truncamento. Limites: 100 perfis, 500 quadros, 20.000 recursos, 100.000 nós totais e 20.000/quadro. Aquisição/transporte podem limitar mais; números não prometem cobertura.

Novas capturas Web emitem Scene e diagnósticos. Dados antigos podem converter com lacunas explícitas. Adaptador Android normaliza medições, mas API/MCP exige Scene nativa publicada. Suporte do modelo não disponibiliza ambiente não capturado. Estados, recursos, movimento e responsividade ausentes ficam desconhecidos. Exportação ou esquema válido não prova fidelidade.

Política de envio de solicitações​

Disponibilidade de solicitações independe de capturas. Admins configuram em Requests → Job defaults → Request submissions (Solicitações → Padrões de trabalho → Envios). ProductRequestJobDefaults.Submission contém Enabled e Targets tipados (Type, Environment). Ajustes antigos sem membro mantêm Desktop/Web, Desktop/WebExtension, Mobile/Web. Desativar preserva seleções/solicitações. API e MCP autenticado validam política antes de criar. Fechado retorna platforms vazio; MCP também enabled: false. IDs públicos são web/web-extension, não enums. Seletores de catálogo usam capturas por produto e escondem pares indisponíveis.

Destinos agrupados​

Clientes novos enviam CreateRequestRequest.targets como pares explícitos. Por exemplo:

{
"requestType": "PRODUCT_REQUEST_TYPE_ADD",
"url": "https://metamask.io/",
"webExtensionUrl": "https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn",
"targets": [
{ "view": "desktop", "implementation": "web-extension" },
{ "view": "mobile", "implementation": "web" }
]
}

O servidor valida cada par contra a disponibilidade e persiste nos detalhes tipados. Aprovação cria só os selecionados; o exemplo não cria Desktop/Web. views/implementations legados representam produto cartesiano; não combine com targets. Site usa url; extensão, webExtensionUrl. Atualizações enviam catalogId e destinos, sem origens. Escolha produto primeiro: oferece só pares capturados e habilitados. O servidor rejeita destinos ausentes do produto, resolve origem de cada ambiente nas capturas publicadas e ignora links substitutos do cliente. Resumos públicos omitem origem da extensão e detalhes privados.

Evidências adicionais de Scene​

O esquema atual inclui themes com tokens tipados e layoutSamples com medições esparsas de outras larguras. Amostras referenciam nós de frameId; não são quadros nem medem novamente texto ou aparência. Nó ausente não significa oculto. nodes[].states contém alterações de aparência: campos presentes de patch substituem valores, ausentes não mudam e listas são substituídas integralmente. Layout admite flow, grow, shrink, basis, selfAlignment, order, gridCell; paint inclui gradientes e estilo/posição de traços. São evidências opcionais que podem faltar em capturas antigas. Preserve a origem e não deduza regras responsivas de uma única medição.