vignette/apps/api/app/contracts/measurement_contract.v1.json
Yun Chan 16e791e044 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 산출물은 커밋에서 제외했다.
2026-08-08 01:30:53 +09:00

829 lines
20 KiB
JSON

{
"$defs": {
"AllianceAgentAssessment": {
"$defs": {
"AllianceDimensionAssessment": {
"additionalProperties": false,
"description": "한 관점의 한 동맹 축 평가와 transcript 근거.",
"properties": {
"confidence": {
"maximum": 1.0,
"minimum": 0.0,
"title": "Confidence",
"type": "number"
},
"evidence_turn_indices": {
"items": {
"type": "integer"
},
"maxItems": 12,
"minItems": 1,
"title": "Evidence Turn Indices",
"type": "array"
},
"rationale": {
"maxLength": 1200,
"minLength": 1,
"title": "Rationale",
"type": "string"
},
"score": {
"maximum": 1.0,
"minimum": 0.0,
"title": "Score",
"type": "number"
}
},
"required": [
"score",
"confidence",
"evidence_turn_indices",
"rationale"
],
"title": "AllianceDimensionAssessment",
"type": "object"
}
},
"additionalProperties": false,
"description": "client-agent 또는 observer가 독립 실행으로 만든 3축 평가.",
"properties": {
"bond": {
"$ref": "#/$defs/AllianceDimensionAssessment"
},
"goal": {
"$ref": "#/$defs/AllianceDimensionAssessment"
},
"task": {
"$ref": "#/$defs/AllianceDimensionAssessment"
}
},
"required": [
"goal",
"task",
"bond"
],
"title": "AllianceAgentAssessment",
"type": "object"
},
"AllianceScores": {
"additionalProperties": false,
"description": "goal/task/bond를 서로 가리지 않는 독립 0..1 점수.",
"properties": {
"bond": {
"maximum": 1.0,
"minimum": 0.0,
"title": "Bond",
"type": "number"
},
"goal": {
"maximum": 1.0,
"minimum": 0.0,
"title": "Goal",
"type": "number"
},
"task": {
"maximum": 1.0,
"minimum": 0.0,
"title": "Task",
"type": "number"
}
},
"required": [
"goal",
"task",
"bond"
],
"title": "AllianceScores",
"type": "object"
},
"BenchmarkCase": {
"$defs": {
"BenchmarkExpectation": {
"additionalProperties": false,
"properties": {
"construct": {
"enum": [
"working_alliance",
"session_outcome",
"rupture_repair",
"counselor_skill",
"self_calibration",
"transfer",
"simulation_progress"
],
"title": "Construct",
"type": "string"
},
"dimension": {
"minLength": 1,
"title": "Dimension",
"type": "string"
},
"direction": {
"enum": [
"low",
"mid",
"high",
"drop",
"rise",
"detected",
"not_detected"
],
"title": "Direction",
"type": "string"
},
"evidence_turn_indices": {
"items": {
"type": "integer"
},
"minItems": 1,
"title": "Evidence Turn Indices",
"type": "array"
},
"perspective": {
"enum": [
"client_agent_report",
"learner_self_report",
"independent_observer",
"supervisor_human",
"client_simulation",
"runtime_observation"
],
"title": "Perspective",
"type": "string"
},
"source_kind": {
"enum": [
"simulated_state",
"model_inferred",
"agent_reported",
"learner_reported",
"human_rated",
"observed_runtime"
],
"title": "Source Kind",
"type": "string"
}
},
"required": [
"construct",
"dimension",
"perspective",
"source_kind",
"direction",
"evidence_turn_indices"
],
"title": "BenchmarkExpectation",
"type": "object"
},
"BenchmarkTurn": {
"additionalProperties": false,
"properties": {
"speaker": {
"enum": [
"counselor",
"client"
],
"title": "Speaker",
"type": "string"
},
"text": {
"minLength": 1,
"title": "Text",
"type": "string"
}
},
"required": [
"speaker",
"text"
],
"title": "BenchmarkTurn",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"case_id": {
"pattern": "^oas-g0-[0-9]{3}$",
"title": "Case Id",
"type": "string"
},
"description_ko": {
"minLength": 1,
"title": "Description Ko",
"type": "string"
},
"expected": {
"items": {
"$ref": "#/$defs/BenchmarkExpectation"
},
"minItems": 1,
"title": "Expected",
"type": "array"
},
"forbidden_claims": {
"items": {
"type": "string"
},
"minItems": 1,
"title": "Forbidden Claims",
"type": "array"
},
"scene_type": {
"enum": [
"goal_mismatch",
"task_mismatch",
"empathic_miss",
"withdrawal",
"confrontation",
"successful_repair",
"failed_repair",
"warm_but_directionless"
],
"title": "Scene Type",
"type": "string"
},
"tags": {
"default": [],
"items": {
"type": "string"
},
"title": "Tags",
"type": "array"
},
"title_ko": {
"minLength": 1,
"title": "Title Ko",
"type": "string"
},
"turns": {
"items": {
"$ref": "#/$defs/BenchmarkTurn"
},
"minItems": 2,
"title": "Turns",
"type": "array"
},
"version": {
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
"title": "Version",
"type": "string"
}
},
"required": [
"case_id",
"version",
"scene_type",
"title_ko",
"description_ko",
"turns",
"expected",
"forbidden_claims"
],
"title": "BenchmarkCase",
"type": "object"
},
"MeasurementEvent": {
"additionalProperties": false,
"description": "append-only 측정 이벤트.\n\n정정은 기존 행 변경이 아니라 새 이벤트의 ``supersedes_id``로 표현한다.",
"properties": {
"confidence": {
"anyOf": [
{
"maximum": 1.0,
"minimum": 0.0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Confidence"
},
"construct": {
"enum": [
"working_alliance",
"session_outcome",
"rupture_repair",
"counselor_skill",
"self_calibration",
"transfer",
"simulation_progress"
],
"title": "Construct",
"type": "string"
},
"created_at": {
"format": "date-time",
"title": "Created At",
"type": "string"
},
"dimension": {
"maxLength": 120,
"minLength": 1,
"title": "Dimension",
"type": "string"
},
"error_code": {
"anyOf": [
{
"maxLength": 120,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error Code"
},
"evidence_turn_ids": {
"default": [],
"items": {
"format": "uuid",
"type": "string"
},
"title": "Evidence Turn Ids",
"type": "array"
},
"instrument_id": {
"maxLength": 120,
"minLength": 1,
"title": "Instrument Id",
"type": "string"
},
"instrument_version": {
"maxLength": 40,
"minLength": 1,
"title": "Instrument Version",
"type": "string"
},
"measurement_id": {
"format": "uuid",
"title": "Measurement Id",
"type": "string"
},
"metadata": {
"title": "Metadata",
"type": "object"
},
"model_run_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Model Run Id"
},
"perspective": {
"enum": [
"client_agent_report",
"learner_self_report",
"independent_observer",
"supervisor_human",
"client_simulation",
"runtime_observation"
],
"title": "Perspective",
"type": "string"
},
"pulse_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Pulse Id"
},
"scale_max": {
"title": "Scale Max",
"type": "number"
},
"scale_min": {
"title": "Scale Min",
"type": "number"
},
"session_id": {
"format": "uuid",
"title": "Session Id",
"type": "string"
},
"source_kind": {
"enum": [
"simulated_state",
"model_inferred",
"agent_reported",
"learner_reported",
"human_rated",
"observed_runtime"
],
"title": "Source Kind",
"type": "string"
},
"status": {
"default": "ready",
"enum": [
"ready",
"degraded",
"error",
"rejected"
],
"title": "Status",
"type": "string"
},
"supersedes_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Supersedes Id"
},
"turn_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Turn Id"
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Value"
},
"visible_to": {
"default": [
"evaluator"
],
"items": {
"enum": [
"client",
"counselor",
"evaluator",
"supervisor",
"research"
],
"type": "string"
},
"title": "Visible To",
"type": "array"
}
},
"required": [
"session_id",
"construct",
"dimension",
"perspective",
"source_kind",
"instrument_id",
"instrument_version",
"scale_min",
"scale_max"
],
"title": "MeasurementEvent",
"type": "object"
},
"MeasurementInstrument": {
"additionalProperties": false,
"description": "척도·훈련지표·시뮬레이션 신호의 버전 고정 레지스트리.",
"properties": {
"construct": {
"enum": [
"working_alliance",
"session_outcome",
"rupture_repair",
"counselor_skill",
"self_calibration",
"transfer",
"simulation_progress"
],
"title": "Construct",
"type": "string"
},
"created_at": {
"format": "date-time",
"title": "Created At",
"type": "string"
},
"instrument_id": {
"maxLength": 120,
"minLength": 1,
"title": "Instrument Id",
"type": "string"
},
"instrument_kind": {
"enum": [
"validated_measure",
"training_metric",
"simulation_signal",
"runtime_metric"
],
"title": "Instrument Kind",
"type": "string"
},
"instrument_version": {
"maxLength": 40,
"minLength": 1,
"title": "Instrument Version",
"type": "string"
},
"language": {
"default": "ko-KR",
"maxLength": 35,
"minLength": 2,
"title": "Language",
"type": "string"
},
"license_id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "License Id"
},
"metadata": {
"title": "Metadata",
"type": "object"
},
"name_ko": {
"maxLength": 200,
"minLength": 1,
"title": "Name Ko",
"type": "string"
},
"scoring_schema": {
"title": "Scoring Schema",
"type": "object"
},
"validation_basis": {
"maxLength": 1000,
"minLength": 1,
"title": "Validation Basis",
"type": "string"
}
},
"required": [
"instrument_id",
"instrument_version",
"name_ko",
"instrument_kind",
"construct",
"validation_basis"
],
"title": "MeasurementInstrument",
"type": "object"
},
"ModelRun": {
"additionalProperties": false,
"description": "측정을 만든 모델 실행의 재현·드리프트 감사 계약.",
"properties": {
"agent_role": {
"enum": [
"client",
"evaluator",
"coach",
"scenario",
"research"
],
"title": "Agent Role",
"type": "string"
},
"created_at": {
"format": "date-time",
"title": "Created At",
"type": "string"
},
"error_code": {
"anyOf": [
{
"maxLength": 120,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error Code"
},
"input_evidence_hash": {
"pattern": "^[a-f0-9]{64}$",
"title": "Input Evidence Hash",
"type": "string"
},
"metadata": {
"title": "Metadata",
"type": "object"
},
"model": {
"maxLength": 160,
"minLength": 1,
"title": "Model",
"type": "string"
},
"model_run_id": {
"format": "uuid",
"title": "Model Run Id",
"type": "string"
},
"prompt_bundle_hash": {
"pattern": "^[a-f0-9]{64}$",
"title": "Prompt Bundle Hash",
"type": "string"
},
"prompt_bundle_id": {
"maxLength": 160,
"minLength": 1,
"title": "Prompt Bundle Id",
"type": "string"
},
"prompt_bundle_version": {
"maxLength": 40,
"minLength": 1,
"title": "Prompt Bundle Version",
"type": "string"
},
"provider": {
"maxLength": 80,
"minLength": 1,
"title": "Provider",
"type": "string"
},
"session_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Session Id"
},
"status": {
"default": "ready",
"enum": [
"ready",
"degraded",
"error"
],
"title": "Status",
"type": "string"
},
"structured_schema_version": {
"maxLength": 80,
"minLength": 1,
"title": "Structured Schema Version",
"type": "string"
},
"turn_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Turn Id"
}
},
"required": [
"agent_role",
"provider",
"model",
"prompt_bundle_id",
"prompt_bundle_version",
"prompt_bundle_hash",
"structured_schema_version",
"input_evidence_hash"
],
"title": "ModelRun",
"type": "object"
}
},
"$id": "https://vignette.local/contracts/measurement_contract.v1.json",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"enums": {
"aiViews": [
"client",
"counselor",
"evaluator",
"supervisor",
"research"
],
"allianceCheckpoints": [
"pre",
"mid",
"post"
],
"allianceDimensions": [
"goal",
"task",
"bond"
],
"constructs": [
"working_alliance",
"session_outcome",
"rupture_repair",
"counselor_skill",
"self_calibration",
"transfer",
"simulation_progress"
],
"instrumentKinds": [
"validated_measure",
"training_metric",
"simulation_signal",
"runtime_metric"
],
"measurementStatuses": [
"ready",
"degraded",
"error",
"rejected"
],
"modelRunStatuses": [
"ready",
"degraded",
"error"
],
"perspectives": [
"client_agent_report",
"learner_self_report",
"independent_observer",
"supervisor_human",
"client_simulation",
"runtime_observation"
],
"sourceKinds": [
"simulated_state",
"model_inferred",
"agent_reported",
"learner_reported",
"human_rated",
"observed_runtime"
]
},
"sourcePerspectiveCompatibility": {
"agent_reported": [
"client_agent_report"
],
"human_rated": [
"supervisor_human"
],
"learner_reported": [
"learner_self_report"
],
"model_inferred": [
"independent_observer"
],
"observed_runtime": [
"runtime_observation"
],
"simulated_state": [
"client_simulation"
]
},
"title": "Vignette Outcome & Alliance Measurement Contract",
"version": 1
}