docs: quote an independent observation of the session lifetime #2
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: ci | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| permissions: | |
| contents: read | |
| jobs: | |
| check: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - run: bun install --frozen-lockfile | |
| - name: typecheck | |
| run: bun run typecheck | |
| - name: lint (biome + oxlint + embedded test app + generated README block) | |
| run: bun run lint | |
| - name: unit tests | |
| run: bun test src/ test-app/ | |
| - name: coverage summary (reporting only) | |
| # Reporting, not an enforced gate — deliberately. The Solari half of the | |
| # library (core/outlive.ts, test-app/deploy.ts) is exercised by | |
| # the live e2e and the bench, not by unit tests, because unit-testing it | |
| # would mean mocking the Solari SDK, which the anti-slop | |
| # no-module-mocking rule forbids. A hard unit threshold would therefore | |
| # be a fake gate. The retry loop itself is fully covered, because it | |
| # takes a launcher instead of a client. | |
| run: bun test --coverage src/ test-app/ | |
| - name: build | |
| run: bun run build | |
| - name: use the node the package declares | |
| uses: actions/setup-node@v7 | |
| with: | |
| node-version: 20 | |
| - name: dist smoke — run the shipped artifact under node | |
| # Pins the path a consumer actually executes: the ESM entry, the exports, | |
| # node:crypto under plain node, and one full run through the loop. | |
| run: node scripts/dist-smoke.mjs | |
| - name: timer probe — the process must exit when outlive() returns | |
| # Drives the public Solari adapter against a structural fake and fails | |
| # if an orphaned capture or grace timer keeps the event loop alive. | |
| run: node scripts/timer-probe.mjs | |
| # The live gates (bun run test:e2e, bun run bench) are intentionally not | |
| # run in CI: they need a real SOLARI_API_KEY, they spend plan quota, and | |
| # the e2e deliberately waits ~14 minutes for a real session to die. They | |
| # are the pre-publish gates, run locally against the live API. |