Notify Watch #19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }})" |