STRUCTURE
측정 시스템 구조도
탐색용탐색적 구조화는 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에서 각 근거의 가중치로 붙는다.