← 목록
기타 2026-08-01 7KB 읽기 7분

crowny-terminal6561 — 조회 API 2종(GET /api/sessions·/api/capacity) 신설 + 2a 앱 셸 라이브 배선

개요

21화면 중 라이브가 1a·1e-1 둘뿐이던 crowny-terminald(:9830)에 세션 목록·계통 가동 현황 조회 API 2종을 신설하고, 2a(앱 셸 · 네이티브 · 세션탭바/세션레일/계통바) 화면을 실배선했다.

무엇을 했는지

1. GET /api/sessions?limit=&offset=

  • 원천: 데이터/세션.psv(append-only, id|title|space).
  • 데이터/세션.psv를 배열로 통째 로드하지 않는다(1023 상한·계속 자라는 원장) —
wc -l로 총줄수만 얻고 head|tail|tac로 "요청한 페이지 창"만 잘라 임시파일로 만든 뒤 버퍼(BUF_) 찾아서-자르기 패턴으로 파싱(정본: 감사.한선 감사재생행()).
  • 최신순(뒤에서부터) + 페이지네이션(offset/limit, 기본 20).
  • status: live(이 데몬 프로세스 메모리 _세션DB에 있음, 신규 기계어_세션메모리있나())
/ idle(원장에만 존재). done/paused 세부 상태는 이분법 밖이라 노출 안 함(날조 금지).

2. GET /api/capacity

  • 9기수 전부(일기~육천오백육십일기) + 정원(계통_정원 재사용) + 가동
(계통_가동조회("전역", 기수) 재사용 — 계통증설요청/승인이 이미 쓰는 전역 집계 관례). 계통.한선은 건드리지 않았다(오케스트레이션 로직과 UI 표시 라벨 분리 — 이름 매핑은 터미널데몬.한선의 _기수한글이름 배열).

3. 2a.라이브.html + 2a.라이브.한선

  • 2a.html 마크업/스타일 그대로 복사 + <script>만 추가(1a.라이브 관례).
  • 살린 것: 세션 탭바(①, 탭클릭=선택·"+"=POST /api/session)·세션 레일(②)·계통 바(③, 메뉴바
"가동 N"/터미널헤더/9기수 칩)·상태바(④, 엔진 점 색=/api/health·예산=/api/budget)· 전체화면 데몬끊김 오버레이(⑥)·?자동= 헤드리스 훅(⑦).
  • 정적 유지: 브라우저 뷰 도크(⑤, A7 데몬 라우트 미구현 — 주석 표시), 터미널 로그/입력바
데모 문구(배선 범위 밖).
  • 동반 2a.라이브.한선: 탭/레일 활성 판정·status(live/idle) 배지 문구·예산 문구·계통칩 조각·
낙관적 병합 판정 순수 함수 + 셀프테스트.

실측 함정 2건 발견·수리 (이번 작업 중)

  1. 함수 호출을 문자열 연결식에 인라인하면 응답 맨앞에 유령 문자가 섞임
"{" + 데몬_세션목록JSON(...) + "}"처럼 버퍼(BUF_
)를 쓰는 함수를 인라인 호출하면 TCP로 나가는 실응답 맨앞에 원인불명 문자가 붙는 실측 함정(self-test 직접호출·curl 양쪽 다 재현). 기존 감사재생행() 호출부처럼 반드시 변수에 먼저 담고 나서 문자열 연결해야 안전 — 수리 후 재현 0건. crownycode-learn에 등록.
  1. POST(세션생성) 직후 곧바로 GET(목록조회)이 레이스 — 데몬 내부에서 append(덧쓰기)가
끝난 뒤에도 곧바로 이어지는 GET 핸들러의 외부 wc -l/head/tail 서브프로세스가 그 시점 파일뷰를 못 잡는 경우가 실측됐다(헤드리스 캡처로 재현, 단순 curl 순차호출로는 거의 안 잡힘 — 진짜 동시성 타이밍 이슈). 처방: 클라이언트(2a.라이브.html)가 POST 응답을 그대로 들고 있다가, GET 목록에서 못 찾으면 그 자리에서 합성해 목록 맨앞에 끼워넣는다 (세션목록적용()의 낙관적 병합 — 값은 서버가 방금 준 진짜 응답이라 날조 아님). 라이브2a_합성진입여부()로 판정 로직을 순수함수화 + 셀프테스트 4건.

검증 결과

  • STRICT 컴파일 전부 0경고(계통·감사·기계어·파싱·터미널데몬·1a라이브·2a라이브).
  • 셀프테스트(같은 CT_DATA_DIR로 3회 연속 동일, 0 회귀):
계통 12(불변) · 감사 15(불변) · 기계어 23(21+2, 세션메모리조회) · 파싱 13(불변) · 터미널데몬 42(30+12, sessions 6건+capacity 4건+2a-live 화이트리스트 2건) · 1a라이브 19(불변) · 2a라이브 23(신규).
  • curl 실측: /api/sessions?limit=5 5건+total(432+)+최신순 확인, offset=5&limit=5 다른 5건,
/api/capacity 9기수 전부 + total_cap:6561(정원 합 1+3+9+27+81+243+729+2187+6561=6561 검산 일치), /ui/2a-live 200 + 파일 크기 일치.
  • 메모리 부하(격리 데몬, 별도 포트 9831+CT_DATA_DIR — 터미널데몬.한선의 포트/데이터경로
상수는 CT_DATA_DIR로 안 움직여 sed로 임시 격리본 만들어 테스트, 종료 후 삭제): 1800회 누적 요청(sessions 900 + capacity 900) 후 RSS 델타 2.28KB/req(개별 300회 구간은 8.5~22.5KB로 변동했으나 1800회 누적 평균은 안정 — GC/rewind가 정상 작동, 50KB 기준 통과).
  • 실제 렌더: 크라우니AI검증.sh shot + dump(단일 네비게이션, 더 신뢰도 높음) 둘 다 확인.
dom.html 직접 grep으로 메뉴바가동="가동 146", 헤더세션ID·계통칩(9기수 전부)·상태바비용 ("이 세션 0.00 CRW · 오늘 0.00 CRW", 로딩 문구 아님)·세션레일 활성 항목 전부 실제 API 값과 1:1 일치 확인. PNG 캡처 자체는 1680px 캔버스 중 일부(대략 x=280~1524)만 보이는 기존 크라우니AI검증.sh 뷰포트 한계로 좌측(메뉴바 일부·첫 탭)이 잘려 보이는 경우가 있었음(도구 쪽 특성, 앱 코드 결함 아님 — dom.html 전수 대조로 확인). 데몬 강제 종료 → file:// 직접 캡처로 "데몬 연결 끊김" 오버레이 정상 표시 확인 → 데몬 재기동 후 health 200 정상.
  • 디자인이식.sh diff: 판정=옴, 신규색=0, 원본훼손=0(유실색 162는 다른 미포팅 화면 몫).

관련 파일

  • /Users/ef/crowny-terminal6561/한선씨/터미널데몬.한선데몬_세션목록JSON()·
데몬_계통JSON()·GET /api/sessions·GET /api/capacity 라우트·화이트리스트 2a-live 추가.
  • /Users/ef/crowny-terminal6561/한선씨/기계어.한선기계어_세션메모리있나() 추가.
  • /Users/ef/crowny-terminal6561/화면/2a.라이브.html — 신규.
  • /Users/ef/crowny-terminal6561/한선씨/2a.라이브.한선 — 신규(동반 판정 로직 + 셀프테스트).
  • /Users/ef/crowny-terminal6561/설계/데몬API계약.md — 이번 라운드 반영 전(다음 세션이
§3에 GET /api/sessions·/api/capacity 추가해도 됨, 이 문서가 1차 근거).

잔여 이슈

  • 브라우저 뷰 도크(A7) 데몬 라우트 미구현 — 2a는 여전히 정적.
  • /api/session POST가 쓰는 _세션인덱스경로는 여전히 CT_DATA_DIR 격리를 안 받는
하드코딩 경로(A9, 배선갭목록.md 기존 기록) — 부하테스트 때마다 sed로 임시 격리본을 만들어 우회. 근본 해결은 그 상수도 환경변수("CT_DATA_DIR") 참조로 바꾸는 것(다음 세션 몫).
  • 세션탭/레일은 최근 4~5건만 노출(폭 제약) — 나머지는 "전체 N개 보기" 텍스트만, 클릭 인터랙션 없음.
  • 정적으로 남은 21화면 중 잔여: 1b·1c·1d·1e-2·1e-3·1f·2b(둘 다)·2c·2d·2e·2f·2g·2h·2i·2j(셋 다).