feat: clean build + crossmodal.tla + TLA+ symmetry (v1.0.0-prep)

Build warnings cleanup (0 warnings):
- Suppress threadpool deprecation warning (baradadb.nim)
- Remove unused 'os' import (logging.nim)
- Fix ImplicitDefaultValue for newNode params (ast.nim)
- Add explicit cstring cast for posix.open (wal.nim)
- Fix HoleEnumConv for MsgKind parsing (server.nim)

TLA+ Formal Verification:
- Add symmetry reduction (Permutations) to all 9 existing specs
- Add SYMMETRY directive to all .cfg files
- New crossmodal.tla: cross-modal consistency spec
  * MetadataVectorConsistency, HybridResultValid
  * CommittedAtomicity, AbortedAtomicity, TxnStateValid
- New models/crossmodal.cfg

Tests:
- Add Cross-Modal TLA+ Faithfulness tests (4 tests)

Docs:
- Update PLAN.md and BUG_AUDIT.md with completed tasks
This commit is contained in:
2026-05-13 09:24:04 +03:00
parent d08de7a062
commit 422df08ab9
28 changed files with 354 additions and 18 deletions
+79
View File
@@ -11,6 +11,8 @@ import std/strformat
import barabadb/core/raft
import barabadb/core/mvcc
import barabadb/core/disttxn
import barabadb/core/crossmodal
import std/os
# ---------------------------------------------------------------------------
# Raft Faithfulness — verify invariants from raft.tla in Nim code
@@ -184,3 +186,80 @@ suite "2PC TLA+ Faithfulness":
let stateAfter = txn.state
check stateBefore == stateAfter
check stateAfter == dtsCommitted
# ---------------------------------------------------------------------------
# Cross-Modal TLA+ Faithfulness — verify invariants from crossmodal.tla
# ---------------------------------------------------------------------------
suite "Cross-Modal TLA+ Faithfulness":
test "MetadataVectorConsistency: insertVector updates metadata for filtered search":
let engine = newCrossModalEngine("/tmp/baradb_tla_crossmodal_1")
engine.insertVector(1, @[1.0'f32, 0.0'f32], {"cat": "A"}.toTable)
engine.insertVector(2, @[0.0'f32, 1.0'f32], {"cat": "B"}.toTable)
# Filtered search uses metadata internally
let results = engine.searchVectorFiltered(
@[1.0'f32, 0.0'f32], 5,
proc(meta: Table[string, string]): bool =
meta.getOrDefault("cat") == "A"
)
check results.len >= 1
check results[0][0] == 1'u64
test "HybridResultValid: hybrid query draws from correct indices":
let engine = newCrossModalEngine("/tmp/baradb_tla_crossmodal_2")
engine.insertVector(1, @[1.0'f32, 0.0'f32], {"cat": "A"}.toTable)
engine.indexText(1, "fast database engine")
var query = newCrossModalQuery(qmHybrid)
query.vector = @[1.0'f32, 0.0'f32]
query.vectorK = 5
query.searchQuery = "fast"
query.vecWeight = 1.0
query.ftsWeight = 1.0
let result = engine.hybridSearch(query)
# Vector results should contain entity 1
let vecIds = result.vecResults.mapIt(it[0])
check vecIds.contains(1'u64)
# FTS results should contain entity 1
check result.ftsResults.contains(1'u64)
# Total results should match hybridScores length
check result.totalResults == result.hybridScores.len
test "CrossModalAtomicity: all participants commit or all abort":
var txn = newTPCTransaction(1)
txn.addParticipant("doc")
txn.addParticipant("vec")
txn.addParticipant("graph")
check txn.participantCount == 3
let prepOk = txn.prepare()
check prepOk
check txn.isPrepared
for p in txn.participants:
check p.prepared
check not p.committed
check not p.aborted
let commitOk = txn.commit()
check commitOk
check txn.isCommitted
for p in txn.participants:
check p.committed
check not p.aborted
test "CrossModalAbort: rollback after prepare aborts all participants":
var txn = newTPCTransaction(2)
txn.addParticipant("doc")
txn.addParticipant("fts")
check txn.prepare()
check txn.isPrepared
let rollbackOk = txn.rollback()
check rollbackOk
check txn.isAborted
for p in txn.participants:
check p.aborted
check not p.committed