File size: 1,431 Bytes
842005b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import assert from 'node:assert/strict'
import test from 'node:test'
import { SACMOptimizer, type BridgedProject } from '../src/index.js'

const cleanProject: BridgedProject = {
  sacmId: 'sacm_123456',
  legacyId: 'legacy-1',
  legacySource: 'github',
  name: 'Clean Project',
  payload: { data: { build: 'pass', owner: 'team' } },
  importedAt: new Date().toISOString(),
  status: 'imported',
  integrityHmac: 'present',
}

test('produces quorum for clean bridged projects', () => {
  const optimizer = new SACMOptimizer('test-secret')
  const proof = optimizer.runConsensus(cleanProject)

  assert.equal(proof.quorum, true)
  assert.equal(proof.approvalCount, 5)
  assert.equal(proof.requiredQuorum, 3)
  assert.equal(optimizer.verifyProof(proof), true)
})

test('records rejecting votes for credential-bearing payloads', () => {
  const optimizer = new SACMOptimizer('test-secret')
  const proof = optimizer.runConsensus({
    ...cleanProject,
    payload: { data: { apiToken: 'blocked' } },
  })

  const sentinel = proof.votes.find(v => v.agent === 'SENTINEL')
  assert.equal(sentinel?.vote, 'reject')
  assert.match(sentinel?.rationale ?? '', /Credential-like/)
})

test('refuses projects rejected by bridge', () => {
  const optimizer = new SACMOptimizer('test-secret')
  assert.throws(() => optimizer.runConsensus({ ...cleanProject, status: 'rejected' }), /rejected at bridge/)
})