11. 구현 순서와 검증 — 무엇부터, 무엇으로 확인하나
⚠️ SR에 없는 내용이다. §2가 "시험 절차는 별도의 시험 명세서에서 정의한다"고 미뤄 둔 부분과, 프로젝트 진행 계획을 요구사항에서 역산한 초안이다. 09편(구조)·10편(인터페이스)이 "무엇을 만드나"였다면, 이 편은 **"어떤 순서로 만들고 무엇으로 통과를 판정하나"**다.
0. 이 프로젝트가 서 있는 틀 — V모델
개발 프로세스로 **V모델**을 쓴다. 자동차 임베디드에서 사실상 표준이고, ISO 26262 도 이 구조를 전제한다.
점선이 V모델의 전부다
왼팔을 내려가며 요구사항을 쪼개고, 오른팔을 올라가며 합쳐서 검증한다. 각 층이 자기 짝이 되는 시험 단계를 갖는다는 게 핵심이다.
| 왼팔 (분해) | 짝이 되는 오른팔 (검증) | 무엇을 확인하나 |
|---|---|---|
| SR | 인수 시험 | 사용자가 원한 것이 되는가 |
| SysRS | 시스템 시험 | 시스템이 요구대로 동작하는가 |
| SWRS / HWRS | 통합 시험 | 노드끼리 붙였을 때 맞는가 |
| 설계 | 단위 시험 | 모듈 하나가 설계대로 도는가 |
시험 명세는 구현 전에 쓴다
이게 V모델을 쓰는 실질적 이유다. SR 을 쓸 때 인수 시험 항목을 같이 정하고, 설계를 할 때 단위 시험을 같이 정한다. 구현을 다 하고 나서 "이제 뭘 시험하지"를 고민하지 않는다.
그래서 §9 가 요구사항을 검증 가능성 기준으로 쪼개라고 하는 것이다 — 요구사항 하나가 시험 항목 하나가 되도록 쓰여 있어야 이 대응이 성립한다.
✗ "끼임을 감지하면 정지하고 보호 위치까지 열어야 한다"
→ 정지는 됐는데 보호 동작이 안 되면 이 시험은 통과인가 실패인가
✓ 두 문장으로 분리
→ 시험 항목 둘. 결함 위치가 정확히 특정된다
이 프로젝트가 V 의 어디에 있나
SR ✅ 이 문서 (v1.0). 왼팔 맨 위는 확보됐다
SysRS 🔶 12편이 초안. 노드 할당·중재 규칙까지는 잡았으나 팀 합의 전이고,
정책 TBD 4건은 여기서 못 닫는다
설계 🔶 09편(구조) · 10편(인터페이스)이 초안. 팀 합의 전이라 확정 아님
구현 ⬜ M2 부터
시험 🔶 §3 의 추적 매트릭스가 뼈대. 시험 명세서로 옮겨야 한다
비어 있는 SysRS 가 이 프로젝트의 가장 큰 공백이다. 09·10편이 그 자리를 임시로 채우고 있지만, 정식 문서가 아니라 요구사항에서 역산한 초안이다. 그리고 TBD 32건 중 상당수가 사실 SysRS 에서 결정될 항목이다 — 통신 방식, 노드 간 프로토콜, 중재 규칙.
흔한 오해 — V모델 = 폭포수?
아니다. 왼팔을 다 끝내고 오른팔로 넘어가야 하는 게 아니다. 기능 단위로 V 를 여러 번 돌 수 있고(반복 V), 실제로 이 프로젝트도 그렇게 간다 — M1 벤치 실험에서 얻은 수치가 SR 의 TBD 를 닫으면서 왼팔로 되돌아간다.
V모델이 강제하는 건 순서가 아니라 대응 관계다. "이 요구사항은 어느 시험으로 확인하나"에 항상 답이 있어야 한다는 것.
그래서 §9 의 마지막 원칙이 중요해진다
"요구사항 변경 시 관련 기능 요구사항, 기능별 상태, HMI 표시 및 시험 항목의 영향을 함께 검토한다."
왼팔이 바뀌면 오른팔도 바뀐다. 변경 영향 분석이 V모델에서 필수인 이유이고, §6 의 tbd_status.md 에 "재시험 필요" 열을 둔 것이 그 실행이다.
1. 순서를 정하는 원칙
1-1. 세 가지 제약이 순서를 결정한다
③이 가장 자주 무시된다. 쉬운 것부터 하면 진도가 빨리 나가는 것처럼 보이지만, 어려운 것을 나중에 만나면 그때 설계를 뒤집어야 한다. 이 프로젝트에서 미지수가 가장 큰 것은:
| 미지수 | 왜 위험한가 | 언제 확인해야 하나 |
|---|---|---|
| Anti-pinch 감지 방식 (TBD-009) | 방식에 따라 위치 센서 구성이 바뀌고(TBD-008), 그게 §6.2.2 가용성 조건을 바꾼다 | 최우선 |
| RSSI 근접 판정 안정성 (TBD-016) | 안 되면 Smart Access 전체가 흔들린다 | 초기 |
| RPi 추론 성능 (TBD-014, 030) | FPS가 안 나오면 max_age를 못 맞춘다 | 초기 |
| ESP32 ↔ Central 링크 (TBD-001) | 물리 방식이 바뀌면 HMI 코드 전체가 영향 | 초기 |
전부 "만들어 봐야 아는 것"이다. 그래서 벤치 실험이 기능 구현보다 먼저 온다.
1-2. TBD 차단 그래프 — 무엇을 먼저 닫아야 하나
08편 §3-3에서 만든 의존 그래프를 결정 순서로 다시 그리면:
0주차 4건은 회의 한 번으로 닫힌다. 그런데 이게 안 닫히면 아무도 통신 코드를 못 짠다. 가장 값싸고 가장 파급이 큰 결정이므로 제일 먼저 해야 한다.
정책 TBD 4건(WP)을 별도 트랙으로 뺀 게 중요하다. 08편 §3-2에서 지적했듯, 이건 시험 대기 목록에 넣으면 영원히 안 닫힌다.
2. 마일스톤
M0 — 계약 확정 (0주차)
| 산출물 | 내용 |
|---|---|
| TBD-001/002/003/027 확정 | 회의 + 결정 기록 |
interface/signals.yaml v0.1 | 10편 §7의 신호 정의 |
common/ 골격 | svc/trust, svc/fault, svc/req, com/e2e, com/heartbeat |
| 디렉터리·빌드 구조 | 09편 §10 |
코드를 짜기 전에 이걸 끝내야 한다. common/을 먼저 만드는 이유는, 각 노드 담당자가 자기 방식으로 유효성 판정을 짜기 시작하면 나중에 통일이 불가능하기 때문이다.
M0 통과 기준: 6개 노드 담당자가 같은
signals.h를 include 해서 빈 프로젝트가 빌드된다.
M1 — 벤치 실험 (1~2주차)
기능 구현이 아니라 미지수를 숫자로 바꾸는 단계다.
| 실험 | 얻는 것 | 닫는 TBD |
|---|---|---|
| 윈도우 모사 장치 + 홀/리플 카운트 | 위치 해상도, 끝단 검출 신뢰성 | TBD-008 |
| 정상 상승 vs 인위적 끼임의 전류·속도 프로파일 | 판정 임계값 후보, 반응 시간 | TBD-009 |
| 초음파 1개 → 4개 순차 발신 | 갱신 주기, 크로스토크, 최소·최대 거리 | TBD-013 |
| 폰 3~4기종 × 거리 5구간 RSSI 로그 | 필터 계수, 히스테리시스 밴드, 유지 시간 | TBD-016 |
| RPi 후보 모델 3종 벤치 | FPS, 정확도, CPU/온도 | TBD-014 |
TBD-009 실험이 이 단계의 핵심이다. 02편 §4-2에서 봤듯 전류 절대값만으로는 안 되고 학습 기준선이 필요한데, 기준선을 만들려면 먼저 정상 프로파일을 측정해야 한다. 이게 없으면 Anti-pinch를 아예 못 짠다.
실험 절차 (TBD-009)
1. 정상 닫힘 20회 — 위치 구간별 전류·속도 로깅 → 기준선 프로파일
2. 온도 조건 변경(냉장고/히터) 후 반복 → 기준선의 온도 의존성
3. 인위적 끼임 (스펀지·목재·손가락 모형) × 위치 5구간 × 10회
4. 정상 스톨(완전 닫힘) 20회 → 끼임과 구분되는 특징 확인
5. 기준선 대비 초과 전류 · 속도 저하율의 분포 → 임계값 후보
6. 감지 → 브레이크 완료까지의 실측 지연 → 반응 시간
M1 통과 기준: 위 5개 TBD의 값이 근거 데이터와 함께 문서에 기록된다. "대충 이 정도"가 아니라 측정 그래프가 있어야 한다.
M2 — 노드별 단독 동작 (3~5주차)
각 노드가 통신 없이 자기 기능을 한다. 이 단계에서 통합을 시도하면 디버깅이 지옥이 된다.
| 노드 | 이 단계의 목표 | 확인 방법 |
|---|---|---|
| Power Window | 스위치로 열림/닫힘/정지 + Anti-pinch 동작 | 통신선 뽑고 시험 (§6.2.5 검증을 겸함) |
| Sensing | 4종 센서 값을 UART 콘솔에 출력 + 유효성 판정 | 센서 뽑기·가리기로 오류 유도 |
| Function | 도어락·Fan·LED를 로컬 버튼으로 구동 | 액추에이터 개별 동작 |
| Vision | 두 스트림 추론 결과를 콘솔 출력 | 사람/인형/사진으로 오탐 확인 |
| ESP32 | 화면 렌더 + 더미 데이터 표시 + BLE 스캔 | 실기 없이 상태 표시 |
| Central | VSS 음향 재생 + 우선순위 (더미 이벤트 입력) | 버튼으로 이벤트 주입 |
Power Window의 "통신선 뽑고 시험"이 특히 중요하다. §6.2.5의 "통신 오류가 발생하더라도 로컬 Anti-pinch 보호 기능을 유지"를 M2 단계에서 이미 검증하게 된다. 나중에 통합한 뒤 확인하려 하면 로컬 폐루프가 이미 깨져 있을 수 있다.
M2 통과 기준: 각 노드가 CAN 케이블 없이 자기 기능을 수행한다. 09편 §6-2의
safety.cinclude 검사도 여기서 한다.
M3 — 2노드 통합 (6~7주차)
한 번에 다 붙이지 않는다. 쌍으로 붙인다.
① Central ↔ Sensing : 센서 값이 올라오고 age 판정이 동작
② Central ↔ Power Window : 명령이 내려가고 Anti-pinch 이벤트가 올라옴 → 경고음
③ Central ↔ Function : 도어락·Fan·Ambient 제어
④ Central ↔ ESP32 : 상태 표시 + 요청 생성
⑤ Sensing ↔ RPi : 비전 결과 중계
②를 먼저 하는 이유: 01편 §5의 전체 시퀀스(끼임 → CAN → 경고음)가 이 시스템에서 가장 타이밍이 빡빡한 경로다. 여기서 지연이 크게 나오면 설계를 고쳐야 하는데, 늦게 발견할수록 비싸다.
M3 통과 기준: 각 쌍에서 heartbeat·E2E·age가 정상 동작하고, 한쪽 노드를 껐을 때 다른 쪽이 §6.5.3대로 stale/오류를 표시한다.
M4 — 전체 통합 (8~9주차)
| 확인 대상 | 왜 여기서만 보이나 |
|---|---|
| 버스 부하 실측 | 전 노드가 붙어야 실제 부하가 나온다 (10편 §8 계산 검증) |
| 우선순위 경합 | 여러 이벤트가 동시에 나야 §6.1.2·§6.4.3이 시험된다 |
| Fan 소유권 전환 | 자동공조·수동·Pre-conditioning이 다 살아야 |
| Ambient 6종 표시 우선순위 | 〃 |
| max_age 실측 | 실제 주기·지터로 TBD-022 확정 |
M4 통과 기준: TBD-020/021/022/038/017이 실측값으로 확정된다.
M5 — 요구사항 검증 (10주차~)
§6 전 요구사항을 시험 항목으로 돌린다. 3절의 매트릭스가 그 목록이다.
3. 요구사항 → 모듈 → 시험 항목 추적
08편 §2-4에서 본 문제 — SR에 요구사항 ID가 없어 추적성이 약하다 — 를 보완하는 표다. 절-순번 참조를 쓴다.
3-1. 표기 규칙
§6.2.4-2 = §6.2.4 절의 2번째 요구사항 문장
문장 순서가 바뀌면 참조가 깨지므로, SR 개정 시 이 표를 함께 갱신해야 한다(§9 변경 영향 분석).
3-2. 안전 요구사항 — 반드시 검증해야 하는 것들
| 참조 | 요구사항 요약 | 구현 모듈 | 시험 방법 | 통과 기준 |
|---|---|---|---|---|
| §6.2.4-1 | 닫힘 중 끼임 감지 | window/safety.c | 위치 5구간 × 시험체 3종 × 10회 | 검출률 100 % |
| §6.2.4-2 | 감지 시 즉시 정지 | 〃 | 고속 카메라 또는 로깅 | 감지→브레이크 ≤ TBD-009 값 |
| §6.2.4-3 | 보호 위치까지 열림 | window/motion.c | 정지 후 위치 측정 | TBD-009 보호 위치 ±허용 |
| §6.2.4-6 | 새 요청 전 자동 재개 금지 | window/safety.c 래치 | 스위치 누른 채 끼임 유발 | 재개 없음 (엣지 필요) |
| §6.2.5-1 | 통신 오류에도 Anti-pinch 유지 | 〃 (로컬 폐루프) | CAN 케이블 분리 후 끼임 | 정상 동작 |
| §6.2.2-4 | Anti-pinch 불가 시 닫힘 금지 | window/gate.c | 전류 센서 단선 후 닫힘 시도 | 거부 + 사유 표시 |
| §6.1.1-8 | 실내 고온 + 잔류 탑승자 → 사이렌 | arbiter + vss/catalog.c | 온도 상승 + 인형/사람 | 사이렌 출력 |
| §6.1.1-8 | 〃 차량 전원과 무관 | power/ | 전원 OFF 상태에서 반복 | 사이렌 출력 |
| §6.1.2-1 | 안티핀치 최우선 | vss/engine.c | 미디어 재생 중 끼임 유발 | 즉시 선점 |
| §6.4.1-5 | 열린 문 잠금 금지 | access/lock.c | 문 연 채 잠금 요청 | 구동 없음 |
| §6.4.1-6 | 액추에이터 지속 동작 방지 | access/lock.c + 워치독 | 상태 센서 단선 후 잠금 | 최대 시간 후 차단 |
| §6.4.2-7 | Fan 지속 방지 | climate/fan_mon.c | 요구-실제 불일치 유도 | 강제 OFF |
| §6.4.3-4 | 안전 표시가 설정으로 비활성화 안 됨 | ambient/dim.c | 밝기 최저 + Emergency | 식별 가능 밝기 유지 |
§6.2.5-1의 "CAN 케이블 분리 후 끼임"이 가장 중요한 단일 시험이다. 이 하나가 통과하면 로컬 폐루프 설계가 실제로 성립함이 증명된다. M2 단계에서 이미 하고, M4에서 다시 한다.
3-3. 유효성·오류 처리
| 참조 | 요구사항 요약 | 구현 | 시험 방법 |
|---|---|---|---|
| §6.3.4-1 | 범위 이탈 값 사용 금지 | svc/trust | 센서 단자 단락/개방 |
| §6.3.4-2 | 갱신 기준 미달 사용 금지 | 〃 | 송신 태스크 정지 주입 |
| §6.3.4-3 | 복구 조건 전 정상 간주 금지 | 〃 | 간헐 단선 반복 |
| §6.3.4-8 | stale 값을 정상으로 표시 금지 | ui/render.c | 노드 전원 차단 후 화면 확인 |
| §6.3.2-3 | 센서 하나 고장이 다른 기능 중단 금지 | svc/fault | 습도 센서만 분리 → 초음파 경고 확인 |
| §6.4.4-1 | 기능 오류 격리 | 〃 | Ambient 고장 → Smart Access 확인 |
| §6.4.4-2 | 복구 시 마지막 정상 정보로 재개 금지 | heartbeat.c + arbiter | 통신 차단 → 복구 → 동작 관찰 |
| §6.5.3-4 | 센서/통신/기능 오류 구분 표시 | ui/render.c | 3종 오류 각각 유도 |
| §6.6-3 | 개별 기능 오류가 타 기능 중단 금지 | svc/fault | 기능별 순차 고장 주입 |
오류 주입(fault injection)이 이 그룹 시험의 전부다. 정상 동작만 시험하면 SR의 절반을 검증 안 한 것이다 — 00편 §4에서 봤듯 이 문서는 "~하지 않아야 한다"가 대단히 많다.
/* 시험용 오류 주입 훅 — 개발 빌드에서만 컴파일 */
#ifdef VCS_FAULT_INJECTION
typedef enum {
FI_NONE, FI_SENSOR_STUCK, FI_SENSOR_RANGE, FI_TASK_HANG,
FI_CAN_SILENT, FI_CAN_CORRUPT, FI_ACTUATOR_NORESP,
} fi_mode_t;
extern fi_mode_t g_fi[FUNC_COUNT];
#define FI_ACTIVE(f, m) (g_fi[(f)] == (m))
#else
#define FI_ACTIVE(f, m) (0)
#endif
#ifdef로 감싸 양산 빌드에서 아예 링크되지 않게 한다. 03편 §4-3의 개인정보 코드와 같은 방식이다.
3-4. 우선순위·중재
| 참조 | 요구사항 | 시험 시나리오 |
|---|---|---|
| §6.1.2 전체 | VSS 음향 우선순위 | 미디어 재생 중 → 피드백음 → 장애물 경고 → 안티핀치 순차 발생 |
| §6.2.1-5~8 | 윈도우 요청 우선순위 | 자동환기 진행 중 → 원격 요청 → HMI 요청 → 스위치 순으로 개입 |
| §6.4.2-4 | Fan 소유권 전환 | Pre-conditioning 중 → 사용자 수동 → 자동공조 |
| §6.4.3-5 | Ambient 표시 우선순위 | Goodbye 중 → Access 피드백 → Warning → Fault → Emergency |
| §6.5.3-5 | HMI 안전 정보 우선 | 일반 상태 표시 중 Emergency 발생 |
이 그룹은 "동시 발생"을 만들어야 하므로 시험 지그가 필요하다. 손으로 타이밍을 맞출 수 없다. CAN으로 이벤트를 주입하는 스크립트를 만드는 게 현실적이다.
# tools/inject.py — 우선순위 시험용 이벤트 주입
import can, time
bus = can.interface.Bus(channel="can0", bustype="socketcan")
def send(arb_id, data): bus.send(can.Message(arbitration_id=arb_id, data=data))
# §6.1.2 시나리오: 미디어 → 피드백 → 장애물 → 안티핀치
send(0x130, [0x01]) # 미디어 재생 시작
time.sleep(1.0)
send(0x140, [0x01]) # 조작 피드백음
time.sleep(0.5)
send(0x210, prox_frame(400)) # 장애물 40 cm — 주의 거리
time.sleep(0.5)
send(0x010, [0x01]) # pinch_event ← 최우선, 즉시 선점되어야
3-5. 요청 생애주기·표시
| 참조 | 요구사항 | 시험 |
|---|---|---|
| §6.2.6-4 | 요청 수락/진행/완료/거부/중단 통지 | 각 결과를 유발하는 5개 시나리오 |
| §6.5.1-3 | 거부·실패 사유 제공 | 10편 reject_t 8종 각각 유발 |
| §6.5.2-3 | 연결 종료 시 자동 재전송 금지 | 요청 중 BLE/Wi-Fi 차단 → 복구 |
| §6.5.4-5 | 미확인 중요 경고 관리 | 앱 종료 상태에서 경고 발생 → 앱 실행 |
| §6.4.2-5 | 환기 닫힘 거부 시 정상완료 아님 | Anti-pinch 불가 상태로 만든 뒤 환기 종료 유도 |
마지막 항목이 만들기 까다롭다. 자동 환기가 열려 있는 상태에서 Anti-pinch를 사용 불가로 만들어야 한다. 오류 주입 훅(FI_SENSOR_STUCK을 전류 센서에)으로 유도하는 게 현실적이다.
4. 시험 환경
4-1. 필요한 지그
| 항목 | 용도 | 없으면 |
|---|---|---|
| 윈도우 모사 장치 | §6.2 전체 | Anti-pinch 검증 불가 |
| 끼임 시험체 (스펀지/목재/모형) | §6.2.4 | 사람 손으로 시험할 수 없다 |
| 온도 챔버 또는 히터·냉각 | §6.3.2 고온, TBD-009 온도 의존성 | ROA·기준선 검증 불가 |
| 조도 가변 광원 | §6.3.2, §6.4.3-6, TBD-011 | 히스테리시스 튜닝 불가 |
| 거리 표적 이동 지그 | §6.3.3, TBD-013 | 근접 단계 경계 확인 불가 |
| CAN 인터페이스 (PC) | 이벤트 주입·로깅 | 우선순위 시험 불가 |
| 로직 애널라이저 / 오실로스코프 | 타이밍 실측 | 반응 시간 측정 불가 |
| 폰 3~4기종 | TBD-016 | RSSI 일반화 불가 |
4-2. 로깅
시험 결과를 재현 가능하게 남기려면 로깅이 시험 지그의 일부다.
/* svc/log.h — 순환 버퍼 + CAN 또는 UART 덤프 */
typedef struct __attribute__((packed)) {
uint32_t t_ms;
uint8_t src; /* 모듈 ID */
uint8_t evt; /* 이벤트 코드 */
int16_t a, b; /* 값 2개 */
} log_rec_t; /* 10 byte */
#define LOG(src, evt, a, b) log_push((src), (evt), (a), (b))
Anti-pinch 시험에서는 1 ms 주기 전류·속도·위치를 전부 남겨야 한다. 그래야 임계값을 사후에 다시 계산할 수 있다. 판정 결과만 남기면 임계값을 바꿀 때마다 시험을 다시 해야 한다.
5. 통합 시 자주 나오는 문제
미리 알고 있으면 디버깅 시간이 크게 준다.
| 증상 | 흔한 원인 | 확인 방법 |
|---|---|---|
| 값이 항상 stale로 표시 | max_age < 생산 주기 × 2 | 10편 §7 검산 스크립트 |
| E2E가 간헐적으로 실패 | seq 순환(255→0) 처리 누락 | delta 계산이 부호 없는 뺄셈인지 |
| heartbeat는 정상인데 값이 안 변함 | 송신 태스크만 hang | alive_counter 확인 |
| 경고음이 늦게 남 | pinch_event ID가 너무 높음 | CAN ID 배정 확인 (10편 §4-1) |
| 창문이 저절로 조금 움직임 | 유령 명령 — seq/age 검사 누락 | 10편 §5의 4중 검사 |
| Ambient가 깜빡임 | 조도 히스테리시스 없음 또는 실내 배치 | 06편 체크포인트 5 |
| Fan이 LOW↔MED 반복 | 온도차 히스테리시스 없음 | 05편 §1-2 |
| 도어 잠금 차임이 실패 시에도 남 | 폐루프 확인 없이 명령 즉시 차임 | 04편 §6-1 |
| 오류 하나에 전 기능 정지 | 전역 system_ok 플래그 | 09편 §4 — 구조적 위반 |
| 복구 후 예전 동작이 되살아남 | 상태 저장·복원 코드 존재 | 06편 §5-4 — 자료구조로 막기 |
아래 3개는 코드 리뷰에서 잡아야 하는 구조적 위반이고, 나머지는 통합 시험에서 드러난다.
6. 진행 상황 추적 — docs/tbd_status.md
TBD 32건을 이런 형태로 관리하면 §9의 변경 영향 분석이 실제로 돌아간다.
| ID | 상태 | 확정값 | 확정일 | 근거 | 영향받는 절 | 재시험 필요 |
|----|------|--------|--------|------|-------------|-------------|
| TBD-002 | 확정 | Classic CAN 500 kbps | 2026-09-05 | 부하 2.8 % 계산 | §전체 통신 | — |
| TBD-001 | 확정 | CAN (TBD-002 Classic 확정에 따름) | 2026-09-05 | 프로토콜 통일 | §6.5 | — |
| TBD-009 | 진행 | — | — | 벤치 실험 M1 | §6.2.2, §6.2.4 | §6.2 전체 |
| TBD-034 | 대기 | — | — | 정책 회의 필요 | §6.3.5, §6.4.3 | Ambient 우선순위 |
"재시험 필요" 열이 §9 마지막 원칙의 실행이다. 값이 바뀌면 어떤 시험을 다시 해야 하는지가 표에 적혀 있어야, 나중에 "이거 다시 봐야 하나?"로 시간을 쓰지 않는다.
7. 한 줄 요약
| 항목 | 한 줄 |
|---|---|
| 순서 원칙 | TBD 차단 · 의존 방향 · 위험 선행. 모르는 것을 먼저 친다 |
| M0 | 통신 4건 확정 + signals.yaml + common/ 골격. 회의 한 번이 가장 값싸고 파급이 크다 |
| M1 | 기능 구현이 아니라 미지수를 숫자로. TBD-009 전류 프로파일 실험이 핵심 |
| M2 | 노드별 단독. Power Window는 CAN 뽑고 시험 — §6.2.5를 여기서 이미 검증 |
| M3 | 쌍으로 통합. Central↔Power Window를 먼저 (타이밍이 가장 빡빡) |
| M4 | 전체 통합에서만 보이는 것 — 버스 부하, 우선순위 경합, max_age 실측 |
| 검증 | "~하지 않아야 한다"가 많으므로 오류 주입이 시험의 절반 |
| 추적 | 절-순번 참조(§6.2.4-2) + tbd_status.md의 "재시험 필요" 열 |
설계 판단 체크포인트
구현에 들어가기 전에 팀이 답을 갖고 있어야 하는 것들이다. 답이 안 나오면 그 자리가 곧 설계 문의 또는 TBD 후보다.
-
M1(벤치 실험)에 2주를 쓰는 게 아깝지 않은가? TBD-009 없이 Anti-pinch를 짜면 임계값을 상수로 박고 나중에 전부 다시 튜닝해야 한다. 그리고 감지 방식(전류만 / 전류+속도 / 로드셀)에 따라
safety.c구조와 필요한 센서가 바뀐다 — 구현을 먼저 하면 그 구조를 버리게 된다. 실험은 재작업 보험이다. -
M2에서 노드별 단독 동작을 강제하면 통합이 늦어지지 않나? 늦어 보이지만 총 시간은 준다. 6개 노드를 한꺼번에 붙이면 문제가 났을 때 원인 후보가 6개다. 단독 동작이 검증된 노드끼리 붙이면 원인이 "둘 사이"로 좁혀진다. 그리고 Power Window의 단독 동작 시험은 그 자체가 §6.2.5 검증이라 버리는 시간이 아니다.
-
오류 주입 훅을 넣으면 양산 코드가 더러워지지 않나?
#ifdef VCS_FAULT_INJECTION으로 감싸면 양산 빌드에는 한 줄도 안 들어간다. 대안은 물리적으로 센서를 뽑는 것인데, "송신 태스크만 hang" 같은 고장은 물리적으로 만들 수 없다. §6.6·§6.4.4의 격리 요구사항을 검증하려면 주입이 필요하다. -
정책 TBD 4건(010·019·034·036)의 결정 주체는 누구인가? 이게 정해져 있지 않으면 회의를 열어도 결론이 안 난다. 특히 TBD-010(닫힘 정책)은 안전과 법규가 걸려 있어 한 사람이 책임지고 결정 기록을 남겨야 한다. 08편 §3-2에서 지적한 "기술 TBD와 섞으면 안 닫힌다"의 실질적 해법은 결정 주체와 기한을 붙이는 것이다.
-
시험 항목을 SR 문장 단위로 만들면 항목 수가 200개를 넘는다. 전부 해야 하나? §9의 "하나의 요구사항 = 하나의 검증 가능한 동작"을 따르면 원칙적으로 그렇다. 현실적으로는 3-2절의 안전 요구사항 13개를 필수로 두고, 나머지는 시나리오 시험으로 묶어 커버리지를 확보하는 게 합리적이다. 다만 어느 요구사항이 어느 시나리오로 커버되는지는 표에 남겨야 한다 — 안 그러면 빠진 게 있어도 모른다.
-
log_rec_t를 10바이트로 잡았는데 1 ms 로깅이면 초당 10 KB다. 어디에 남기나? S32K144 내부 RAM(수십 KB)으로는 수 초밖에 못 담는다. Anti-pinch 시험은 한 번이 수 초이므로 RAM 순환 버퍼 + 시험 종료 후 UART 덤프로 충분하다. 장시간 로깅이 필요하면 외부 플래시나 CAN 실시간 스트림이 필요한데, 후자는 버스 부하를 크게 올리므로 시험 전용 모드로만 켜야 한다.