399 Commits

Author SHA1 Message Date
Stephen Shin f3ae87cefb feat: 감사 사례 기반 레드플래그 카운트 추가
과거 권익위 실태점검과 행안부 관리강화 기준에서 반복된 문제 패턴을 문서상 관측 가능한 레드플래그로 낮춰 정리했다. 사용자는 세금낭비 여부를 단정받는 대신 몇 개의 검토 신호가 원문 근거로 확인되는지 볼 수 있다.

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: 시장가 기반 항공·숙박 비용 비교 또는 실제 감사 판단
2026-07-08 20:43:43 +09:00
Stephen Shin 3a97e3b918 feat: 출장 낭비 검토 신호를 요소별로 구조화
단순 비용 높음/낮음 표시로는 공무국외출장의 타당성을 설명하기 어렵다. 인사혁신처 심사기준과 행정안전부·국민권익위원회 공개자료의 사전·사후관리 요소를 참고해 목적, 방문기관, 인원, 기간, 일정 밀도, 비용 구조, 고비용 요소, 결과물, 투명성을 분리한 비용 대비 타당성 검토 매트릭스를 문서화했다.

Constraint: 세금낭비·위법 여부를 확정하지 않고 원문 근거 기반 검토 신호로만 표시해야 함

Rejected: 단일 '비용 높음' 라벨 | 출장 목적·일정·성과가 빠져 비용 대비 타당성을 설명하지 못함

Confidence: high

Scope-risk: narrow

Directive: 검토 신호를 숫자 점수나 세금낭비 확정 문구로 바꾸지 말 것

Tested: ./scripts/validate-skills.sh

Tested: git diff --check

Tested: npm run ci

Not-tested: 실시간 항공권·숙박 시세 비교는 의도적으로 범위 밖
2026-07-08 20:33:55 +09:00
Stephen Shin 234a54bc50 fix: PDF 첨부 kordoc 추출 경로 반영
현재 선관위 공무국외출장보고서 게시판의 실측 첨부가 모두 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 첨부는 현재 게시판에서 확인되지 않음
2026-07-08 20:18:44 +09:00
Stephen Shin 5347976b85 feat: 선관위 공무국외출장 보고서 접근성 개선
공식 게시판에서 확인 가능한 목록, 상세, 첨부 원문 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라 실행하지 못함
2026-07-08 20:08:18 +09:00
Jeffrey (Dongkyu) Kim 802fae0916 BrowserOS-first browser runtime (auto default) + migrate browser skills (#395)
* 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
2026-07-07 11:15:17 +09:00
Jeffrey (Dongkyu) Kim 7dee4326c7 Merge PR #366 into dev
# Conflicts:
#	package.json
2026-07-06 15:06:07 +09:00
Jeffrey (Dongkyu) Kim d0e00bc111 Merge PR #365 into dev 2026-07-06 15:05:47 +09:00
Jeffrey (Dongkyu) Kim 90ad10ffd3 Merge main into Naver ad performance PR
# Conflicts:
#	package.json
2026-07-06 15:04:51 +09:00
Jeffrey (Dongkyu) Kim c5043251fe Merge main into iros PDF summary PR
# Conflicts:
#	package.json
2026-07-06 15:04:51 +09:00
Jeffrey (Dongkyu) Kim 944e85222d Harden k-skill-proxy public docs (#394) 2026-07-06 14:25:04 +09:00
bangju 146ba38489 feat(naver-ad-performance): add read-only Naver SearchAd performance skill
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.
2026-07-03 14:27:27 +09:00
bangju 12f6869c8d feat(iros-registry-automation): local registry PDF summary
발급받은 등기부등본 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, 이 스킬이 원격 전송하지 않음).
2026-07-03 12:26:17 +09:00
Jeffrey (Dongkyu) Kim 3b98b58ab4 Merge origin/dev and fix yebigun training review issues 2026-07-02 15:57:15 +09:00
Jeffrey (Dongkyu) Kim b1c39a7814 Merge remote-tracking branch 'origin/dev' into dev-issue-330-s2b
# Conflicts:
#	package.json
2026-07-02 15:32:43 +09:00
Jeffrey (Dongkyu) Kim dd88f56d35 Merge remote-tracking branch 'origin/dev' into dev-issue-331-d2b
# Conflicts:
#	package-lock.json
#	package.json
2026-07-02 15:17:10 +09:00
Jeffrey (Dongkyu) Kim c85a214f15 Merge pull request #358 from NomaDamas/dev-issue-336-payment-order
Add court payment order assistant skill
2026-07-02 15:09:52 +09:00
Cheol-H-Jeong b0b788987b Add Popbill all-service skill 2026-07-02 08:49:48 +09:00
Jeffrey (Dongkyu) Kim 1a317f5d35 Add court payment order assistant skill 2026-07-02 01:29:50 +09:00
Jeffrey (Dongkyu) Kim 9f2949eb34 Add D2B notice search skill 2026-07-02 00:57:11 +09:00
Jeffrey (Dongkyu) Kim 96a7f7751c Add S2B notice search skill 2026-07-01 23:25:13 +09:00
semteo04 3f8fa9ecce feat: yebigun-training 스킬 추가 (예비군 훈련정보 조회 & 작년 대비 비교)
로그인된 예비군 홈페이지(yebigun1.mil.kr) Chrome 세션을 재사용해 훈련 일정/장소를
조회하고 작년 기록과 비교한다. 식별 정보 없는 조회 화면만 읽고(view), 신청/편집
화면은 열기만 하며(open-menu) 로그인·제출은 절대 자동화하지 않는다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-01 20:15:36 +09:00
Jeffrey (Dongkyu) Kim face06274e Add naming-house skill 2026-06-29 22:01:01 +09:00
Jeffrey (Dongkyu) Kim 0d9ac65eee Merge pull request #347 from NomaDamas/dev
Promote dev to main
2026-06-26 10:00:40 +09:00
Jeffrey (Dongkyu) Kim db8117491b Add missing README skill entries 2026-06-25 22:15:06 +09:00
Jeffrey (Dongkyu) Kim 9e89f682cc Migrate k-skill-proxy deploy to gpu01 cron 2026-06-25 22:04:42 +09:00
Jeffrey (Dongkyu) Kim 441ffbd592 Merge remote-tracking branch 'origin/dev' into pr-341-work
# Conflicts:
#	package.json
2026-06-25 16:31:31 +09:00
Jeffrey (Dongkyu) Kim cd73d45c05 Merge remote-tracking branch 'origin/dev' into pr-334-work
# Conflicts:
#	package.json
2026-06-25 16:18:33 +09:00
Jeffrey (Dongkyu) Kim 172beb3b78 Add G2B order plan search skill 2026-06-24 23:54:29 +09:00
Jeffrey (Dongkyu) Kim 2dd20c2fbd Merge dev into lovebug report 2026-06-24 23:22:12 +09:00
wbjung 46d64ff0c8 Add resume-based job posting match skill 2026-06-24 21:22:02 +09:00
Jeffrey (Dongkyu) Kim 451d557a6b fix(daangn-realty-search): harden relay-store helper 2026-06-24 17:33:04 +09:00
Jeffrey (Dongkyu) Kim 55866b15a3 Add lovebug report skill 2026-06-24 17:29:21 +09:00
wbjung c619d3b7c7 Add recruiting talent search skills 2026-06-17 23:14:54 +09:00
Jeffrey (Dongkyu) Kim c3f44eef14 feat(kakaotalk-mac): replace kakaocli workflow with katok
Closes #320

Plan: .omo/plans/issue-320-katok-skill.md
2026-06-16 13:44:56 +09:00
Jeffrey (Dongkyu) Kim c8bb7f9f35 Merge dev and address PR review fixes 2026-06-12 19:34:20 +09:00
Jeffrey (Dongkyu) Kim f485591ac2 feat(k-skill-proxy): fold Korean law lookups into k-skill-proxy, drop Beopmang (#315)
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.
2026-06-12 18:07:03 +09:00
John 440cd697a7 feat: 사업자 실사 스킬군 — 단품 5종 + 복합 1종, proxy route 3개 추가 (#316)
사업자등록번호로 "이 사업자 실제 문제 없나"를 무료 공공 데이터로 교차 조회하는
스킬군을 기여한다. 점수·등급·"위험" 라벨 없이 사실+출처+조회시각만 병렬한다.

단품 스킬:
- 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>
2026-06-12 16:46:30 +09:00
Jeffrey (Dongkyu) Kim b6200892e3 Revert "docs(korean-law-search): document official precedent API evidence (#313)"
This reverts commit 5faec8bb2a.
2026-06-11 11:45:04 +09:00
Jeffrey (Dongkyu) Kim 79f6038328 feat(toss-securities): add official read-only OpenAPI client (#312)
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
2026-06-10 22:50:47 +09:00
Jeffrey (Dongkyu) Kim 5faec8bb2a docs(korean-law-search): document official precedent API evidence (#313)
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
2026-06-10 22:50:34 +09:00
Jeffrey (Dongkyu) Kim e25f8dd9ab feat(korean-humanizer): rebuild v2 on im-not-ai framework
Build on happy-nut's PR #311 korean-humanizer skill (cherry-picked,
authorship preserved) by re-centering it on the epoko77-ai/im-not-ai
(Humanize KR, MIT) methodology:

- 4대 철칙 (의미 불변 · 근거 기반 · 장르 유지 · 과윤문 금지 30%/50% 가드)
- S1/S2/S3 severity tiers and A~D quality grades
- A~J taxonomy with Korean-specific patterns (A-16 그/그녀 강박,
  A-18 관계절 좌향 수식, A-19 이중 조사, C-11 연결어미 뒤 쉼표, E-7 경어법)
- detect -> rewrite -> audit -> grade loop with self-check checklist
- references/ai-tell-taxonomy.md full A~J table
- docs/features/korean-humanizer.md crediting im-not-ai and happy-nut
- README row + link, regenerated plugin.json, docs regression test

Co-authored-by: happy-nut <happynut.dev@gmail.com>
2026-06-10 14:32:44 +09:00
iamiks 52dbfee064 feat(srt-booking): SRT 좌석 확인과 탐색 우선순위 개선 (#305)
* 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>
2026-06-09 10:57:54 +09:00
Jeffrey (Dongkyu) Kim bbba283151 Archive unsupported map skills 2026-06-05 22:24:15 +09:00
Jeffrey (Dongkyu) Kim 46f44ed724 chore: remove startup-support skill 2026-06-05 17:21:58 +09:00
Jeffrey (Dongkyu) Kim 346ce7f516 fix(startup-support): use K-Startup proxy surface 2026-06-05 13:03:28 +09:00
Jeffrey (Dongkyu) Kim 581b0344ce Merge commit 'c27a3e9' into ulw-merge-seven-prs
# Conflicts:
#	package.json
2026-05-31 17:25:22 +09:00
Jeffrey (Dongkyu) Kim cc768f4031 Merge commit 'cff6b29' into ulw-merge-seven-prs 2026-05-31 17:24:25 +09:00
Jeffrey (Dongkyu) Kim cff6b29ff9 fix(startup-support): remove fabricated detail data 2026-05-31 17:23:57 +09:00
Donghun Seol 00a6d9feae fix(foresttrip-vacancy): exclude 예비 rooms, gate useDt strictly, dedup duplicate rooms
월별예약조회 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>
2026-05-29 20:57:25 +09:00
iamiks 24feb3edca feat(ktx-booking): 좌석 탐색 우선순위 개선
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
2026-05-28 22:49:31 +09:00