과거 권익위 실태점검과 행안부 관리강화 기준에서 반복된 문제 패턴을 문서상 관측 가능한 레드플래그로 낮춰 정리했다. 사용자는 세금낭비 여부를 단정받는 대신 몇 개의 검토 신호가 원문 근거로 확인되는지 볼 수 있다.
Constraint: 선관위 보고서 조회 스킬은 판정 도구가 아니라 공식 공개문서 기반 참고 요약 도구여야 함
Constraint: 몰디브 사례는 최근 논란 맥락으로만 사용하고 감사·법적 판단 근거로 사용하지 않음
Rejected: 세금낭비 여부를 이분법으로 출력 | 문서만으로 확정하면 과잉판단 위험이 큼
Rejected: 휴양지·해변 단어를 자동 레드플래그로 집계 | 선거운동 맥락 또는 국가 개황 설명일 수 있어 contextFlags로 분리
Confidence: high
Scope-risk: narrow
Directive: redFlagCount는 점수나 순위가 아니라 관측된 패턴 수로 유지할 것
Tested: ./scripts/validate-skills.sh
Tested: git diff --check
Tested: JSON output examples parsed with node
Tested: npm run ci
Tested: NEC Maldives PDF kordoc extraction success true/fileType pdf/Markdown 28149 chars
Not-tested: 시장가 기반 항공·숙박 비용 비교 또는 실제 감사 판단
단순 비용 높음/낮음 표시로는 공무국외출장의 타당성을 설명하기 어렵다. 인사혁신처 심사기준과 행정안전부·국민권익위원회 공개자료의 사전·사후관리 요소를 참고해 목적, 방문기관, 인원, 기간, 일정 밀도, 비용 구조, 고비용 요소, 결과물, 투명성을 분리한 비용 대비 타당성 검토 매트릭스를 문서화했다.
Constraint: 세금낭비·위법 여부를 확정하지 않고 원문 근거 기반 검토 신호로만 표시해야 함
Rejected: 단일 '비용 높음' 라벨 | 출장 목적·일정·성과가 빠져 비용 대비 타당성을 설명하지 못함
Confidence: high
Scope-risk: narrow
Directive: 검토 신호를 숫자 점수나 세금낭비 확정 문구로 바꾸지 말 것
Tested: ./scripts/validate-skills.sh
Tested: git diff --check
Tested: npm run ci
Not-tested: 실시간 항공권·숙박 시세 비교는 의도적으로 범위 밖
현재 선관위 공무국외출장보고서 게시판의 실측 첨부가 모두 PDF라서, PDF를 링크 메타데이터만 남기는 안내는 실제 사용 경로를 충족하지 못한다. 기존 hwp 스킬의 kordoc 절차가 pdfjs-dist와 함께 PDF를 JSON/Markdown으로 추출할 수 있음을 최신 게시글 첨부로 확인하고, SKILL.md와 공개 문서를 그 동작 기준으로 정리했다.
Constraint: 2026-07-08 선관위 게시판 실측 첨부 62건이 모두 PDF
Rejected: PDF를 1차 PR 범위 밖으로 남김 | 실제 게시판에서 곧바로 동작하지 않는 스킬이 됨
Confidence: high
Scope-risk: narrow
Directive: 선관위 공무국외출장보고서 스킬에서 PDF를 링크 전용 경로로 되돌리지 말 것
Tested: npx --yes --package kordoc --package pdfjs-dist kordoc /tmp/nec_attachment_303199.pdf --format json --silent
Tested: ./scripts/validate-skills.sh
Tested: git diff --check
Tested: npm run ci
Not-tested: 선관위 실측 HWP/HWPX 첨부는 현재 게시판에서 확인되지 않음
공식 게시판에서 확인 가능한 목록, 상세, 첨부 원문 URL을 SKILL.md 중심 워크플로우로 문서화하고, 판정 대신 미기재 항목을 정직하게 표시하도록 범위를 좁혔다.
Constraint: 1차 PR은 중앙선거관리위원회 공식 게시판과 SKILL.md 중심 문서화로 한정
Rejected: PDF 파싱 구현 | 이번 PR 범위 밖이며 실측 첨부가 PDF뿐이라 링크 메타데이터만 기록
Confidence: high
Scope-risk: narrow
Tested: npm run ci
Not-tested: HWP/HWPX kordoc 파싱은 실측 대상 첨부가 모두 PDF라 실행하지 못함
* Fix S2B live list row parsing
* Fix D2B public page classification
* Fix yebigun BrowserOS session handling
* Fix D2B mixed bid category parsing
* Fix browser runtime disconnect cleanup
* Add changeset for live skill fixes
* Fix yebigun open menu cleanup tests
* Document browser runtime guidance
* Fix D2B public small bid field parsing
* Sanitize yebigun live verification docs
* Default browser runtime to BrowserOS-first auto and migrate court/hipass skills
- Migrate hipass-receipt, court-auction-notice-search, and court-payment-order-assistant
onto k-skill-browser-runtime (semver dependency, CDP-only, disconnect-not-close).
- Default the browser runtime provider to `auto`: prefer a user-launched BrowserOS
session (9100) and fall back to a Chrome/Chromium CDP session (9222);
KSKILL_BROWSER_PROVIDER can force browseros/chrome-cdp, --cdp-url targets a URL.
- court-auction keeps direct HTTP first with a runtime-CDP -> local-launch fallback;
court-payment stays BrowserOS CDP -> manual handoff only.
- Document that court-auction and court-payment produce their core output without a
real browser; keep login/CAPTCHA/payment/e-signature/irreversible boundaries manual.
- Update docs (setup, adding-a-skill, feature guides), READMEs, changeset, lockfile,
and the skill-docs regression test.
* Document browser runtime skill authoring
* Prefer Aside before Chrome CDP
New Python-script skill wrapping the Naver SearchAd (검색광고) API:
campaign/adgroup/keyword listing, stats (impressions/clicks/spend/
CTR/CPC/avg rank/conversions), keyword tool (related keywords, monthly
search volume, competition), and a doctor command for credential/
reachability diagnostics.
Read-only by design — no bid, campaign, or keyword mutation endpoints
are implemented, matching the pattern used by other credentialed
k-skill skills (korean-patent-search, k-dart). Auth follows the
official HMAC-SHA256 request signing scheme (X-Timestamp/X-API-KEY/
X-Customer/X-Signature), stdlib-only (hmac/hashlib/base64/urllib), no
new dependencies.
Wired into README skill table, docs/features, docs/security-and-secrets.md
default env list, and docs/install.md's setup-required skill list.
Reference: https://github.com/NariP/naver-searchad (MIT) for the
signing scheme and command surface.
발급받은 등기부등본 PDF에서 근저당·가압류·소유권 변동 등 핵심 항목을 사실만 뽑아
사람이 읽기 쉬운 요약을 만든다. 발급 후 단계 전용(로그인·결제 재실행 없음).
- scripts/iros_pdf_summary.py: 로컬 텍스트 추출(pdfplumber→pypdf) 기본, 원격 전송 없음.
스캔 PDF는 사용자가 로컬 self-host 변환기(marker 등)로 바꾼 결과를 --from-text로 요약.
주민등록번호 마스킹, 요약은 $workdir/output에만(판단·법률자문 없음).
- tests/test_iros_pdf_summary.py: 파서 순수함수 유닛테스트 12개(모의 텍스트, 실 PDF·PII 없음).
- SKILL.md: "7. 발급 후 PDF 요약(선택)" 워크플로 + Response policy(판단형 표현 금지) + marker 크레딧.
- docs/features 업데이트.
marker 참고: NomaDamas/marker-api-server (로컬 self-host, 이 스킬이 원격 전송하지 않음).
로그인된 예비군 홈페이지(yebigun1.mil.kr) Chrome 세션을 재사용해 훈련 일정/장소를
조회하고 작년 기록과 비교한다. 식별 정보 없는 조회 화면만 읽고(view), 신청/편집
화면은 열기만 하며(open-menu) 로그인·제출은 절대 자동화하지 않는다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add hosted korean-law proxy routes and make the korean-law-search skill
proxy-first, removing the unstable Beopmang fallback from the support list.
- proxy: new src/korean-law.js wrapping official 법제처 DRF lawSearch.do /
lawService.do, injecting LAW_OC + browser User-Agent/Referer (the real
cause of "사용자 정보 검증 실패") and retrying empty/HTML responses.
- proxy: /v1/korean-law/search and /v1/korean-law/detail routes + lawOc
config + koreanLawConfigured health flag; 17 module + 6 route tests.
- skill/docs: korean-law-search becomes proxy-first (no per-user LAW_OC,
no local CLI). Drop Beopmang everywhere; credit chrisryugj/korean-law-mcp
as design reference and 법제처 open.law.go.kr as official source.
- ops: LAW_OC added to deploy doc KEYS, secret accessor loop, and the
Cloud Run deploy workflow set-secrets.
- changeset: k-skill-proxy minor.
사업자등록번호로 "이 사업자 실제 문제 없나"를 무료 공공 데이터로 교차 조회하는
스킬군을 기여한다. 점수·등급·"위험" 라벨 없이 사실+출처+조회시각만 병렬한다.
단품 스킬:
- national-pension-workplace 국민연금 가입 사업장 (proxy, 3046071)
- nts-tax-delinquency 국세 체납 명단공개 (무인증 직접)
- fsc-corporate-info 금융위 기업기본정보 (proxy, 15043184)
- g2b-sanctioned-supplier 조달청 부정당제재 (proxy, 15129466)
- localdata-business-status 지방행정 인허가 영업상태 208업종 (무인증 직접)
복합 스킬:
- biz-health-check 위 5종 + 기존 nts-business-registration을 한 번에 호출
proxy(packages/k-skill-proxy):
- keyed route 3개 추가 — 키는 서버의 DATA_GO_KR_API_KEY로만 주입(사용자 시크릿 없음)
- 연금 route는 basic+detail+monthly 3콜 오케스트레이션 + 월별중복 dedup
- server.test.js에 route 테스트 10건 추가 (정상/503 미설정/400/403 forbidden)
무인증 스킬은 stdlib(urllib)만 사용해 의존성 없이 직접 호출한다.
문서: docs/features ×6, README 표·링크, docs/sources.md 갱신, plugin.json 재생성.
활용신청(프록시 운영 서버 등록 필요): 3046071·15043184·15129466
(15081808 국세청 상태조회는 nts-business-registration용으로 이미 등록, 키 공유).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add an official Toss Securities Open API client alongside the existing
unofficial tossctl wrapper. The package ships read-only helpers backed by
the official REST API (https://openapi.tossinvest.com): OAuth2
client_credentials token issuance with an in-memory token cache, bearer +
X-Tossinvest-Account header handling, TossApiError/TossCredentialsError
with secret/token redaction, and 429 Retry-After/backoff retry.
Credentials are read from TOSSINVEST_CLIENT_ID/TOSSINVEST_CLIENT_SECRET
(optional TOSSINVEST_ACCOUNT/TOSSINVEST_API_BASE_URL) and sent directly to
Toss, never through a shared proxy. Order mutation remains out of scope;
the tossctl path is retained as a documented fallback.
Closes#306
Enhance the existing korean-law-search skill and feature doc with the
official 법제처 Open API precedent endpoints and detail retrieval, without
adding a new skill, package, workspace, or changeset.
- Document 판례 목록 조회 (lawSearch.do?target=prec) and 판례 본문 조회
(lawService.do?target=prec&ID=...) as official evidence behind the
korean-law-mcp search_precedents/get_precedent_text path.
- Add supported precedent filters (query, court, case number, source
name, date, sort) and precedent-specific failure modes (missing LAW_OC,
upstream unavailable/rate-limit/timeout, empty results, body
unavailable for some sources) plus the legal-advice boundary.
- Keep korean-law-mcp first and Beopmang as the only post-failure
fallback; lawService.do?target=prec is official detail retrieval, not a
Beopmang-style fallback.
- Extend the skill-docs regression test with stable endpoint/tool
literals and concept-level filter/failure-mode/legal-boundary checks.
Closes#308
* feat(srt): 좌석 조회와 탐색 우선순위 추가
SRT search 결과의 stable train_id로 객차별 좌석을 조회하고, 특정 호차/좌석 확인과 탐색 우선순위 옵션을 제공한다.
Constraint: SRT와 KTX는 별도 upstream 표면이므로 SRT HTML 파서와 테스트를 분리함
Rejected: KTX 좌석 helper 공유 | Korail API와 SRT 웹 좌석선택 HTML 계약이 달라 혼용하면 파서 안정성이 낮아짐
Confidence: medium
Scope-risk: moderate
Directive: SRT 좌석선택 HTML에서 노출되지 않는 속성은 추정하지 말고 명시적으로 처리할 것
Tested: PYTHONPATH=.:scripts python3 -m unittest scripts.test_srt_booking scripts.test_ktx_booking; python3 -m py_compile scripts/srt_booking.py scripts/srt_seats.py scripts/test_srt_booking.py
Not-tested: 실제 예약 API에 우선순위 좌석 선택을 연결하는 흐름
* fix(srt): 좌석 조회 JSON 출력 안정화
SRT 대기열 메시지가 stdout에 섞여 seats JSON을 깨는 실제 표면 문제를 막고, 누락된 좌석 방향/위치 속성을 unknown으로 정규화한다.
Constraint: issue #303 범위는 예약 부작용이 없는 좌석 조회 보조 흐름으로 제한됨
Rejected: 실제 예약 subcommand 추가 | 좌석 선점/예약은 외부 부작용이라 이번 acceptance criteria에 포함되지 않음
Confidence: high
Scope-risk: narrow
Directive: SRTrain upstream 출력이 추가되더라도 helper stdout은 JSON 전용으로 유지할 것
Tested: RED→GREEN in .omo/ulw-loop/evidence/srt-c002-red-green-tests.txt; live SRT tmux QA in .omo/ulw-loop/evidence/srt-c001-live-search-seats.txt; npm run ci in .omo/ulw-loop/evidence/srt-c003-regression-ci.txt
Not-tested: 실제 예약/결제/취소 부작용 흐름
* test(srt): split seat helper regression coverage
---------
Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>
월별예약조회 API가 srchDate 단일 일자 요청에도 5일 윈도우를 반환하고,
"예비"로 표기된 운영자 보유분이 raw 응답에 포함되며, 같은 객실이 다른
goodsId로 중복 표시되는 세 가지 문제를 한꺼번에 fix한다.
수정:
- collect_results 안에 strict useDt gate 추가 (today~last_day 범위 밖 행 차단)
- is_reserve_room() helper로 goodsNm에 "예비" 포함 객실 제외
- (forest_id, use_dt, name) 단위 dedup으로 중복 행 제거
- is_available()는 시그니처/로직 변경 없이 booking-state predicate 유지
추가:
- foresttrip-vacancy/tests/ 18개 단위 테스트 (mock + fixture 기반)
- IsReserveRoomTest, IsAvailableTest, CollectResultsFilterTest,
StrictUseDtGateTest, GroundTruthTest 다섯 클래스
- 거제·구재봉 fixture로 사용자 라이브 검증 결과 회귀 보호
- package.json lint·test 스크립트에 등록
문서:
- SKILL.md: API 5일 윈도우/예비 객실/중복 dedup 자동 처리 명시 + 회복 시나리오 보강
- docs/features/foresttrip-vacancy.md: 기본 흐름 6단계와 주의할 점 보강
사용자 라이브 검증 ground truth (2026-05-12 기준):
- 거제자연휴양림 5/13 ~9개, 5/16 0개, 5/17 19개, 5/23 0개, 5/24 0개
- 구재봉자연휴양림 5/16 1개 (206호 쑥부쟁이방)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
KTX 상세 좌석 조회에서 가운데 호차를 먼저 탐색하고,
같은 호차 안에서는 콘센트 좌석과 순방향 좌석을 우선 노출합니다.
#294 요구사항을 우선순위 함수와 command_seats 회귀 테스트로 고정합니다.
Constraint: #294는 기존 seats 공개 인터페이스 유지를 요구함
Rejected: 예약 API에 객차/좌석 번호를 직접 주입 | 현재 helper 예약 경로가 해당 선택 인자를 노출하지 않음
Confidence: high
Scope-risk: narrow
Directive: 좌석 우선순위 변경 시 command_seats 출력 순서 테스트를 함께 갱신할 것
Tested: PYTHONPATH=.:scripts python3 -m unittest scripts.test_ktx_booking
Tested: node --test scripts/skill-docs.test.js
Tested: npm run typecheck
Tested: npm run ci