크라우니캔버스 공용.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유도() 추가, 우선순위:
opts.blockRef(명시)파라미터.blockRef(명시)CC.스토어.현재페이지id(향후 라우터가 채울 수 있는 전역 상태)location.hash의#/page/<id>또는#/editor/<id>세그먼트 파싱
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}' 앱/공용.js → 0건 (감사 시점 이미 전부 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" 버전으로 재확인.