'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const { createSemanticEvidenceService } = require('../../src/services/semantic-evidence-service'); test('manual evidence requires reason and bounded expiry', () => { const writes = []; const now = 1700000000000; const db = { runQuery: sql => sql.includes('FROM titles') ? [{ id: 7, title_id: 'PPSA00001' }] : [], runMutatingSqlWithParams: (sql, params) => writes.push(params) }; const service = createSemanticEvidenceService(db, { now: () => now }); assert.throws(() => service.record({ externalTitleId: 'PPSA00001', kind: 'version', value: '1.00', reason: 'short', expiresAt: now + 1000 }), /reason/); assert.throws(() => service.record({ externalTitleId: 'PPSA00001', kind: 'version', value: '1.00', reason: 'Verified manually', expiresAt: now + 31 * 86400000 }), /30 days/); assert.equal(service.record({ externalTitleId: 'PPSA00001', kind: 'version', value: '1.00', reason: 'Verified from settings screen', expiresAt: now + 86400000 }).advisoryOnly, true); assert.equal(writes.length, 1); }); test('production callers omit legacy semantic writes', () => { const root = path.resolve(__dirname, '../..'); const read = file => fs.readFileSync(path.join(root, file), 'utf8'); assert.match(read('src/database.js'), /Legacy semantic fields are read-only/); assert.doesNotMatch(['main.js','src/server/create-registry.js','src/ipc/backpork-gen.js'].map(read).join('\n'), /db\.updateGame\([^\n]+\{\s*(?:installed|backed_up)\s*:/); assert.doesNotMatch(read('renderer/modules/manage.js'), /fields:\s*\{\s*(?:installed|backed_up)\s*:/); });