law.crowny.org 헌법 거버넌스 다수 4상 투표 UI
개요
law.crowny.org(포트 9784)에 "기준 상향을 다수가 보고 4상균형3진으로 의사결정"하는
공개 투표 화면을 신규 추가했다. 기존 라이브 라우트(
/,
/api/health,
/api/questions,
/api/answer,
/api/evaluate,
/헌법6561)는 무접촉으로 보존하고, 신규 라우트만 추가했다.
무엇을 했는지
1. server.js (신규 라우트만 추가, 기존 로직 무접촉)
GET /거버넌스 (별칭 /governance) — 투표 페이지 HTML 서빙
GET /api/gov/questions — 질문큐.psv에서 상태=열림 질문 목록 JSON
GET /api/gov/tally?id=Q — 응답DB.psv 집계 + 판정 JSON
POST /api/gov/vote — 응답DB.psv에 append(같은 질문id+응답자 중복은 최신 대체), 의결.psv에
감사로그 append. 질문id 존재·상 화이트리스트(티/옴/타/음) 입력검증.
- 판정 로직은
/Users/ef/CrownyOS/crownyc/libs/헌법거버넌스.한선의 의결판정 알고리즘을
JS로 1:1 이식(순서·조건 동일): 총<최소응답→옴 / 음>티&음>타→음 / 티≥정족수&티>타→티(승격) /
타≥정족수&타>티→타(폐기) / else→옴.
2. public/거버넌스.html (신규)
- crowny.org 토큰(라이트
--bg:#FAF9F7 등 / 다크 --bg:#0A0908 등) self-contained, 외부 CDN 없음.
- 열린 질문 카드: 유형·질문문·맥락 + 근거 입력 + 4상 투표 버튼(티 승격/옴 연구/타 폐기/음 이관) +
실시간 집계 스택바(티/옴/타/음 개수, 정족수 진행률, 현재 판정 pill). 8초 폴링으로 다수 투표자
동시 반영.
- 4상 색: 티=gold, 옴=text2, 타=coral, 음=gold-dim(빗금 텍스처로 옴과 구분 — dataviz 스킬
validate_palette.js 검사 결과 브랜드 고정 팔레트가 categorical CVD 기준을 충족 못해
텍스처+라벨 이중 인코딩으로 보완).
- 정직 고지 문구: "이 의결은 자문·거버넌스 기록이며 실제 배선은 프로브→배선→회귀로 별도 반영".
3. 법시스템서버.한선 (한선씨 동반, 신규 함수 다수 추가)
가져오기 "헌법거버넌스.한선"로 정본 의결판정/표집계/진행률 재사용(로직 중복 없음).
- 게버넌스PSV 읽기(
게버넌스본문줄목록, 게버넌스칸), 응답자 중복 최신대체 집계
(
게버넌스최신응답줄, 배열 인덱스 대입 금지 함정 회피용
게버넌스배열인덱스),
탈리 JSON 직렬화, 투표/의결 append 함수,
현재시각ISO()(체계+date 위임, 에포크 수동산술 금지
함정 회피) 추가. 라우터에 7/8/9번 경로 등록 + 요청루프에 쿼리스트링 파싱 추가.
- 부수 수정(사전 존재하던 버그, compile 검증 중 발견): 이 파일은 이전에 한 번도
컴파일에 성공한 적이 없었다(①예약어
메서드 bare 변수명 사용 ②
라우터.한선이 실제
export하는 함수명은
라우트추가/
라우트찾기인데
경로추가/
경로매칭으로 오기).
게버넌스 섹션 컴파일 검증을 위해
메서드→
요청방식,
경로추가→
라우트추가,
경로매칭→
라우트찾기로 전체 치환.
./hanseonc_high 컴파일 성공(EXIT 0, 776KB toau)
확인 완료.
검증 결과
node -c server.js → OK
launchctl kickstart -k org.crowny.law → 재기동 완료
GET / → 200 (보존)
GET /헌법6561 → 200 (보존)
GET /api/questions → 200 (보존)
GET /api/rules → 200 (보존)
POST /api/evaluate → 200 (보존)
GET /거버넌스 → 200, "거버넌스" 텍스트 포함
GET /api/gov/questions → {"questions":[{"질문id":"G1",...,"상태":"열림"}]}
GET /api/gov/tally?id=G1 → {"ti":0,"om":2,"ta":2,"um":0,"total":4,"quorum":3,
"minresp":3,"verdict":"옴","progress":67,
"quorumMet":true,"voters":4} ← 판정=옴 기대값 일치
POST /api/gov/vote (테스터/티) → 성공, 응답DB.psv·의결.psv에 기록 확인 후 원복(마지막 줄 제거)
음성 테스트: 알수없는 질문id/잘못된 상/빈 응답자 → 전부 400 에러 정상 반환
공개: https://law.crowny.org/거버넌스, /api/gov/questions, /헌법6561 → 전부 200
관련 파일
/Users/ef/crowny-law/server.js (수정, 신규 라우트만 추가)
/Users/ef/crowny-law/public/거버넌스.html (신규)
/Users/ef/crowny-law/법시스템서버.한선 (수정, 한선씨 동반 + 사전 버그 수정)
- 데이터(읽기전용 대상, crownyc 소유— 수정 안 함):
/Users/ef/CrownyOS/crownyc/data/헌법6561/거버넌스/*.psv
- 참조 정본:
/Users/ef/CrownyOS/crownyc/libs/헌법거버넌스.한선
크라우니코드
lookup MISS 1건(신규 로직) / learn 추가 1건(게버넌스탈리계산)
잔여 이슈
거버넌스.html의 클라이언트 JS는 서버와 동일한 표시 로직이라 별도 .한선 미동반(로직 정본은
서버 쪽
법시스템서버.한선/server.js에 있음).
법시스템서버.한선은 실제 라이브 서비스가 아니라 참조/동반 구현(포트 9780, 실제 서비스는
Node server.js 포트 9784)이라 이번에도 기동은 하지 않음 — 컴파일 성공까지만 검증.
- 다중 관리자 동시 투표 시 폴링 8초 지연 — 필요 시 SSE/웹소켓으로 실시간화 가능(현재는 범위 밖).