STRUCTURE

측정 시스템 구조도

2026.08.28 · Mermaid classDiagram
탐색용탐색적 구조화는 Mermaid가 정본 경로다. 아래 코드는 그대로 복사해 mermaid.live나 md 문서에서 편집·재현할 수 있다. 노드에 실명·발화 원문은 넣지 않는다.

1. Top-down - 수업 운영과 참여 측정

강사의 Daily 수업 진행에서 출발해, 실황이 원장으로 착지하고, 수강생 개인의 참여가 O/X로 측정되어 수행성적표로 모이는 위에서 아래 방향. 근거 실물 = ledger_slots · attendance_marks (schema_ext.sql)

classDiagram
direction LR

class Instructor["강사"] {
  Daily 수업 진행
  콘텐츠 빌드 소유
}
class ContentBuild["수업 콘텐츠 빌드"] {
  TEXT build_id
  TEXT g1_gate
}
class ClassDay["수업회차 Day"] {
  INT day_no
  INT month
  TEXT series_label
}
class Student["수강생"] {
  TEXT subject_id
  TEXT subject_code
}
class LedgerDay["원장 일자 폴더"] {
  TEXT path
  TEXT status_json
}
class LedgerSlot["ledger_slots"] {
  TEXT slot_id
  INT day_no
  TEXT axis
  INT file_count
  INT byte_size
  TEXT homogeneity_grade
  TEXT usage_rule
}
class AttendanceMark["attendance_marks"] {
  TEXT subject_id
  INT day_no
  TEXT axis
  TEXT mark
  TEXT source_class
}
class Scorecard["수행성적표"] {
  INT denominator_23
  TEXT rule_OX_only
}
class LedgerAxis["원장 축"] {
  <<enumeration>>
  zoom
  tiro
  slack
  mlp
  github
  deploy
  survey
}
class AttendAxis["참여 축"] {
  <<enumeration>>
  voice
  chat
}

Instructor "1" --> "36" ClassDay : 진행 D01-D36
Instructor "1" --> "*" ContentBuild : 제작
ContentBuild "1" --> "1" ClassDay : G1 통과 후 배포
Student "9" --> "*" ClassDay : 참여
ClassDay "1" --> "1" LedgerDay : 야간 자동수집 착지
LedgerDay "1" *-- "1..7" LedgerSlot : 축별 슬롯
LedgerSlot --> LedgerAxis : axis
LedgerSlot ..> AttendanceMark : 실측 근거 제공
Student "1" --> "*" AttendanceMark : 회차별 O X
AttendanceMark --> AttendAxis : axis
AttendanceMark "*" --o "1" Scorecard : 분모 23회차 집계

note for LedgerSlot "동질성 등급 A 주계열 / B 계열상이 / C 밀도결손 / D 부재 - 근거 가중치"
note for AttendanceMark "참여 판정 voice = Zoom VTT, 발화 인용은 Tiro - 축 분리 260827"
note for Student "실명은 이 시스템에 없다 - 코드-실명 대조는 로컬 CODE_MAP 한 곳"
참여 측정의 분모종료까지 일자 통일 23회차(D06-D28). 재적 보정 없음 - 전원 같은 분모.
동질성 등급의 쓰임슬롯(회차 x 축) 단위 A-D 등급이 bottom-up 근거 사슬의 가중치로 이어진다.
G1 게이트자료가 교실에 나가도 되는지 보는 검사. 통과 전 배포 금지.
Mermaid 코드 복사

2. Bottom-up - 역량 cartesian 근거 사슬

발화 조각에서 출발해 에피소드 코딩, PM 28축 매핑, 반 내 희소성과 시장 요구율의 곱(차별점수), 주차 성장 집계까지 아래에서 위 방향. 근거 실물 = class_evidence.sqlite3 (schema_base.sql 김소현 1.0.0 상속 + schema_ext.sql)

classDiagram
direction LR

class CaseSubject["수강생 case"] {
  TEXT subject_id
  TEXT subject_code
}
class Source["sources"] {
  TEXT source_id
  TEXT source_kind
  TEXT locator
  TEXT captured_at
}
class SourceFragment["source_fragments 3552"] {
  TEXT fragment_id
  TEXT fragment_locator
  TEXT speaker
  TEXT exact_text
  TEXT source_class
}
class Episode["episodes 577"] {
  TEXT episode_id
  TEXT title
  TEXT occurred_on
  TEXT situation
  TEXT action_text
  TEXT result_text
  TEXT review_status
}
class EpisodeEvidence["episode_evidence"] {
  TEXT relation
}
class Competency["competencies PM-01..28"] {
  TEXT competency_code
  TEXT group_code
  TEXT name_kr
  TEXT operational_definition
  TEXT inference_signals_json
}
class EpisodeCompetency["episode_competencies 1173"] {
  TEXT mapping_reason
  TEXT mapping_status
  TEXT discovery_mode
  TEXT source_class
}
class ClassRarity["class_rarity"] {
  INT holders
  INT class_size
  REAL market_demand_pct
}
class JobPosting["job_postings 4093"] {
  TEXT company_name
  TEXT role_title
  TEXT url
  TEXT observed_on
}
class JobRequirement["job_requirements 9012"] {
  TEXT requirement_type
  TEXT raw_text
}
class RequirementCompetency["requirement_competencies 9056"] {
  TEXT mapping_reason
  TEXT mapping_status
}
class VWeeklyGrowth["v_weekly_growth"] {
  <<view>>
  INT wk
  INT mapped
  INT distinct_codes
  INT utterances
}
class VUnsupported["v_unsupported_mappings"] {
  <<view>>
  불변식 0건
}

CaseSubject "1" *-- "*" Source : 보유
Source "1" *-- "*" SourceFragment : 분절
CaseSubject "1" *-- "*" Episode : 행위 코딩
Episode "1" *-- "*" EpisodeEvidence : 근거 연결
EpisodeEvidence "*" --> "1" SourceFragment : supports contradicts context
Episode "1" *-- "*" EpisodeCompetency : 축 판정
EpisodeCompetency "*" --> "1" Competency : PM 28축
ClassRarity "1" --> "1" Competency : 반 내 보유율
CaseSubject "1" *-- "*" JobPosting : 공고 매칭
JobPosting "1" *-- "*" JobRequirement : 요건 분해
JobRequirement "1" *-- "*" RequirementCompetency : 요건 매핑
RequirementCompetency "*" --> "1" Competency : 같은 좌표계
VWeeklyGrowth ..> EpisodeCompetency : 주차 집계
VWeeklyGrowth ..> SourceFragment : 발화 분모
VUnsupported ..> EpisodeCompetency : 근거 없는 매핑 적발

note for EpisodeCompetency "proposed에서 confirmed로 승격, 반박 경로 rejected - O X만, 점수 서열 금지"
note for ClassRarity "차별점수 = market_demand_pct x (1 - holders / class_size)"
note for VWeeklyGrowth "성장 3지표 = 누적 폭(단조증가) / 주차 신규 / 밀도. Daily 축 기각 - 수업 성격 노이즈"
note for Competency "O*NET GWA 41 중 PM 28축 - top-down 성적표와 같은 수강생을 다른 축으로 본다"
grounded theory 불변식모든 역량 매핑은 fragment 원문까지 역추적된다. v_unsupported_mappings = 0건이어야 배포 가능.
두 매핑의 대칭episode_competencies(수강생 쪽)와 requirement_competencies(시장 쪽)가 같은 PM 28축 좌표계를 쓴다. 그래서 곱이 성립한다.
top-down과의 연결ledger_slots의 A-D 등급이 v_evidence_chain에서 각 근거의 가중치로 붙는다.
Mermaid 코드 복사