From cfb842c56f9ebb8a12dd57f61836217560ff84e3 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 23 May 2026 22:22:23 +0100 Subject: [PATCH] implements PLN-0084 --- discussion/index.ndjson | 2 +- ...8-packer-projections-and-workspace-apis.md | 14 ++++++------- .../FileSystemPackerWorkspaceService.java | 13 +++++------- .../PackerAssetDeclarationParser.java | 18 ++++++++++++---- .../services/PackerAssetDetailsService.java | 21 ++++++------------- 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 478ea486..f696db9c 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,5 +1,5 @@ {"type":"meta","next_id":{"DSC":39,"AGD":42,"DEC":38,"PLN":87,"LSN":53,"CLSN":1}} -{"type":"discussion","id":"DSC-0038","status":"open","ticket":"studio-packer-rgba8888-asset-pipeline","title":"Studio and Packer RGBA8888 Asset Pipeline Alignment","created_at":"2026-05-23","updated_at":"2026-05-23","tags":["studio","packer","assets","glyph-bank","palette","rgba8888","runtime-alignment"],"agendas":[{"id":"AGD-0041","file":"AGD-0041-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23"}],"decisions":[{"id":"DEC-0037","file":"DEC-0037-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23","ref_agenda":"AGD-0041"}],"plans":[{"id":"PLN-0081","file":"PLN-0081-rgba8888-packer-and-studio-spec-propagation.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0082","file":"PLN-0082-rgba8888-palette-model-and-argb-conversion.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0083","file":"PLN-0083-rgba8888-glyph-payload-emission-and-sizes.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0084","file":"PLN-0084-rgba8888-packer-projections-and-workspace-apis.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0085","file":"PLN-0085-rgba8888-tests-fixtures-and-conformance.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0086","file":"PLN-0086-rgba8888-final-integration-and-residue-removal.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]}],"lessons":[]} +{"type":"discussion","id":"DSC-0038","status":"open","ticket":"studio-packer-rgba8888-asset-pipeline","title":"Studio and Packer RGBA8888 Asset Pipeline Alignment","created_at":"2026-05-23","updated_at":"2026-05-23","tags":["studio","packer","assets","glyph-bank","palette","rgba8888","runtime-alignment"],"agendas":[{"id":"AGD-0041","file":"AGD-0041-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23"}],"decisions":[{"id":"DEC-0037","file":"DEC-0037-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23","ref_agenda":"AGD-0041"}],"plans":[{"id":"PLN-0081","file":"PLN-0081-rgba8888-packer-and-studio-spec-propagation.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0082","file":"PLN-0082-rgba8888-palette-model-and-argb-conversion.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0083","file":"PLN-0083-rgba8888-glyph-payload-emission-and-sizes.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0084","file":"PLN-0084-rgba8888-packer-projections-and-workspace-apis.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0085","file":"PLN-0085-rgba8888-tests-fixtures-and-conformance.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0086","file":"PLN-0086-rgba8888-final-integration-and-residue-removal.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]}],"lessons":[]} {"type":"discussion","id":"DSC-0037","status":"done","ticket":"pbs-autocomplete-parameter-names","title":"PBS autocomplete parameter names for stdlib and method calls","created_at":"2026-05-08","updated_at":"2026-05-14","tags":["compiler-pbs","studio","lsp","autocomplete","signature-help","stdlib"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0052","file":"discussion/lessons/DSC-0037-pbs-autocomplete-parameter-names/LSN-0052-canonical-callable-parameter-names-through-pbs-editor-assistance.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14"}]} {"type":"discussion","id":"DSC-0036","status":"open","ticket":"pbs-symbol-documentation-and-hover-markdown","title":"Modelo de documentacao de simbolos em PBS e consumo markdown no hover","created_at":"2026-05-08","updated_at":"2026-05-08","tags":["compiler","compiler-pbs","studio","lsp","vscode","editor","hover","documentation","markdown"],"agendas":[{"id":"AGD-0039","file":"AGD-0039-pbs-symbol-documentation-and-hover-markdown.md","status":"open","created_at":"2026-05-08","updated_at":"2026-05-08"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0035","status":"done","ticket":"pbs-lsp-editor-assistance-wave-1","title":"Wave 1 de assistencia editorial via LSP para PBS no VS Code","created_at":"2026-05-08","updated_at":"2026-05-08","tags":["studio","lsp","vscode","compiler","compiler-pbs","editor","completion","hover","signature-help"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0051","file":"discussion/lessons/DSC-0035-pbs-lsp-editor-assistance-wave-1/LSN-0051-compiler-backed-editor-assistance-for-pbs.md","status":"done","created_at":"2026-05-08","updated_at":"2026-05-08"}]} diff --git a/discussion/workflow/plans/PLN-0084-rgba8888-packer-projections-and-workspace-apis.md b/discussion/workflow/plans/PLN-0084-rgba8888-packer-projections-and-workspace-apis.md index aaf8c8ba..08581c42 100644 --- a/discussion/workflow/plans/PLN-0084-rgba8888-packer-projections-and-workspace-apis.md +++ b/discussion/workflow/plans/PLN-0084-rgba8888-packer-projections-and-workspace-apis.md @@ -2,9 +2,9 @@ id: PLN-0084 ticket: studio-packer-rgba8888-asset-pipeline title: RGBA8888 Packer Projections and Workspace APIs -status: review +status: done created: 2026-05-23 -completed: +completed: 2026-05-23 ref_decisions: - DEC-0037 tags: @@ -123,11 +123,11 @@ reusable. ## Acceptance Criteria -- [ ] `asset.json` palette metadata uses `rgba8888`. -- [ ] Details/read projections expose `rgba8888`. -- [ ] Workspace write operations persist `rgba8888`. -- [ ] Stale RGB565-derived cache metadata is not reused as canonical. -- [ ] No normal API requires `convertedRgb565`. +- [x] `asset.json` palette metadata uses `rgba8888`. +- [x] Details/read projections expose `rgba8888`. +- [x] Workspace write operations persist `rgba8888`. +- [x] Stale RGB565-derived cache metadata is not reused as canonical. +- [x] No normal API requires `convertedRgb565`. ## Dependencies diff --git a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/FileSystemPackerWorkspaceService.java b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/FileSystemPackerWorkspaceService.java index 5bced46c..b2e1b2b9 100644 --- a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/FileSystemPackerWorkspaceService.java +++ b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/FileSystemPackerWorkspaceService.java @@ -1775,18 +1775,15 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe final ArrayNode palettesNode = pipelineNode.putArray("palettes"); for (int paletteOrder = 0; paletteOrder < request.selectedPalettes().size(); paletteOrder += 1) { final Map palette = request.selectedPalettes().get(paletteOrder); - final List originalArgb8888 = integerList(palette.get("originalArgb8888")); - final List convertedRgb565 = integerList(palette.get("convertedRgb565")); - if (originalArgb8888.isEmpty() || convertedRgb565.isEmpty()) { - throw new IllegalArgumentException("Each selected palette must contain originalArgb8888 and convertedRgb565 entries."); + final List rgba8888 = integerList(palette.get("rgba8888")); + if (rgba8888.isEmpty()) { + throw new IllegalArgumentException("Each selected palette must contain rgba8888 entries."); } final ObjectNode paletteNode = palettesNode.addObject(); paletteNode.put("index", paletteIndex(palette, paletteOrder)); final ObjectNode payloadNode = paletteNode.putObject("palette"); - final ArrayNode originalNode = payloadNode.putArray("originalArgb8888"); - originalArgb8888.forEach(originalNode::add); - final ArrayNode convertedNode = payloadNode.putArray("convertedRgb565"); - convertedRgb565.forEach(convertedNode::add); + final ArrayNode rgbaNode = payloadNode.putArray("rgba8888"); + rgba8888.forEach(rgbaNode::add); } if (palettesNode.isEmpty()) { throw new IllegalArgumentException("At least one palette must be selected."); diff --git a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDeclarationParser.java b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDeclarationParser.java index fbabf0e6..315205b4 100644 --- a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDeclarationParser.java +++ b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDeclarationParser.java @@ -336,17 +336,27 @@ public final class PackerAssetDeclarationParser { continue; } - final JsonNode originalNode = paletteNode.path("originalArgb8888"); - final JsonNode convertedNode = paletteNode.path("convertedRgb565"); - if (!originalNode.isArray() || !convertedNode.isArray()) { + final JsonNode rgbaNode = paletteNode.path("rgba8888"); + if (!rgbaNode.isArray()) { diagnostics.add(new PackerDiagnostic( PackerDiagnosticSeverity.ERROR, PackerDiagnosticCategory.STRUCTURAL, - "Each palette payload must contain array fields 'originalArgb8888' and 'convertedRgb565'.", + "Each palette payload must contain array field 'rgba8888'.", manifestPath, true)); continue; } + for (JsonNode colorNode : rgbaNode) { + if (!colorNode.canConvertToInt()) { + diagnostics.add(new PackerDiagnostic( + PackerDiagnosticSeverity.ERROR, + PackerDiagnosticCategory.STRUCTURAL, + "Palette field 'rgba8888' must contain integer color values.", + manifestPath, + true)); + break; + } + } } if (paletteCount > MAX_PIPELINE_PALETTES) { diff --git a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java index 61e52851..1cb76718 100644 --- a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java +++ b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java @@ -190,29 +190,20 @@ public final class PackerAssetDetailsService { if (!indexNode.isInt() || indexNode.intValue() < 0 || !(payloadNode instanceof ObjectNode payloadObject)) { return Map.of(); } - final JsonNode originalNode = payloadObject.path("originalArgb8888"); - final JsonNode convertedNode = payloadObject.path("convertedRgb565"); - if (!originalNode.isArray() || !convertedNode.isArray()) { + final JsonNode rgbaNode = payloadObject.path("rgba8888"); + if (!rgbaNode.isArray()) { return Map.of(); } - final List originalArgb8888 = new ArrayList<>(); - for (JsonNode colorNode : originalNode) { + final List rgba8888 = new ArrayList<>(); + for (JsonNode colorNode : rgbaNode) { if (!colorNode.canConvertToInt()) { return Map.of(); } - originalArgb8888.add(colorNode.intValue()); - } - final List convertedRgb565 = new ArrayList<>(); - for (JsonNode colorNode : convertedNode) { - if (!colorNode.canConvertToInt()) { - return Map.of(); - } - convertedRgb565.add(colorNode.intValue()); + rgba8888.add(colorNode.intValue()); } return Map.of( "index", indexNode.intValue(), - "originalArgb8888", List.copyOf(originalArgb8888), - "convertedRgb565", List.copyOf(convertedRgb565)); + "rgba8888", List.copyOf(rgba8888)); } private Optional resolveSelectedBankFile(