|
| 1 | +# level_10_6d_palette_contract_evidence_report |
| 2 | + |
| 3 | +## command run |
| 4 | +- `npm run test:sample-standalone:data-flow` |
| 5 | + |
| 6 | +## timestamps |
| 7 | +- reportGeneratedAt: 2026-04-27T17:04:41.161Z |
| 8 | +- testSummaryGeneratedAt: 2026-04-27T17:02:16.473Z |
| 9 | + |
| 10 | +## test result summary |
| 11 | +- status: PASS |
| 12 | +- totalSampleToolPayloadFiles: 62 |
| 13 | +- totalSamplePaletteFiles: 20 |
| 14 | +- totalRoundtripRows: 62 |
| 15 | +- schemaFailures: 0 |
| 16 | +- contractFailures: 0 |
| 17 | +- roundtripPathFailures: 0 |
| 18 | +- genericFailures: 0 |
| 19 | +- paletteBrowserGenericChecks: 3 |
| 20 | +- paletteBrowserTargetedChecks: 3 |
| 21 | + |
| 22 | +## palette-related samples checked |
| 23 | +- sampleId 0213 -> toolId palette-browser |
| 24 | +- sampleId 0308 -> toolId palette-browser |
| 25 | +- sampleId 0313 -> toolId palette-browser |
| 26 | + |
| 27 | +## sample manifest palette shape vs tool expected palette shape |
| 28 | +- test expectation source: |
| 29 | + - `tests/runtime/SampleStandaloneToolDataFlow.test.mjs:1162-1168` reads `testCase.presetPayload?.config?.palette` and requires non-empty `name` and `swatches`. |
| 30 | +- runtime ingestion source: |
| 31 | + - `tools/Palette Browser/main.js:531-553` extracts palette payload via aliases (`payload.palette`, `config.palette`, `payload.swatches`, `config.swatches`). |
| 32 | + - `tools/Palette Browser/main.js:506-529` validates/normalizes imported palette shape. |
| 33 | +- comparison (manifest palette object vs paired `sample.<id>.palette.json`): |
| 34 | +- Sample 0213: |
| 35 | + - swatchesMatch: true |
| 36 | + - keysOnlyInManifest: (none) |
| 37 | + - keysOnlyInPaletteFile: $schema, locked, sourceId |
| 38 | + - value mismatch: source => manifest="manifest" | paletteFile="engine/paletteList" |
| 39 | +- Sample 0308: |
| 40 | + - swatchesMatch: true |
| 41 | + - keysOnlyInManifest: (none) |
| 42 | + - keysOnlyInPaletteFile: $schema |
| 43 | + - value mismatch: source => manifest="manifest" | paletteFile="generated-from-sample-colors" |
| 44 | +- Sample 0313: |
| 45 | + - swatchesMatch: true |
| 46 | + - keysOnlyInManifest: (none) |
| 47 | + - keysOnlyInPaletteFile: $schema |
| 48 | + - value mismatch: source => manifest="manifest" | paletteFile="generated-from-sample-colors" |
| 49 | + |
| 50 | +## exact mismatches found |
| 51 | +- Cross-file mismatches detected (manifest `config.palette` vs sample-side `sample.<id>.palette.json`): |
| 52 | +- Sample 0213: |
| 53 | + - swatchesMatch: true |
| 54 | + - keysOnlyInManifest: (none) |
| 55 | + - keysOnlyInPaletteFile: $schema, locked, sourceId |
| 56 | + - value mismatch: source => manifest="manifest" | paletteFile="engine/paletteList" |
| 57 | +- Sample 0308: |
| 58 | + - swatchesMatch: true |
| 59 | + - keysOnlyInManifest: (none) |
| 60 | + - keysOnlyInPaletteFile: $schema |
| 61 | + - value mismatch: source => manifest="manifest" | paletteFile="generated-from-sample-colors" |
| 62 | +- Sample 0313: |
| 63 | + - swatchesMatch: true |
| 64 | + - keysOnlyInManifest: (none) |
| 65 | + - keysOnlyInPaletteFile: $schema |
| 66 | + - value mismatch: source => manifest="manifest" | paletteFile="generated-from-sample-colors" |
| 67 | +- Test contract mismatches during fresh run: none (all failure arrays empty in `tmp/sample-standalone-tool-data-flow-results.json`). |
| 68 | + |
| 69 | +## required status checks |
| 70 | +- `$schema` remains: yes. |
| 71 | + - Tool payload files contain top-level `$schema` references to `tools/schemas/tools/palette-browser.schema.json`. |
| 72 | + - Sample palette files contain top-level `$schema` references to `tools/schemas/palette.schema.json`. |
| 73 | +- `engine` / `paletteList` remains: yes. |
| 74 | + - Sample 0213 palette source remains `engine/paletteList`. |
| 75 | + - Palette Browser still loads `../../src/engine/paletteList.js` and reads `globalThis.palettesList`. |
| 76 | +- `wrapper` remains: no in audited sample payloads. |
| 77 | + - Test harness still rejects wrapper fields `documentKind`, `id`, `type` for sample tool payload contracts. |
| 78 | +- `alias` remains: yes. |
| 79 | + - `extractPaletteFromSamplePreset` accepts `payload.palette`, `config.palette`, `payload.swatches`, and `config.swatches`. |
| 80 | +- `reshaping` remains: yes. |
| 81 | + - `normalizePaletteDocument` reshapes legacy `entries[]`/`colors[]` into `swatches[]`. |
| 82 | +- `fallback data` remains: yes. |
| 83 | + - Built-in palette fallback source defaults to `{}` when `globalThis.palettesList` is absent. |
| 84 | + - Symbol/name/version/source defaults are still applied during normalization. |
| 85 | +- `hardcoded paths` remain: partial. |
| 86 | + - Fixed engine script include path remains in tool HTML (`../../src/engine/paletteList.js`). |
| 87 | + - Preset ingest path handling is constrained to `/samples/`, `./samples/`, or `samples/` and rejects `..`. |
| 88 | + |
| 89 | +## exact copied file paths |
| 90 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/metadata/samples.index.metadata.json |
| 91 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/phase-02/0213/sample.0213.palette-browser.json |
| 92 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/phase-03/0308/sample.0308.palette-browser.json |
| 93 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/phase-03/0313/sample.0313.palette-browser.json |
| 94 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/phase-02/0213/sample.0213.palette.json |
| 95 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/phase-03/0308/sample.0308.palette.json |
| 96 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/samples/phase-03/0313/sample.0313.palette.json |
| 97 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tools/schemas/tools/palette-browser.schema.json |
| 98 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tools/schemas/palette.schema.json |
| 99 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tools/Palette Browser/index.html |
| 100 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tools/Palette Browser/main.js |
| 101 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tools/shared/paletteDocumentContract.js |
| 102 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tools/toolRegistry.js |
| 103 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tests/runtime/SampleStandaloneToolDataFlow.test.mjs |
| 104 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/src/engine/paletteList.js |
| 105 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/tmp/sample-standalone-tool-data-flow-results.json |
| 106 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/docs/dev/reports/level_10_6d_palette_contract_evidence/test_sample_standalone_data_flow_output.txt |
| 107 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/repo_relative/docs/dev/reports/level_10_6d_palette_contract_evidence/palette_shape_diff.json |
| 108 | + |
| 109 | +## fresh test output artifacts |
| 110 | +- docs/dev/reports/level_10_6d_palette_contract_evidence/test_sample_standalone_data_flow_output.txt |
| 111 | +- tmp/sample-standalone-tool-data-flow-results.json |
| 112 | + |
| 113 | +## next-step recommendation (normalization only) |
| 114 | +- Normalize palette contract boundaries so sample manifest palette payload and sample palette data file metadata are explicitly aligned by policy, with a single accepted source semantic and a narrowed ingest alias surface (no behavior changes beyond normalization scope). |
0 commit comments