Skip to content

Notify Watch

Notify Watch #19

Workflow file for this run

name: Notify Watch
# 공개 왓처 토픽(IPO 신규상장·신규수주) cron — scan SSOT 직독 → 매치 → 허브 /send 브로드캐스트.
# 허브 sentNonce 가 last-seen 매치 set: 이미 보낸 매치는 409(멱등 드롭), 새 매치만 발송. 발행 알림과 별 워크플로.
# 설계: mainPlan/watcher-notify-platform/01-architecture.md §2 · 04 §1 P2. monitorPipeline 등록 대상.
on:
schedule:
- cron: '0 8 * * 1-5' # UTC 08:00 = KST 17:00 평일 — 장 마감 후 당일 신규상장·수주 스윕
workflow_dispatch:
inputs:
topics:
description: '발송 토픽(콤마구분)'
default: 'newIpo,newOrders'
dryRun:
description: 'dry-run(POST 생략)'
type: boolean
default: false
permissions:
contents: read
concurrency:
group: notify-watch # 취소 0(중복 발화 방지) — cron 단발
jobs:
watch:
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync # 왓처는 dartlab.scan 직독. 전체 sync 필요(발행 러너와 달리 무겁다, cron 이라 OK)
# 왓치가 첫 관문: IPO 를 먼저 잡아 6카테고리 리포트를 파싱·HF push(퍼블릭 터미널 직독 SSOT 생산).
# 이 스텝이 먼저라 다음 푸시(newIpo)의 딥링크가 여는 리포트가 이미 HF 에 있다. 실패해도 알림은
# scan('ipo') 폴백으로 계속(continue-on-error 로 watch 스텝 회복성 보존). 같은 runner 라 watch.py 가
# 여기 산출 parquet 을 직독. genuine-failure(push·파싱·사이즈가드)는 아래 assert 스텝이 job RED 로 노출.
- name: Bake IPO reports (parse -> HF, watch first-catch)
id: bake
continue-on-error: true
run: uv run python -X utf8 .github/scripts/sync/buildIpoReports.py
env:
DART_API_KEYS: ${{ secrets.DART_API_KEYS }}
HF_TOKEN: ${{ secrets.HF_TOKEN }}
PYTHONUNBUFFERED: "1"
- name: Watch public topics (scan SSOT -> /send)
run: uv run python -X utf8 .github/scripts/notify/watch.py --topics "${{ github.event.inputs.topics || 'newIpo,newOrders' }}" ${{ github.event.inputs.dryRun == 'true' && '--dry-run' || '' }}
env:
DART_API_KEYS: ${{ secrets.DART_API_KEYS }}
PUSHHUB_URL: ${{ vars.VITE_PUSHHUB_URL }}
PUSHHUB_SEND_TOKEN: ${{ secrets.PUSHHUB_SEND_TOKEN }}
PYTHONUNBUFFERED: "1"
# bake 가시성 가드: continue-on-error 는 알림 회복성 위해 유지하되, 진짜 실패(HF push·파싱·사이즈가드)는
# 여기서 job 을 RED 로 만들어 monitorPipeline 이 "Notify Watch" 의 조용한 실패를 잡게 한다. 미설정 no-op 은
# buildIpoReports 가 exit 0 이라 outcome=success 로 통과(graceful). watch 는 위에서 이미 실행됨(회복성 보존).
- name: Assert IPO bake succeeded (genuine failure to RED)
if: always()
run: |
if [ "${{ steps.bake.outcome }}" = "failure" ]; then
echo "::error::IPO bake 실패 (HF reports.parquet 미갱신). 퍼블릭 터미널 리포트 stale 위험"
exit 1
fi
echo "IPO bake ok (outcome=${{ steps.bake.outcome }})"