← 목록
기타 2026-07-24 4KB 읽기 4분

크라우니캔버스 공용.js — blockRef 회귀 수리 + 디자인(hex) 감사

개요

서버(한선씨/서버.한선) 보안수리로 POST /api/커맨드blockRef(대상 페이지id) 필수·없으면 400 default-deny로 바뀌었다. 프론트 공용.js CC.커맨드()는 여전히 {커넥터,커맨드,파라미터}만 보내 전 호출부(today.js/approval.js/moments.js/editor.js/bar.html)가 400을 맞는 회귀가 발생 — 공용.js 소유 범위에서 수리.

무엇을 했는지

P0 — blockRef 폴백 (앱/공용.js)

CC.커맨드(커넥터, 커맨드명, 파라미터, opts) 시그니처는 불변. 내부에 _blockRef유도() 추가, 우선순위:
  1. opts.blockRef (명시)
  2. 파라미터.blockRef (명시)
  3. CC.스토어.현재페이지id (향후 라우터가 채울 수 있는 전역 상태)
  4. location.hash#/page/<id> 또는 #/editor/<id> 세그먼트 파싱
넷 다 없으면 빈 문자열 그대로 전송 — 서버가 그대로 400 처리(임의값 날조 금지, 서버 default-deny 정책 존중). POST 본문에 blockRef 필드 추가: {커넥터, 커맨드, 파라미터, blockRef}. 낙관/성공/실패 배너 로직 불변.

라이브 검증(:9620, 서버 재기동 불요 — 정적 파일):

curl -s http://127.0.0.1:9620/공용.js | grep blockRef   # 배포본에 반영 확인
POST blockRef 없이   → HTTP 400 {"오류":"blockRef 필수..."}
POST blockRef=seed_today → HTTP 200 {"성공":true,...}

P1 — 디자인(hex 하드코딩) 감사

grep -oE '#[0-9A-Fa-f]{3,8}' 앱/공용.js0건 (감사 시점 이미 전부 var(--토큰) 사용, 조치 불필요). 잔여 hex는 화면/today.js·approval.js·editor.js·moments.js에 있으나 그 파일들은 이 세션 소유범위 밖(각 담당 에이전트 몫).

동반 한선씨 (한선씨/공용컴포넌트.한선)

blockRef유도(옵션blockRef, 파라미터blockRef, 스토어현재페이지id, 해시) 순수함수 파리티 추가(DOM/location 없이 동일 우선순위 로직). 셀프테스트 6건 추가 — 총 17/17 PASS(환경변수("공용컴포넌트_셀프테스트")=="1"로 게이트). crownycode-learn.sh add로 학습 등록.

관련 파일

  • /Users/ef/crowny-canvas/앱/공용.js (수정)
  • /Users/ef/crowny-canvas/한선씨/공용컴포넌트.한선 (수정, 동반 파리티+셀프테스트)
  • /Users/ef/crowny-canvas/한선씨/서버.한선 (참조만, 미수정 — blockRef 필수화는 타 세션 선행 수리)
  • /Users/ef/crowny-canvas/docs/07-앱-계약.md (계약 참조)

잔여 이슈

  • today/approval/bar/moments 호출부는 대부분 "특정 페이지"에 묶이지 않는 전역 액션(IoT 씬 실행, 결재 등)이라 location.hash#/today처럼 비-page 라우트일 때 폴백이 빈 문자열 → 서버 400 가능성 잔존. 근본 해결은 각 화면 모듈이 opts.blockRef를 명시하거나 라우터가 CC.스토어.현재페이지id를 채우는 것(공용.js 소유범위 밖, 화면 모듈/라우터 담당 세션 이관 필요).
  • 화면/*.js의 hex 하드코딩 잔존(today.js #FFF, approval.js #F0E8D4/#FFF, editor.js #fff/#D5C8A8, moments.js #FFF/#039) — 각 파일 소유 세션이 tokens.css var()로 이설 필요.
  • VM 함정 재확인(오탐 아님 주의): 같은 소스를 /tmp/의 공용 파일명으로 컴파일→실행하면 18+ 동시세션의 /tmp 경합으로 .toau가 손상되어 무한루프(스택 넘침)처럼 보이는 거짓 재현이 나타남(분리()/찾기뒤() 자체는 정상). 세션별 스크래치패드 경로로 컴파일해야 재현 안 됨 — 기존 메모리(feedback_동시세션_공유파일_절단_dist미러복원)와 동일 계열, 이번엔 "컴파일 산출물 .toau" 버전으로 재확인.