G0~G8 성과·동맹 측정 OS 작업 일괄 고정
8월 7일까지 워킹트리에만 남아 있던 미커밋 작업을 커밋한다. 여러 사본 폴더(worktree·clone)에 흩어져 있던 중간 스냅샷을 정리하기 전에 원본을 git 이력으로 고정하는 것이 목적이다. - contracts/routes/services: measurement, outcome_trajectory, rupture_repair, deliberate_practice, calibration_transfer, supervision_research, multimodal_alliance, continuous_improvement 계열 신규 모듈과 테스트 - infra/db/init: 07~16 마이그레이션(측정 기반~calibration transfer 실행) - apps/web: 세션 리뷰 카드·관리 화면·E2E 스펙 추가 - docs/ops: G0~G8 라이브 통합·배포·롤백 증거 문서와 evidence JSON/PNG - scripts: smoke·ledger·릴리스 에이전트·NAS 프리뷰 운영 스크립트 engine.public 로그 .bak과 apps/web/test-results 산출물은 커밋에서 제외했다.
This commit is contained in:
parent
93dd8f82d7
commit
16e791e044
390 changed files with 243188 additions and 499 deletions
|
|
@ -6,7 +6,18 @@ import re
|
|||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from .runtime_schema import NOTIFICATION_SCHEMA_CONTRACT, REVIEW_SCHEMA_CONTRACT
|
||||
from .runtime_schema import (
|
||||
CALIBRATION_TRANSFER_SCHEMA_CONTRACT,
|
||||
CONTINUOUS_IMPROVEMENT_SCHEMA_CONTRACT,
|
||||
DELIBERATE_PRACTICE_SCHEMA_CONTRACT,
|
||||
MEASUREMENT_SCHEMA_CONTRACT,
|
||||
MULTIMODAL_ALLIANCE_SCHEMA_CONTRACT,
|
||||
NOTIFICATION_SCHEMA_CONTRACT,
|
||||
OUTCOME_TRAJECTORY_SCHEMA_CONTRACT,
|
||||
REVIEW_SCHEMA_CONTRACT,
|
||||
RUPTURE_REPAIR_SCHEMA_CONTRACT,
|
||||
SUPERVISION_RESEARCH_SCHEMA_CONTRACT,
|
||||
)
|
||||
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[3]
|
||||
|
|
@ -18,7 +29,18 @@ INFRA_SQL = "\n".join(
|
|||
|
||||
class RuntimeSchemaSsotTest(unittest.TestCase):
|
||||
def test_runtime_contract_objects_are_owned_by_infra_sql(self) -> None:
|
||||
for contract in (REVIEW_SCHEMA_CONTRACT, NOTIFICATION_SCHEMA_CONTRACT):
|
||||
for contract in (
|
||||
REVIEW_SCHEMA_CONTRACT,
|
||||
NOTIFICATION_SCHEMA_CONTRACT,
|
||||
MEASUREMENT_SCHEMA_CONTRACT,
|
||||
OUTCOME_TRAJECTORY_SCHEMA_CONTRACT,
|
||||
RUPTURE_REPAIR_SCHEMA_CONTRACT,
|
||||
DELIBERATE_PRACTICE_SCHEMA_CONTRACT,
|
||||
CALIBRATION_TRANSFER_SCHEMA_CONTRACT,
|
||||
SUPERVISION_RESEARCH_SCHEMA_CONTRACT,
|
||||
CONTINUOUS_IMPROVEMENT_SCHEMA_CONTRACT,
|
||||
MULTIMODAL_ALLIANCE_SCHEMA_CONTRACT,
|
||||
):
|
||||
for relation in contract.relations:
|
||||
schema, table = relation.split(".")
|
||||
pattern = rf"CREATE TABLE IF NOT EXISTS\s+{re.escape(schema)}\.{re.escape(table)}\b"
|
||||
|
|
@ -27,13 +49,13 @@ class RuntimeSchemaSsotTest(unittest.TestCase):
|
|||
)
|
||||
|
||||
for qualified_name in contract.columns:
|
||||
_, table, column = qualified_name.split(".")
|
||||
schema, table, column = qualified_name.split(".")
|
||||
table_mentions = [
|
||||
block
|
||||
for block in re.split(
|
||||
r"(?=CREATE TABLE IF NOT EXISTS|ALTER TABLE)", INFRA_SQL
|
||||
)
|
||||
if re.search(rf"\bapp\.{re.escape(table)}\b", block)
|
||||
if re.search(rf"\b{re.escape(schema)}\.{re.escape(table)}\b", block)
|
||||
]
|
||||
self.assertTrue(
|
||||
any(
|
||||
|
|
@ -44,14 +66,63 @@ class RuntimeSchemaSsotTest(unittest.TestCase):
|
|||
)
|
||||
|
||||
for qualified_name in contract.policies:
|
||||
_, table, policy = qualified_name.split(".")
|
||||
pattern = rf"CREATE POLICY\s+{re.escape(policy)}\s+ON\s+app\.{re.escape(table)}\b"
|
||||
schema, table, policy = qualified_name.split(".")
|
||||
pattern = (
|
||||
rf"CREATE POLICY\s+{re.escape(policy)}\s+ON\s+"
|
||||
rf"{re.escape(schema)}\.{re.escape(table)}\b"
|
||||
)
|
||||
self.assertRegex(
|
||||
INFRA_SQL,
|
||||
pattern,
|
||||
msg=f"infra SQL missing policy: {qualified_name}",
|
||||
)
|
||||
|
||||
for qualified_name in contract.triggers:
|
||||
schema, table, trigger = qualified_name.split(".")
|
||||
pattern = (
|
||||
rf"CREATE TRIGGER\s+{re.escape(trigger)}\s+"
|
||||
rf"(?:BEFORE|AFTER|INSTEAD OF)[\s\S]*?ON\s+"
|
||||
rf"{re.escape(schema)}\.{re.escape(table)}\b"
|
||||
)
|
||||
self.assertRegex(
|
||||
INFRA_SQL,
|
||||
pattern,
|
||||
msg=f"infra SQL missing trigger: {qualified_name}",
|
||||
)
|
||||
|
||||
for qualified_name in contract.indexes:
|
||||
schema, table, index = qualified_name.split(".")
|
||||
pattern = (
|
||||
rf"CREATE (?:UNIQUE )?INDEX IF NOT EXISTS\s+{re.escape(index)}"
|
||||
rf"\s+ON\s+{re.escape(schema)}\.{re.escape(table)}\b"
|
||||
)
|
||||
self.assertRegex(
|
||||
INFRA_SQL,
|
||||
pattern,
|
||||
msg=f"infra SQL missing index: {qualified_name}",
|
||||
)
|
||||
|
||||
def test_alliance_pulse_contract_keeps_lock_and_history_guards(self) -> None:
|
||||
required_fragments = (
|
||||
"CONSTRAINT measurement_event_pulse_session_fkey",
|
||||
"CONSTRAINT self_assessment_pulse_session_fkey",
|
||||
"CONSTRAINT ck_alliance_pulse_lock_before_reveal",
|
||||
"CONSTRAINT ck_alliance_pulse_time_order",
|
||||
"CONSTRAINT ck_alliance_pulse_terminal_state",
|
||||
"CREATE TABLE IF NOT EXISTS audit.alliance_pulse_status_event",
|
||||
"SECURITY DEFINER",
|
||||
"CREATE POLICY p_alliance_pulse_status_event_select",
|
||||
)
|
||||
for fragment in required_fragments:
|
||||
with self.subTest(fragment=fragment):
|
||||
self.assertIn(fragment, INFRA_SQL)
|
||||
|
||||
self.assertNotIn(
|
||||
"CREATE POLICY p_alliance_pulse_status_event_insert",
|
||||
INFRA_SQL,
|
||||
msg="status audit rows must only be produced by the pulse trigger",
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue