(() => { "use strict"; window.AKASHI_WIKI_CATEGORIES = [ { id: "all", label: "전체" }, { id: "overview", label: "개요" }, { id: "usage", label: "사용법" }, { id: "prompt", label: "프롬프트" }, { id: "data", label: "데이터" }, { id: "model", label: "모델" }, { id: "eval", label: "평가" }, { id: "ops", label: "운영" }, { id: "change", label: "변경 기록" } ]; window.AKASHI_WIKI_DOCS = [ { id: "home", category: "overview", title: "아카시 LLM 위키 홈", summary: "아카시 LLM의 목표, 구조, 운영 지식을 한곳에 모으는 기술 위키의 시작점입니다.", owner: "Core", updated: "2026.08.25", status: "MVP", tags: ["overview", "architecture", "roadmap"], blocks: [ { type: "metrics", items: [ { label: "초기 문서", value: "20", text: "아카시 LLM과 MediaMak 운영 자산" }, { label: "핵심 축", value: "6", text: "프롬프트, 데이터, 모델, 평가, 운영, 변경" }, { label: "운영 기준", value: "1", text: "문서와 증거를 같은 흐름으로 관리" } ]}, { type: "section", title: "위키의 역할", body: [ "아카시 LLM 위키는 모델을 설명하는 소개 페이지가 아니라, 실제 개발과 운영에서 반복해서 확인해야 하는 판단 기준을 모으는 작업 공간입니다.", "모든 문서는 적용 범위, 예제, 주의사항, 관련 문서를 함께 남기는 방식으로 관리합니다. 그래야 프롬프트나 모델 변경이 생겨도 무엇이 바뀌었는지 추적할 수 있습니다." ]}, { type: "flow", items: [ { label: "01", title: "요구", text: "사용 시나리오와 실패 비용 정의" }, { label: "02", title: "지식", text: "문서, 데이터, 정책 기준 정리" }, { label: "03", title: "추론", text: "모델, RAG, 프롬프트 실행" }, { label: "04", title: "평가", text: "정량/정성 기준으로 회귀 확인" }, { label: "05", title: "운영", text: "로그, 비용, 장애, 릴리즈 관리" } ]}, { type: "callout", title: "MVP 원칙", text: "처음부터 거대한 문서 시스템을 만들지 않습니다. 먼저 문서 10~15개와 검색 가능한 정적 위키를 만들고, 이후 문서 분리와 자동화를 붙입니다." } ] }, { id: "glossary", category: "overview", title: "용어집", summary: "아카시 LLM 문서에서 반복되는 핵심 용어와 사용 기준입니다.", owner: "Core", updated: "2026.08.25", status: "Draft", tags: ["overview", "terms"], blocks: [ { type: "section", title: "핵심 용어", body: ["문서마다 같은 단어를 다르게 쓰면 평가와 운영 기준이 흔들립니다. 아래 용어를 기본 표준으로 사용합니다."] }, { type: "matrix", rows: [ ["용어", "의미", "문서화 기준"], ["System Prompt", "모델의 역할, 금지 조건, 출력 형식을 고정하는 최상위 지시", "버전과 변경 사유를 반드시 남깁니다."], ["RAG", "외부 지식 검색 결과를 프롬프트에 주입하는 방식", "검색 대상, 청킹, 인용 정책을 함께 기록합니다."], ["Evaluation Set", "모델 변경 전후를 비교하기 위한 고정 질문/정답 묶음", "정답, 허용 답변, 실패 유형을 구분합니다."], ["Guardrail", "출력 금지, 개인정보 보호, 고위험 응답 제한 정책", "규칙과 예외 승인 절차를 같이 둡니다."] ]} ] }, { id: "quick-start", category: "usage", title: "빠른 시작", summary: "처음 사용하는 사람이 아카시 LLM을 실행하고 기본 요청을 보내는 최소 절차입니다.", owner: "Platform", updated: "2026.08.25", status: "Draft", tags: ["usage", "api", "setup"], blocks: [ { type: "section", title: "준비", body: ["환경 변수, 모델 엔드포인트, 인증 토큰, 로그 저장 위치를 먼저 확인합니다. 실제 값은 위키에 직접 적지 않고 비밀 관리 위치만 연결합니다."] }, { type: "checklist", items: [ "API 키 또는 서비스 계정 권한 확인", "모델 이름과 배포 환경 확인", "기본 시스템 프롬프트 버전 확인", "로그/평가 저장소 쓰기 권한 확인" ]}, { type: "code", language: "bash", text: "# 예시: 실제 엔드포인트와 키는 환경별 문서를 따릅니다\nexport AKASHI_ENV=local\nexport AKASHI_MODEL=akashi-default\nexport AKASHI_PROMPT_VERSION=system-v0.1" }, { type: "callout", title: "민감정보", text: "키, 토큰, 내부 URL, 고객 데이터 샘플은 위키 본문에 직접 넣지 않습니다. 필요하면 비밀 관리 시스템의 경로만 기록합니다." } ] }, { id: "api-examples", category: "usage", title: "API 호출 예제", summary: "서비스 계층에서 아카시 LLM을 호출할 때 사용하는 요청/응답 형식 초안입니다.", owner: "Platform", updated: "2026.08.25", status: "Draft", tags: ["usage", "api", "integration"], blocks: [ { type: "section", title: "요청 구조", body: ["호출자는 사용자 입력, 작업 유형, 참조 문서, 출력 형식을 명시합니다. 모델이 추측하지 않도록 비어 있는 필드는 null로 보냅니다."] }, { type: "code", language: "json", text: "{\n \"task\": \"knowledge_answer\",\n \"input\": \"정책 변경 영향 요약해줘\",\n \"context_ids\": [\"policy-2026-08\"],\n \"output_format\": \"brief\",\n \"trace_id\": \"req_20260825_001\"\n}" }, { type: "section", title: "응답 구조", body: ["답변, 사용한 근거, 신뢰도, 후속 확인 필요 항목을 분리합니다. 운영 로그에서는 trace_id를 기준으로 프롬프트와 검색 결과를 연결합니다."] } ] }, { id: "prompt-policy", category: "prompt", title: "시스템 프롬프트 정책", summary: "아카시 LLM의 역할, 금지 조건, 출력 형식을 관리하는 기준입니다.", owner: "Prompt", updated: "2026.08.25", status: "Draft", tags: ["prompt", "policy", "guardrail"], blocks: [ { type: "section", title: "작성 원칙", body: ["시스템 프롬프트는 모델을 똑똑하게 보이게 하는 문장이 아니라, 반복 가능한 행동 경계를 만드는 운영 설정입니다."] }, { type: "checklist", items: [ "역할은 짧고 구체적으로 정의합니다.", "금지 사항은 예외 조건과 함께 씁니다.", "출력 형식은 샘플보다 스키마 우선으로 관리합니다.", "변경 시 평가 세트의 회귀 결과를 함께 기록합니다." ]}, { type: "matrix", rows: [ ["항목", "좋은 기준", "피해야 할 기준"], ["역할", "아카시 LLM은 내부 지식 기반 응답을 생성한다", "친절하고 똑똑한 AI다"], ["근거", "근거가 없으면 확인 필요로 표시한다", "상식적으로 답한다"], ["형식", "요약/근거/제약/다음 행동으로 분리한다", "자유롭게 설명한다"] ]} ] }, { id: "prompt-patterns", category: "prompt", title: "작업별 프롬프트 패턴", summary: "요약, 분류, 추출, 검토, 계획 수립 작업에서 재사용할 프롬프트 구조입니다.", owner: "Prompt", updated: "2026.08.25", status: "Draft", tags: ["prompt", "template"], blocks: [ { type: "section", title: "공통 구조", body: ["작업 프롬프트는 입력, 목표, 제약, 출력 형식, 실패 처리 기준을 명시합니다. 긴 설명보다 누락되면 안 되는 필드를 고정하는 것이 중요합니다."] }, { type: "code", language: "text", text: "작업: {{task}}\n입력: {{input}}\n참조 문서: {{context}}\n제약: 근거 없는 내용은 추정으로 표시\n출력: 요약 / 근거 / 리스크 / 다음 행동" }, { type: "callout", title: "운영 팁", text: "패턴을 추가할 때는 성공 예시만 넣지 말고 실패 예시도 함께 둡니다. 실패 예시는 평가 세트로 바로 재사용할 수 있습니다." } ] }, { id: "data-sources", category: "data", title: "데이터 소스와 보안 기준", summary: "RAG와 평가에 들어가는 문서, 로그, 사용자 데이터의 수집 및 보호 기준입니다.", owner: "Data", updated: "2026.08.25", status: "Draft", tags: ["data", "security", "rag"], blocks: [ { type: "section", title: "데이터 분류", body: ["아카시 LLM에 들어가는 데이터는 공개 문서, 내부 문서, 민감 문서, 사용자 입력, 운영 로그로 나눕니다. 분류가 없으면 검색 인덱스에 넣지 않습니다."] }, { type: "matrix", rows: [ ["분류", "허용 용도", "주의사항"], ["공개 문서", "일반 답변, 온보딩", "출처와 갱신일 확인"], ["내부 문서", "업무 지식 답변", "권한별 검색 범위 필요"], ["민감 문서", "제한된 요약/검토", "원문 노출 금지, 마스킹 우선"], ["운영 로그", "품질 분석, 비용 관리", "개인정보와 입력 원문 보존 기간 관리"] ]}, { type: "callout", title: "기본 차단", text: "개인정보, 비밀키, 계정 정보, 내부 식별자는 임베딩 전에 제거하거나 마스킹합니다." } ] }, { id: "rag-pipeline", category: "model", title: "RAG 파이프라인", summary: "문서 수집부터 검색 결과 주입까지의 표준 흐름입니다.", owner: "Model", updated: "2026.08.25", status: "Draft", tags: ["model", "rag", "embedding"], blocks: [ { type: "flow", items: [ { label: "01", title: "Ingest", text: "문서 원본과 메타데이터 저장" }, { label: "02", title: "Clean", text: "중복, 민감정보, 깨진 문자 제거" }, { label: "03", title: "Chunk", text: "제목과 섹션 기준으로 분할" }, { label: "04", title: "Embed", text: "임베딩 생성과 인덱스 갱신" }, { label: "05", title: "Retrieve", text: "권한, 최신성, 관련도 기준 검색" } ]}, { type: "section", title: "검색 결과 주입", body: ["검색 결과는 모델에게 그대로 던지지 않습니다. 문서 제목, 갱신일, 섹션, 관련 문장, 신뢰도를 함께 전달해야 답변의 근거 추적이 가능합니다."] }, { type: "checklist", items: [ "청크마다 원문 문서 ID를 유지합니다.", "검색 결과에는 권한 필터를 먼저 적용합니다.", "오래된 문서는 최신성 패널티를 둡니다.", "답변에는 사용한 근거 문서를 남깁니다." ]} ] }, { id: "model-routing", category: "model", title: "모델 라우팅 기준", summary: "작업 난이도와 비용에 따라 모델을 선택하는 운영 기준입니다.", owner: "Model", updated: "2026.08.25", status: "Draft", tags: ["model", "routing", "cost"], blocks: [ { type: "section", title: "라우팅 원칙", body: ["모든 요청을 가장 강한 모델로 보내면 비용과 지연 시간이 커집니다. 작업 유형, 컨텍스트 길이, 실패 비용을 기준으로 라우팅합니다."] }, { type: "matrix", rows: [ ["작업", "권장 모델 등급", "판단 기준"], ["짧은 분류", "저비용", "정답 범위가 좁고 형식이 고정됨"], ["문서 요약", "표준", "근거 인용과 누락 방지가 필요함"], ["정책 검토", "고성능", "실패 비용이 높고 모호성이 큼"], ["장기 계획", "고성능", "여러 제약과 단계적 추론 필요"] ]} ] }, { id: "evaluation-playbook", category: "eval", title: "평가 플레이북", summary: "프롬프트, 모델, RAG 변경 전후를 비교하기 위한 평가 절차입니다.", owner: "Eval", updated: "2026.08.25", status: "Draft", tags: ["eval", "benchmark", "quality"], blocks: [ { type: "section", title: "평가 단위", body: ["평가는 단일 점수보다 실패 유형을 남기는 것이 더 중요합니다. 정답성, 근거성, 형식 준수, 안전성, 지연 시간, 비용을 분리합니다."] }, { type: "metrics", items: [ { label: "정답성", value: "A", text: "핵심 사실과 결론 일치" }, { label: "근거성", value: "B", text: "문서 인용과 추론 분리" }, { label: "운영성", value: "C", text: "비용, 지연, 장애율 기준" } ]}, { type: "checklist", items: [ "변경 전 기준 응답을 저장합니다.", "동일한 평가 세트로 변경 후 응답을 생성합니다.", "점수와 실패 유형을 함께 기록합니다.", "승인 기준 미달이면 배포하지 않습니다." ]} ] }, { id: "failure-cases", category: "eval", title: "실패 케이스 기록", summary: "환각, 누락, 과잉 추론, 형식 실패를 재현 가능한 평가 자산으로 바꾸는 방법입니다.", owner: "Eval", updated: "2026.08.25", status: "Draft", tags: ["eval", "failure", "regression"], blocks: [ { type: "section", title: "기록 형식", body: ["실패 케이스는 불만 목록이 아니라 회귀 테스트 자산입니다. 입력, 기대 동작, 실제 응답, 원인 추정, 수정 상태를 남깁니다."] }, { type: "code", language: "json", text: "{\n \"case_id\": \"fail_001\",\n \"input\": \"지난 정책과 새 정책 차이 알려줘\",\n \"expected\": \"근거 문서가 없으면 확인 필요로 표시\",\n \"actual\": \"없는 정책명을 단정함\",\n \"failure_type\": \"hallucination\",\n \"status\": \"open\"\n}" } ] }, { id: "ops-runbook", category: "ops", title: "운영 런북", summary: "장애, 품질 저하, 비용 급증이 발생했을 때 확인할 순서입니다.", owner: "Ops", updated: "2026.08.25", status: "Draft", tags: ["ops", "runbook", "monitoring"], blocks: [ { type: "section", title: "1차 확인", body: ["모델 장애와 데이터 장애는 증상이 비슷합니다. 먼저 요청량, 에러율, 지연 시간, 검색 인덱스 갱신 상태, 프롬프트 버전을 함께 확인합니다."] }, { type: "checklist", items: [ "최근 배포된 프롬프트/모델/인덱스 버전 확인", "에러율과 지연 시간의 시작 시점 확인", "검색 결과가 비어 있거나 오래된 문서인지 확인", "비용 급증 요청의 사용자/작업 유형 확인", "임시 우회 정책과 롤백 여부 결정" ]}, { type: "callout", title: "장애 기록", text: "장애 종료 후에는 원인, 영향 범위, 재발 방지 항목을 변경 기록 문서에 연결합니다." } ] }, { id: "mediamaak-overview", category: "overview", title: "MediaMak 프로젝트 개요", summary: "MediaMak 프로젝트의 정적 사이트, 콘텐츠 자동화, 시장 데이터 수집, 발행 보조 저장소 역할을 정리합니다.", owner: "MediaMak", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "overview", "architecture"], blocks: [ { type: "section", title: "프로젝트 경계", body: [ "MediaMak은 공개 정적 사이트와 비공개 자동화/운영 코드를 분리해 관리하는 구조입니다. 공개 사이트에는 검수 완료 산출물만 두고, 수집·작성·평가·발행 자동화와 운영 로그는 별도 저장소 성격으로 둡니다.", "현재 확인된 주요 축은 content-agent, market-data-collector, pages-publisher, github_pages_deploy_worktree, kis-account-mvp입니다. 민감정보 가능성이 있는 runtime_state, 통화/카톡 전사, 빌드 산출물은 위키 반영 대상에서 제외했습니다." ]}, { type: "matrix", rows: [ ["영역", "역할", "공개 기준"], ["github_pages_deploy_worktree", "정적 HTML, 공개 JSON, 공개 글 산출물", "public 산출물 중심"], ["content-agent", "자료 수집, 한국어 요약, 품질 평가, Pages 발행 자동화", "private 권장"], ["market-data-collector", "Upbit/KIS 등 시장 데이터 수집 러너", "키와 로그 제외"], ["pages-publisher", "공개 가능한 집계 JSON 생성과 Pages 반영", "서비스 계정과 DB 정보 제외"] ]}, { type: "callout", title: "반영 원칙", text: "MediaMak 문서는 운영 구조와 공개 가능한 설계만 반영합니다. 계정, 주문, 토큰, DB 접속, 비공개 전략 파라미터는 위키에 적지 않습니다." } ] }, { id: "mediamaak-content-agent", category: "model", title: "MediaMak Content Agent", summary: "해외 데이터 분석·AI 자료를 수집하고 한국어 요약 글로 변환해 품질 평가 후 발행하는 에이전트 구조입니다.", owner: "Content Agent", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "agent", "llm", "publishing"], blocks: [ { type: "flow", items: [ { label: "01", title: "Collect", text: "RSS/API/공식 블로그에서 후보 자료 수집" }, { label: "02", title: "Rank", text: "중복 제외와 주제 기준으로 후보 압축" }, { label: "03", title: "Write", text: "한국어 요약 초안 생성" }, { label: "04", title: "Evaluate", text: "출처, 중복, 저작권, 환각, 표현 위험 평가" }, { label: "05", title: "Publish", text: "품질 통과 시 Pages 산출물 반영" } ]}, { type: "section", title: "목표", body: [ "하루 1개 이상 데이터 분석, AI, 데이터 엔지니어링 관련 해외 자료를 수집하고, 한국어 독자가 빠르게 이해할 수 있는 짧은 요약 글 초안을 만듭니다.", "초기 운영은 완전 자동 발행이 아니라 PR 기반 검수 흐름입니다. OpenAI 작성 모드는 명시적으로 선택하고, 기본 실행은 비용이 발생하지 않는 템플릿 작성 모드로 설계되어 있습니다." ]}, { type: "checklist", items: [ "원문 전문 번역이나 장문 인용을 저장하지 않습니다.", "원문 링크 없이 단독 주장을 만들지 않습니다.", "투자 조언, 성능 보장, 과장 제목을 품질 평가에서 차단합니다.", "이미 발행한 URL은 seen_urls.json으로 중복 발행을 막습니다." ]} ] }, { id: "mediamaak-publishing-pipeline", category: "ops", title: "MediaMak 발행 파이프라인", summary: "content-agent가 글 초안을 생성한 뒤 GitHub Pages 산출물과 PR로 이어지는 운영 흐름입니다.", owner: "Publishing", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "publishing", "github-pages", "workflow"], blocks: [ { type: "section", title: "기본 흐름", body: [ "매일 스케줄 실행 후 자료 수집, 후보 랭킹, 한국어 글 초안 생성, 품질 평가를 거칩니다. 품질을 통과한 글만 GitHub Pages 변경으로 만들고, 초기 2주 이상은 사람이 PR을 확인한 뒤 merge하는 방식이 권장됩니다." ]}, { type: "matrix", rows: [ ["산출물", "용도", "검증"], ["latest.html", "자동 작성 글 전용 최신 페이지", "본문과 목록 렌더링 확인"], ["posts/*.html", "개별 게시글", "출처 링크와 표현 위험 확인"], ["data/news-posts.json", "목록과 메타데이터", "스키마와 중복 ID 확인"], ["quality report", "발행 승인 근거", "blocking issue 0개 확인"] ]}, { type: "callout", title: "자동 발행 전환 기준", text: "14일 이상 연속 실행 성공, 품질 평가 오탐 낮음, 링크 깨짐 낮음, 사람이 수정한 비율 20% 이하, Pages 배포 실패 없음이 확인된 뒤 자동 merge를 검토합니다." } ] }, { id: "mediamaak-market-data-collector", category: "data", title: "MediaMak Market Data Collector", summary: "자동매매/시장 시스템에서 필요한 공개 가능 범위의 시장 데이터 수집 러너 구조입니다.", owner: "Market Data", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "data", "collector", "market"], blocks: [ { type: "section", title: "역할", body: [ "market-data-collector는 수집기 전용 영역입니다. 백테스트, 실거래 러너, 웹서버, 런타임 로그, DB 덤프, 실제 .env를 포함하지 않는 구조로 설계되어 있습니다.", "활성 수집 대상은 Upbit BTC 가격 비교, Upbit WebSocket 체결 raw rows, KIS KOSPI master symbols, KIS KOSPI200 universe와 daily candles입니다." ]}, { type: "matrix", rows: [ ["Runner", "Job", "Purpose"], ["runner_minutely_10.bat", "btc_price_to_mysql.py", "Upbit BTC/USDT/KRW 10분 가격 비교"], ["runner_upbit_ws_trade_to_mysql.bat", "upbit_ws_trade_to_mysql.py", "Upbit WebSocket raw trade rows"], ["runner_kis_kospi_master.bat", "kis_kospi_master_to_mysql.py", "KIS KOSPI master symbols"], ["runner_kis_kospi200_daily.bat", "kis_kospi200_daily_to_mysql.py", "KIS KOSPI200 universe와 daily candles"] ]}, { type: "checklist", items: [ ".env는 로컬에만 두고 커밋하지 않습니다.", "py_compile과 수동 1회 검증 전에는 스케줄을 전환하지 않습니다.", "기존 운영 task를 중지하거나 의도적으로 대체했는지 확인합니다.", "logs, runtime_state, DB 백업, 실거래/백테스트 러너는 포함하지 않습니다." ]} ] }, { id: "mediamaak-pages-publisher", category: "ops", title: "MediaMak Pages Publisher", summary: "GitHub Pages 정적 사이트에 공개 가능한 집계 JSON과 캐시 버스터를 반영하는 운영 보조 저장소입니다.", owner: "Pages Publisher", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "pages", "publisher", "metrics"], blocks: [ { type: "section", title: "역할", body: [ "pages-publisher는 발행 자동화만 담당합니다. 실거래 러너, 웹서버, 로그, DB 백업, 실제 .env, GA4 서비스 계정 JSON은 포함하지 않습니다.", "공개 가능한 집계 JSON을 생성하고 GitHub Pages 워크트리에 반영한 뒤 커밋/푸시하는 운영 보조 계층입니다." ]}, { type: "matrix", rows: [ ["Runner", "Module", "Output"], ["actual_performance_publish", "publish_actual_performance", "data/actual-performance.json, actual.html cache buster"], ["simulation_performance_publish", "publish_simulation_performance --recalculate", "simulation-performance.json, simulation.html cache buster"], ["visitor_summary_publish", "publish_visitor_summary", "data/visitor-summary.json"], ["post_metrics_publish", "publish_post_metrics", "data/post-metrics.json"] ]}, { type: "checklist", items: [ "서비스 계정 JSON은 저장소 밖에 두고 경로만 환경변수로 지정합니다.", "publish 명령은 --dry-run 또는 --skip-push로 먼저 검증합니다.", "스케줄 등록은 수동 체크가 통과한 뒤 진행합니다." ]} ] }, { id: "mediamaak-metrics-api", category: "eval", title: "MediaMak 조회수·독자 지표 설계", summary: "GitHub Pages 정적 사이트의 조회 이벤트를 별도 API와 DB에서 수집해 콘텐츠 에이전트 개선 신호로 쓰는 설계입니다.", owner: "Metrics", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "metrics", "engagement", "privacy"], blocks: [ { type: "flow", items: [ { label: "01", title: "View", text: "GitHub Pages에서 metrics.js 이벤트 전송" }, { label: "02", title: "API", text: "조회/클릭 이벤트를 별도 Metrics API로 수집" }, { label: "03", title: "DB", text: "일별 조회수, 유니크, 원문 클릭 집계" }, { label: "04", title: "Analyze", text: "engagement_analyzer가 교훈 생성" }, { label: "05", title: "Improve", text: "다음 글 주제와 구조에 반영" } ]}, { type: "section", title: "개인정보 원칙", body: [ "원본 IP와 전체 User-Agent는 장기 저장하지 않습니다. 브라우저 localStorage UUID는 서버에서 HMAC 해시로 처리하고, 공개 API 응답에는 개별 방문자 정보가 포함되지 않도록 설계합니다.", "조회수는 에이전트 개선 신호로 사용할 수 있지만, 클릭 유도형 글을 막기 위해 품질 평가와 함께 사용합니다." ]}, { type: "matrix", rows: [ ["API", "용도", "주의"], ["POST /v1/events/view", "게시글 조회 이벤트 기록", "30분 중복 조회 방지"], ["POST /v1/events/click", "원문 링크 클릭 기록", "source_url 원문 관리 주의"], ["GET /v1/posts/{post_id}/metrics", "상세 페이지 조회수 표시", "본문 로딩과 독립 처리"], ["GET /v1/posts/metrics", "목록 페이지 다건 조회", "캐시 지연 UX 고려"] ]} ] }, { id: "mediamaak-security-operations", category: "ops", title: "MediaMak 보안·운영 정책", summary: "MediaMak 자동화 저장소와 공개 사이트에 저장하면 안 되는 데이터, 품질 실패 처리, 장애 대응 기준입니다.", owner: "Ops", updated: "2026.08.25", status: "Imported", tags: ["mediamaak", "security", "operations", "guardrail"], blocks: [ { type: "section", title: "금지 데이터", body: [ "OpenAI API key, GitHub token, 자동매매 계정 정보, 주문 상세, DB 접속 정보, 개인 식별 정보, 비공개 전략 파라미터, 원문 전문 복사본은 저장소와 GitHub Pages 산출물에 저장하지 않습니다." ]}, { type: "matrix", rows: [ ["장애", "대응", "공개 여부"], ["수집 실패", "그날 발행 생략, run log 기록", "공개하지 않음"], ["LLM 실패", "재시도 1회 후 draft 중단", "공개하지 않음"], ["품질 평가 실패", "PR 생성하지 않음", "공개하지 않음"], ["Pages PR 실패", "content-agent issue 생성", "필요 최소 정보만"], ["중복 URL 감지", "후보 제외 후 다음 후보 사용", "공개하지 않음"] ]}, { type: "checklist", items: [ "출처 링크 접근 실패 시 발행하지 않습니다.", "원문 근거 없는 수치와 장문 인용을 차단합니다.", "과장 제목과 투자 조언으로 보이는 표현을 제거합니다.", "감사 로그는 공개 사이트에 올리지 않습니다." ]} ] }, { id: "release-notes", category: "change", title: "릴리즈 노트", summary: "아카시 LLM 위키와 모델 운영 변경 이력을 남기는 표준 형식입니다.", owner: "Core", updated: "2026.08.25", status: "Active", tags: ["change", "release"], blocks: [ { type: "section", title: "초기 릴리즈", body: ["정적 위키 MVP를 생성했습니다. 카테고리 탐색, 검색, 태그 필터, 문서 링크 복사를 지원합니다."] }, { type: "matrix", rows: [ ["버전", "변경", "확인 필요"], ["wiki-v0.1", "HTML/CSS/JS 기반 위키 MVP", "실제 아카시 LLM 코드/데이터 위치 연결"], ["docs-v0.1", "초기 문서 12개 작성", "프로젝트별 소유자와 승인 기준 확정"], ["eval-v0.1", "평가 플레이북 초안", "고정 평가 세트 작성" ] ]} ] } ]; })();