From f31421b079b8f524755b51fb9d753942e70286e1 Mon Sep 17 00:00:00 2001 From: Chris0Jeky Date: Thu, 10 Sep 2026 04:02:14 +0100 Subject: [PATCH] Retain resolved Auto appearance in comparison observations --- docs/IMPLEMENTATION_MASTERPLAN.md | 2 ++ docs/STATUS.md | 2 ++ docs/product/WORKSPACE_OVERHAUL_VALIDATION.md | 7 +++++++ .../build/frontendIdentity.node-check.mjs | 11 +++++++++- .../taskdeck-web/build/frontendIdentity.ts | 2 ++ .../overhaul/WorkspaceExperiencesView.vue | 5 +++-- .../e2e/comparison-compatibility.spec.ts | 20 ++++++++++++------- 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/docs/IMPLEMENTATION_MASTERPLAN.md b/docs/IMPLEMENTATION_MASTERPLAN.md index 82d7b32a95..752b66417c 100644 --- a/docs/IMPLEMENTATION_MASTERPLAN.md +++ b/docs/IMPLEMENTATION_MASTERPLAN.md @@ -2,6 +2,8 @@ Last Updated: 2026-09-10 +Comparison attribution follow-through (#2808): retain the resolved Auto appearance in the existing portable theme label and exclude known non-shipped test inputs from the frontend fingerprint. Preserve legacy checksums/file semantics and prove live light/night switching, export/import and HTTP LAN compatibility together. + Original-source portability continuation (#2808): hold a store-owned read snapshot across the five source-storage export sections, with deferred SQLite transactions and scoped disposal before later export writes. Prove both account-export routes against a concurrent committed upload and written version. Whole-account point-in-time consistency and restore acceptance remain separate. Studio/Classic planning continuity (#2808): share existing Focus resume on Classic Home and use the existing calendar-day utilities for plan date controls and card deadlines. Browser acceptance includes a western timezone, Today filtering, both Classic renderers and unchanged board-card data. Failed-plan metadata and accepted-navigation focus timestamps remain separate follow-through. diff --git a/docs/STATUS.md b/docs/STATUS.md index cd65d5fa62..4c0ab1d32f 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -2,6 +2,8 @@ Last Updated: 2026-09-10 +Comparison appearance continuation (#2808): Auto observations retain both the selected mode and the resolved light/night appearance at submission. Existing version-2/3 files keep their original attribution; no historical appearance is invented. Frontend input fingerprints exclude repository test-only sources and build proof scripts, while runtime sources, public assets, build plugins and resolved build options remain attributed. This keeps manual comparisons coherent across proof-only edits without claiming randomized or statistical results. + Source-storage export continuation (#2808): buffered and streamed account exports now hold one deferred SQLite read snapshot across blob objects, references, chunks, representations and audio-answer rows. Concurrent WAL uploads can commit without reserving the writer for the duration of the export; all five sections retain the earlier view until disposal. This is source-storage consistency, not a claim of a single snapshot across every account-export section or a tested restore workflow. Planning continuity follow-through (#2808): Classic Home now offers the same private last-worked Focus resume as the other experiences, in both Paper/Grove and Legacy rendering. Personal-plan due dates use canonical calendar-day formatting; Today and tomorrow use the local calendar date without changing card deadlines. This reduces the work needed to resume a thought after switching versions. diff --git a/docs/product/WORKSPACE_OVERHAUL_VALIDATION.md b/docs/product/WORKSPACE_OVERHAUL_VALIDATION.md index 2d2e5c22f1..818e3796f1 100644 --- a/docs/product/WORKSPACE_OVERHAUL_VALIDATION.md +++ b/docs/product/WORKSPACE_OVERHAUL_VALIDATION.md @@ -369,3 +369,10 @@ PR #2866 now also contains the reviewed source interaction, board overlay, libra Sixteen selected Chromium journeys have passing evidence. The initial combined batch passed fifteen and found one ambiguous memory-title locator; using the checkbox role fixed that test, and both complete contextual/source specs then passed. Coverage includes four experiences, both board renderers, Los Angeles calendar dates, Classic resume, 375 px accessibility/overflow, source permissions, exact original audio, explicit Review/Apply and three production audio-policy cases. This is not a claim that the initial batch was entirely green. Two comparison identity checks, two audio-policy checks, eleven failure-ledger projection tests, documentation links and GitHub governance pass. A bounded fresh-context integration review found no HIGH/CRITICAL interaction defect. Temporary browser services are stopped; all databases are synthetic. Hosted exact-head qualification remains the merge gate. The wider #2808 scope, physical microphones/devices, live processors, restoration and the existing human decisions remain open. + +## Comparison appearance attribution (2026-09-10) + +Auto observations use the existing version-3 theme string to retain both selected mode and resolved appearance at submission: auto (paper) or auto (paper-night). Old auto labels remain unchanged and separate; no version-2 checksum input, file schema or historic identity changes. The UI explains the submission-time scope and asks the observer to note any appearance changes during the task. + +The HTTP LAN compatibility Chromium journey records both live color-scheme settings, confirms the body theme, exports those labels alongside a legacy auto observation, checks three separate result rows, reloads and imports all three without SubtleCrypto or randomUUID. It passes in 14.6 seconds. Node fingerprint checks verify that src/tests and build/*.node-check.mjs changes leave product attribution stable, while runtime source, public assets, build plugin code and build configuration change it. Full frontend/build results belong to the continuation PR; there is no telemetry, randomized assignment or statistical conclusion. +Final local comparison-attribution gate: 6,377 frontend tests passed with three existing skips across 412 files. Production build/typecheck, two Node identity checks, the 14.6-second Chromium journey, documentation links and GitHub governance pass. Independent bounded Luna review is CLEAN. The test-only fingerprint exclusions are exact repository paths; this is still an input fingerprint, not a byte-for-byte bundle hash or proof of the remote server version. Temporary services are stopped; hosted checks remain separate. diff --git a/frontend/taskdeck-web/build/frontendIdentity.node-check.mjs b/frontend/taskdeck-web/build/frontendIdentity.node-check.mjs index 4d2101b316..7049418965 100644 --- a/frontend/taskdeck-web/build/frontendIdentity.node-check.mjs +++ b/frontend/taskdeck-web/build/frontendIdentity.node-check.mjs @@ -22,6 +22,12 @@ test('frontend fingerprint is repeatable and changes with source, public assets const baseline = fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }) assert.match(baseline, /^sha256:[a-f0-9]{64}$/) assert.equal(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }), baseline) + mkdirSync(join(root, 'src/tests')) + writeFileSync(join(root, 'src/tests/new.spec.ts'), 'new proof, same product') + writeFileSync(join(root, 'build/example.node-check.mjs'), 'build proof') + assert.equal(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }), baseline) + writeFileSync(join(root, 'src/tests/new.spec.ts'), 'updated proof') + assert.equal(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }), baseline) assert.notEqual(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/other-api' }), baseline) assert.notEqual(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }, { base: '/Taskdeck/' }), baseline) assert.notEqual(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }, { minify: false }), baseline) @@ -29,5 +35,8 @@ test('frontend fingerprint is repeatable and changes with source, public assets const changedSource = fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }) assert.notEqual(changedSource, baseline) writeFileSync(join(root, 'public/theme.css'), 'changed theme') - assert.notEqual(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }), changedSource) + const changedAssets = fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }) + assert.notEqual(changedAssets, changedSource) + writeFileSync(join(root, 'build/runtime-plugin.ts'), 'plugin affecting output') + assert.notEqual(fingerprintFrontend(root, 'production', { VITE_API_BASE_URL: '/api' }), changedAssets) }) diff --git a/frontend/taskdeck-web/build/frontendIdentity.ts b/frontend/taskdeck-web/build/frontendIdentity.ts index ad7343f277..4ff64faa8f 100644 --- a/frontend/taskdeck-web/build/frontendIdentity.ts +++ b/frontend/taskdeck-web/build/frontendIdentity.ts @@ -13,6 +13,8 @@ export function fingerprintFrontend(root: string, mode: string, publicEnvironmen function directory(relative: string) { for (const entry of readdirSync(join(root, relative), { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name, 'en'))) { const name = `${relative}/${entry.name}` + // These repository-owned proof inputs are not shipped in the frontend bundle. + if (name === 'src/tests' || (relative === 'build' && entry.isFile() && entry.name.endsWith('.node-check.mjs'))) continue if (entry.isDirectory()) directory(name) else if (entry.isFile()) add(name, readFileSync(join(root, name))) else throw new Error(`Unsupported frontend input: ${name}`) diff --git a/frontend/taskdeck-web/src/views/overhaul/WorkspaceExperiencesView.vue b/frontend/taskdeck-web/src/views/overhaul/WorkspaceExperiencesView.vue index 0a1f0fa99c..13f087df76 100644 --- a/frontend/taskdeck-web/src/views/overhaul/WorkspaceExperiencesView.vue +++ b/frontend/taskdeck-web/src/views/overhaul/WorkspaceExperiencesView.vue @@ -1,7 +1,7 @@