크라우니캔버스 모먼트(moments.js) 고아 컴포넌트 수리
개요
크라우니캔버스(canvas.crowny.org:9620) D5 모듈앱/화면/moments.js의 CC.모먼트.보상팝업() /
CC.모먼트.퇴근확인()이 정의만 되고 앱 어디서도 호출되지 않는 고아 컴포넌트였던 확증 결함(P2)을
근본 수리. 겸해 퇴근확인 다이얼로그의 실행작업 목록이 항목당 골드 솔리드 점을 반복 렌더해
"화면당 골드 솔리드 ≤2"(04-디자인-스펙) 규칙을 초과하던 구조도 함께 수리.파일 소유권 제약(이 결함의 담당 범위 = 앱/화면/moments.js + 동반 한선씨/모먼트.한선만)에
따라 index.html/today.js/editor.js 등 다른 소유 파일은 전혀 건드리지 않고, moments.js 자신이
실행 중인 DOM에 실제 트리거를 자가 배선(self-mount)하는 방식으로 해결.
무엇을 했는지
- 골드 솔리드 초과 수리 — 퇴근확인 다이얼로그의 실행작업 목록 점(
background:var(--골드)
border:1.5px solid var(--골드);background:transparent)
으로 교체. 다이얼로그당 솔리드는 완료 체크마크 1개(+확정 버튼 1개, 별도 토큰 --골드버튼)로
고정 — 실행작업 개수와 무관해짐. 실측: 실행작업 3개 기준 솔리드 4개 → 1개로 감소.- 1e 퇴근확인 실제 트리거 — moments.js가 로드 즉시
#cc-topbar .cc-right(모든 폼팩터
#cc-dayclose-btn)을 자가 마운트. 클릭 → 브리핑 API에서
완료 작업 참고 조회 → CC.모먼트.퇴근확인({...}) 오픈 → 확인 시 실제 `CC.커맨드('space',
'day.close', {}, {...})` 실행(계약 §3 화이트리스트 커맨드, 감사.psv 기록 경유).- 1d 보상팝업 실제 트리거 — 06-화면-설계-구체화 "트리거 = wiki.published 이벤트 settled"를
CC.커맨드를 감싸 커맨드명 === 'wiki.publish'가 성공 settle되면 원장
(GET /api/원장?사용자=)에서 실측 적립액을 읽어 CC.모먼트.보상팝업(...)을 연다(서버.한선의
실제 100 CRD "위키발행보상" 이벤트와 파리티, 하드코딩 스텁 아님).- 한선씨 파리티 —
한선씨/모먼트.한선에퇴근확인_골드솔리드개수·퇴근확인_화면솔리드총합·
위키발행보상_액수결정·퇴근트리거_실행작업개수 4개 함수 + 자체시험(MOMENTS_SELFTEST=1)
추가. STRICT 재컴파일 0경고, 자체시험 6/6 PASS.실측 검증 (라이브 :9620, Chrome MCP)
- 정적 감사:
grep -rn "모먼트\.\(퇴근확인\|보상팝업\)(" 앱/→ moments.js 자체 내 실제
- 서빙본(curl) = 로컬 소스 diff identical.
- 🌙 버튼 실클릭 → 퇴근확인 다이얼로그 오픈 → 골드 솔리드 실측 1개(수리 전 4개) → "퇴근하기"
POST /api/커맨드(day.close) 발생 확인(네트워크 로그).
CC.커맨드('wiki','wiki.publish',{제목,blockRef},...)실호출(실 서버 200 성공) → 100~150ms
CC.모먼트.보상팝업 자동 오픈, 실측 원장 적립액(+100 CRD) 그대로 렌더 확인(스크린샷).
- 보상팝업 다이얼로그 골드 솔리드 실측 0개(다이아몬드=그라데, 확인버튼=
--골드버튼별개 토큰).
관련 파일
/Users/ef/crowny-canvas/앱/화면/moments.js(수리 본체)/Users/ef/crowny-canvas/한선씨/모먼트.한선(파리티 함수 + 자체시험)- (읽기 전용 참조, 무수정)
/Users/ef/crowny-canvas/앱/index.html,한선씨/서버.한선,
한선씨/원장.한선, 한선씨/커넥터.한선잔여 이슈 (별도 파일 소유권 — 이번 수리 범위 밖, 보고만)
- CC.커맨드(공용.js)가 blockRef를 최상위로 전송하지 않음 — 서버.한선
_처리커맨드는
CC.커맨드는 {커넥터,커맨드,파라미터}
만 보냄. 결과: 파라미터 안에 우연히 "blockRef" 키를 넣지 않는 한 기존 모든 CC.커맨드
호출(today.js의 iot.entity.set/iot.scene.run, approval.js의 erp.approve/reject, 이번에
추가한 day.close 포함)이 예외 없이 400(blockRef 필수)을 받는다(실측). moments.js 소유
범위 밖이라 이번 수리에선 그대로 두되, CC.커맨드 자체를 감싼 내 wiki.publish 리스너는
구조상 정상 작동(성공 settle시에만 발화) — 위 사실은 F6/F12 트랙 담당에게 별도 보고 필요.