name: Upstream canary # Weekly early warning: install `@deepseek-ai/dsh*@next` in place of the # pinned release and run the full suite. A failure here means the next # upstream release will break the overlay — file it before users hit it. on: schedule: - cron: '17 21 * * 1' # Mondays 21:17 UTC workflow_dispatch: permissions: contents: read issues: write jobs: canary: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: node-version: 24 cache: pnpm - name: Point every dsh pin at @next run: | node -e ' const fs = require("node:fs") const pkg = JSON.parse(fs.readFileSync("package.json", "utf8")) for (const name of Object.keys(pkg.dependencies)) { if (name.startsWith("@deepseek-ai/dsh")) pkg.dependencies[name] = "next" } fs.writeFileSync("package.json", JSON.stringify(pkg, null, 2) + "\n") ' pnpm install --no-frozen-lockfile - name: Report the resolved upstream version run: | echo "dsh@next resolved to $(node -p 'require("@deepseek-ai/dsh/package.json").version')" | tee -a "$GITHUB_STEP_SUMMARY" - name: Typecheck against @next run: pnpm typecheck - name: Test against @next run: pnpm test - name: Smoke the real profiles against @next run: | node bin/omd setup node bin/omd doctor node bin/omd config > /dev/null env: DSH_HOME: ${{ runner.temp }}/dsh-home - name: File or update the canary issue if: failure() uses: actions/github-script@v7 with: script: | const label = 'upstream-canary' const title = 'Upstream canary: the overlay breaks against dsh@next' const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` const body = [ 'The weekly canary against `@deepseek-ai/dsh*@next` failed.', '', `Run: ${runUrl}`, '', 'Triage with [docs/upstream-upgrade-playbook.md](../blob/main/docs/upstream-upgrade-playbook.md).', ].join('\n') const { data: open } = await github.rest.issues.listForRepo({ owner: context.repo.owner, repo: context.repo.repo, state: 'open', labels: label, }) if (open.length > 0) { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: open[0].number, body: `Still failing.\n\nRun: ${runUrl}`, }) } else { await github.rest.issues.create({ owner: context.repo.owner, repo: context.repo.repo, title, body, labels: [label], }) }