feat: deliver Sense audits to Bell (T-016)
Harness governance / validate (push) Has been cancelled
Harness governance / validate (pull_request) Has been cancelled

This commit is contained in:
QiuSW
2026-08-11 00:24:32 +08:00
parent aca22f4667
commit 4be2386421
35 changed files with 2188 additions and 42 deletions
+17
View File
@@ -60,6 +60,8 @@ class PostgresContractTests(unittest.TestCase):
"011_privileges_reconcile_safety.sql",
"012_bell_events.sql",
"013_privileges_bell_events.sql",
"014_audit_relay.sql",
"015_privileges_audit_relay.sql",
],
names,
)
@@ -129,6 +131,21 @@ class PostgresContractTests(unittest.TestCase):
self.assertIn(marker, text)
self.assertNotIn("D:\\pgsql17\\data", text)
def test_audit_relay_uses_fencing_and_separate_schema_ownership(self) -> None:
migration = normalized(migration_text("014_audit_relay.sql"))
privileges = normalized(migration_text("015_privileges_audit_relay.sql"))
for marker in (
"relay_lease_owner",
"relay_lease_token",
"relay_lease_until",
"create table if not exists bell.audit_events",
"create table if not exists bell.audit_relay_receipts",
"expires_at >= received_at + interval '10 minutes'",
):
self.assertIn(marker, migration)
self.assertIn("grant select, insert on table bell.audit_events to bell_runtime", privileges)
self.assertIn("revoke all on table bell.audit_events, bell.audit_relay_receipts from sense_app", privileges)
if __name__ == "__main__":
unittest.main()
+54
View File
@@ -0,0 +1,54 @@
"""Cross-language invariants for the Sense-to-Bell audit relay contract."""
from __future__ import annotations
import json
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
CONTRACT = ROOT / "docs" / "contracts" / "sense-audit-relay-v1.openapi.json"
class SenseAuditRelayContractTests(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.document = json.loads(CONTRACT.read_text(encoding="utf-8"))
def test_transport_and_response_are_frozen(self) -> None:
operation = self.document["paths"]["/internal/v1/audit-events:batch"]["post"]
self.assertEqual({"200", "400", "401", "409", "413", "503"}, set(operation["responses"]))
headers = {item["name"] for item in operation["parameters"]}
self.assertEqual(
{"X-YoVision-Key-Id", "X-YoVision-Timestamp", "X-YoVision-Nonce", "X-YoVision-Signature"},
headers,
)
def test_numeric_safety_bounds_match_task(self) -> None:
events = self.document["components"]["schemas"]["BatchRequest"]["properties"]["events"]
self.assertEqual((1, 100), (events["minItems"], events["maxItems"]))
signature = self.document["x-yovision-signature"]
delivery = self.document["x-yovision-delivery"]
self.assertEqual(300, signature["clock_skew_seconds"])
self.assertEqual(600, signature["receipt_ttl_seconds"])
self.assertEqual((30, 1, 300), (delivery["lease_seconds"], delivery["initial_retry_seconds"], delivery["maximum_retry_seconds"]))
def test_contract_and_implementations_share_literals(self) -> None:
sense = (ROOT / "Sense" / "internal" / "auditrelay" / "client.go").read_text(encoding="utf-8")
bell = (ROOT / "Bell" / "internal" / "audit" / "audit.go").read_text(encoding="utf-8")
for marker in (
"/internal/v1/audit-events:batch",
"X-YoVision-Key-Id",
"X-YoVision-Timestamp",
"X-YoVision-Nonce",
"X-YoVision-Signature",
):
self.assertIn(marker, sense)
self.assertIn(marker, bell)
self.assertIn("10 * time.Second", sense)
self.assertIn("300*time.Second", (ROOT / "Sense" / "internal" / "auditrelay" / "worker.go").read_text(encoding="utf-8"))
if __name__ == "__main__":
unittest.main()