Skip to content

Commit fbb3328

Browse files
RyanAlbertsclaude
andauthored
release: v0.1.0 (#10)
First publishable release. What ships in v0.1.0 - Phase 0 + Phase 1 of the project plan: scraper, sanitizer, link verifier, coverage probe, LLM enrichment with anti-hallucination Layer 1, enriched dashboard, cited-URL publish gate, resume + re- render commands, raw failure capture. - 103 tests passing, mypy --strict clean, secret-scan clean. - Real W26 results checked in: 63.3% coverage, 95% high-confidence on the LLM enrichment, 0 schema failures, 0 hallucinated source URLs, top finding 'W26 = the agentic batch' on n=118. Mechanics - pyproject.toml: 0.0.1 -> 0.1.0, classifier bumped pre-alpha -> alpha. - src/ycai/__init__.py: __version__ matches. - tests/test_smoke.py: version assertion bumped. - CHANGELOG.md: 0.1.0 release notes synthesizing PR #6-#9. - README.md: status table updated, quickstart documents the actual v0.1 commands (run-coverage / resume / dashboard). - .github/workflows/release.yml: build wheel+sdist on tag push, publish to PyPI via Trusted Publishing (id-token), attach artifacts to GitHub release. Local smoke - python -m build produces yc_ai_pulse-0.1.0-py3-none-any.whl (38KB) and yc_ai_pulse-0.1.0.tar.gz (134KB). - pipx install --force <wheel> succeeds; ycai version returns 0.1.0; ycai run-coverage --batch winter-2026 succeeds end-to-end from a clean /tmp directory. PyPI Trusted Publishing setup (one-time, on PyPI side) - https://pypi.org/manage/project/yc-ai-pulse/settings/publishing/ - Repo: RyanAlberts/yc-ai-pulse - Workflow: release.yml - Environment: pypi - Until configured, the publish job will fail; the GitHub release job still attaches built wheels. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent bda9a23 commit fbb3328

6 files changed

Lines changed: 135 additions & 28 deletions

File tree

.github/workflows/release.yml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
build:
13+
name: Build wheel + sdist
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v4
17+
- uses: actions/setup-python@v5
18+
with:
19+
python-version: "3.11"
20+
- name: Install build
21+
run: python -m pip install --upgrade pip build
22+
- name: Build distribution
23+
run: python -m build
24+
- name: Upload artifacts
25+
uses: actions/upload-artifact@v4
26+
with:
27+
name: dist
28+
path: dist/
29+
30+
publish:
31+
name: Publish to PyPI (Trusted Publishing)
32+
needs: build
33+
runs-on: ubuntu-latest
34+
# Trusted Publishing requires id-token: write. Configured on PyPI at
35+
# https://pypi.org/manage/project/yc-ai-pulse/settings/publishing/
36+
# against this repo + this workflow filename.
37+
permissions:
38+
id-token: write
39+
environment:
40+
name: pypi
41+
url: https://pypi.org/p/yc-ai-pulse
42+
steps:
43+
- uses: actions/download-artifact@v4
44+
with:
45+
name: dist
46+
path: dist/
47+
- uses: pypa/gh-action-pypi-publish@release/v1
48+
49+
github-release:
50+
name: Attach artifacts to GitHub release
51+
needs: build
52+
runs-on: ubuntu-latest
53+
permissions:
54+
contents: write
55+
steps:
56+
- uses: actions/download-artifact@v4
57+
with:
58+
name: dist
59+
path: dist/
60+
- name: Upload to GitHub release
61+
env:
62+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
63+
TAG_NAME: ${{ github.ref_name }}
64+
REPO: ${{ github.repository }}
65+
run: |
66+
gh release upload "$TAG_NAME" dist/* --repo "$REPO" --clobber

CHANGELOG.md

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
_(no changes since 0.1.0)_
11+
12+
## [0.1.0] — 2026-05-01
13+
14+
First publishable release. End-to-end pipeline that pulls the latest YC batch, classifies it with a Sonnet-class model under strict anti-hallucination guards, and renders a single-file HTML dashboard with row-level drill-downs.
15+
1016
### Added
11-
- Phase 0 bootstrap: MIT license, repo scaffolding, pre-commit + secret-scan, CI workflow, BACKLOG discipline, first ADR.
12-
- Phase 1 PR #1: yc-oss/api scraper, PII sanitizer, link verifier, coverage probe, single-file dashboard, Typer CLI (`ycai run-coverage`).
13-
- Coverage metric is the dashboard headline. The dropped register acknowledges every excluded company and the specific reason — no quiet drops.
14-
- First end-to-end probe on YC W26: 63.3% coverage of the official 196-company batch. Findings in `docs/QUALITY_REPORT_W26.md`.
15-
- Phase 1 PR #2: LLM-based enrichment with anti-hallucination Layer 1 — pydantic-enforced output schema, source-URL guard against fabricated citations, two-pass cross-check on uncertain rows, sentinel low-confidence row on any failure. Three backends: `AgentSDKBackend` (subscription-default), `AnthropicAPIBackend` (`--api-key`), `MockBackend` (tests). 10 hallucination-trap fixtures locked in as regression tests.
16-
- W26 enrichment smoke run (5 companies via subscription, 39s, ~free): 4 high / 1 low confidence. Identified `gru.space` as `no-ai` correctly. Schema-validation failure on `velum-labs` correctly fell through to the sentinel — no fabricated analysis served.
17-
- Phase 1 PR #3: enriched dashboard. AI capability x industry heatmap, tech-stack distribution, OSS-posture breakdown, and confidence breakdown — all with row-level drill-downs. Cited-URL link-verify hard gate before any artifact ships (override via `--allow-dead-links` writes a `BROKEN_LINKS.md` sidecar and shows a warning banner). Lenient parsing for `industry_secondary` so the model can emit reasonable categories without tanking the row.
18-
- W26 full-batch enrichment via subscription (124 companies, ~6 min, ~free): 83 high / 41 low confidence. Top finding: **65% of high-confidence W26 companies (54 of 83) build agents**. 8 companies correctly classified as `no-ai` (the trust signal). 3 cited URLs caught dead at publish time and surfaced via the publish gate.
19-
- Phase 1 PR #4: resilience + parser tightening. Lenient parsing extended to `ai_capability` (drop unknowns, fall back to `unclear`) and `tech_stack` (drop unknowns). `rationale` and `tagline_rewrite` truncate at the schema cap rather than fail the whole row. Raw failure capture (`raw_failures.jsonl`) for audit. Incremental writes to `analyses.jsonl` so partial state survives a crash. New `ycai resume <run-dir>` command resumes interrupted enrichment. New `ycai dashboard <run-dir>` re-renders the dashboard from existing artifacts at zero LLM cost. Live progress shows high/medium/low counts during enrichment.
20-
- W26 full-batch re-run after PR #4: schema-validation failure rate dropped from 23% to **0%**. High-confidence rate went from 67% to **95%** (118 of 124). The "W26 is the agentic batch" finding strengthened to 58% of n=118. Quality writeup updated at `docs/QUALITY_REPORT_W26.md`.
21-
22-
[Unreleased]: https://github.com/RyanAlberts/yc-ai-pulse/compare/main...HEAD
17+
18+
**Phase 0 — bootstrap (PR #6 lineage starts here)**
19+
- MIT license, repo scaffolding, pre-commit + secret-scan + gitleaks + custom Anthropic-key regex, CI workflow, BACKLOG discipline, first two ADRs (yc-oss/api as the only sanctioned source; localhost FastAPI deferred to Phase 3).
20+
21+
**Phase 1 — analysis pipeline**
22+
- **PR #6 — coverage probe**: yc-oss/api scraper with hard-fail when upstream is unreachable (no scraping `ycombinator.com/companies?...` per [robots.txt](docs/decisions/0001-yc-data-source.md)). PII sanitizer (idempotent strip before disk and before any LLM call). Async link verifier. Coverage probe with three tiers (A: full / B: website unreachable / C: missing required field) and a dropped register that names every excluded company. Coverage % is the dashboard headline.
23+
- **PR #7 — LLM enrichment with anti-hallucination Layer 1**: pydantic-enforced classification schema, three backends (AgentSDK / Anthropic API / Mock), source-URL grounding (the cited URL must come from the company's website or YC profile), two-pass cross-check on medium-confidence rows, sentinel low-confidence row on any failure. 10 hallucination-trap fixtures as regression tests.
24+
- **PR #8 — enriched dashboard + cited-URL publish gate**: capability×industry heatmap, tech-stack distribution, OSS-posture breakdown, confidence breakdown. Each chart drills down to source rows. Cited URLs are HEAD/GET-verified before publish; `--allow-dead-links` writes a sidecar `BROKEN_LINKS.md` and surfaces a banner.
25+
- **PR #9 — resilience + parser tightening**: schema-failure rate dropped 23% → 0%. Truncate-not-reject for verbose free-text fields (`rationale`, `tagline_rewrite`). Lenient parsing for `ai_capability` and `tech_stack`. Raw failure capture (`raw_failures.jsonl`). Incremental writes to `analyses.jsonl`. `ycai resume` recovers from interrupted runs. `ycai dashboard` re-renders from existing artifacts at zero LLM cost.
26+
27+
**Real W26 results captured under `examples/output/`:**
28+
- 63.3% coverage of the 196-company batch (132 in upstream, 124 Tier A+B, 8 named drops, 4 Tier B with dead websites)
29+
- 118 of 124 high-confidence (95%) on the LLM enrichment, 0 schema failures, 0 hallucinated source URLs
30+
- **Top finding: 58% of high-confidence W26 companies build agents.** "W26 is the agentic batch" is now defensible with row-level evidence.
31+
32+
### Backlog status at release
33+
34+
| ID | Status | Note |
35+
|---|---|---|
36+
| B001 | resolved | yc-oss/api is sole source; ADR 0001 amended in PR #6 |
37+
| B002 | open | Cloudflare cache-headroom check on `yc-oss.github.io/api/*` |
38+
| B003 | open | Node 20 actions deprecated by 2026-06-02 — bump CI before then |
39+
| B004 | open | Calibrate `MIN_DESCRIPTION_CHARS` against borderline rows |
40+
| B005 | open | Name the missing-from-upstream W26 companies, not just count |
41+
| B006 | resolved | Schema-validation rate measured + tuned in PR #9 |
42+
| B007 | open | Depth=1 website crawl to recover `tech_stack` and `oss_posture` from `unknown` — biggest signal lever for v0.2 |
43+
| B008 | resolved | (rationale-cap root cause shipped in PR #9) |
44+
45+
### Tests
46+
47+
103 tests passing. Mypy `--strict` clean. CI runs ruff, mypy, pytest, detect-secrets, gitleaks, and a custom credential-pattern sweep on every PR.
48+
49+
[Unreleased]: https://github.com/RyanAlberts/yc-ai-pulse/compare/v0.1.0...HEAD
50+
[0.1.0]: https://github.com/RyanAlberts/yc-ai-pulse/releases/tag/v0.1.0

README.md

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,42 @@ A Chrome extension wraps two flows: *(a)* analyze the whole batch, *(b)* deep-di
2929

3030
| Phase | Surface | Status |
3131
|---|---|---|
32-
| 0 | Repo bootstrap, secrets hygiene, CI | 🟡 in progress |
33-
| 1 | CLI + dashboard | ⬜ planned |
32+
| 0 | Repo bootstrap, secrets hygiene, CI | ✅ shipped |
33+
| 1 | CLI + dashboard with anti-hallucination Layer 1 |**v0.1.0** |
3434
| 2 | `.pptx` + `.docx` reports | ⬜ planned |
3535
| 3 | Chrome extension | ⬜ planned |
3636

37-
See [BACKLOG.md](BACKLOG.md) for the working backlog and `docs/decisions/` for architecture decisions.
37+
See [CHANGELOG.md](CHANGELOG.md) for what 0.1.0 includes, [BACKLOG.md](BACKLOG.md) for the working backlog, and `docs/decisions/` for architecture decisions.
3838

39-
## Quickstart (Phase 1, when shipped)
39+
## Quickstart (v0.1.0)
4040

4141
```bash
42-
pipx install yc-ai-pulse # or: uv tool install yc-ai-pulse
43-
ycai run --depth quick # ~5 min on Claude Max subscription
44-
ycai dashboard runs/2026-*-*/ # opens dashboard.html in your browser
45-
```
42+
pipx install yc-ai-pulse # or: uv tool install yc-ai-pulse
4643

47-
By default `yc-ai-pulse` uses the [Claude Agent SDK](https://github.com/anthropics/anthropic-sdk-python) against your Claude Max subscription. To pay-per-run instead:
44+
# Coverage probe only (no LLM cost) — fetches the latest batch and shows
45+
# what's analyzable. Headline: % of YC batch covered, with the dropped
46+
# register naming every excluded company.
47+
ycai run-coverage --batch winter-2026 --yc-official-count 196
4848

49-
```bash
49+
# Full enrichment via your Claude Max subscription (~6 min on W26, ~free).
50+
# 95% high-confidence rate. Renders the dashboard with capability heatmap,
51+
# tech-stack and OSS-posture breakdowns. Refuses to write the dashboard
52+
# if any cited URL is dead.
53+
ycai run-coverage --batch winter-2026 --yc-official-count 196 --enrich
54+
55+
# Pay-per-token instead of subscription:
5056
export ANTHROPIC_API_KEY=sk-ant-...
51-
ycai run --depth full
57+
ycai run-coverage --batch winter-2026 --yc-official-count 196 --enrich
58+
59+
# Resume an interrupted run (quota wall, crash, network blip):
60+
ycai resume runs/2026-05-01-XXXXXX
61+
62+
# Re-render the dashboard from existing artifacts at zero LLM cost
63+
# (useful when the dashboard layout changes):
64+
ycai dashboard runs/2026-05-01-XXXXXX
5265
```
5366

54-
See [`docs/`](docs/) for the full guide.
67+
A real run on YC W26 is checked in as a working example: see [`examples/output/dashboard-w26-pr4-2026-05-01.html`](examples/output/dashboard-w26-pr4-2026-05-01.html). The full quality writeup is in [`docs/QUALITY_REPORT_W26.md`](docs/QUALITY_REPORT_W26.md).
5568

5669
## Anti-hallucination guarantees
5770

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
[project]
22
name = "yc-ai-pulse"
3-
version = "0.0.1"
3+
version = "0.1.0"
44
description = "Open-source YC batch analyzer — VC-style report and dashboard for the most recent Y Combinator batch."
55
readme = "README.md"
66
requires-python = ">=3.11"
77
license = { file = "LICENSE" }
88
authors = [{ name = "Ryan Alberts", email = "ryan.a.alberts@gmail.com" }]
99
keywords = ["ycombinator", "yc", "ai", "analysis", "vc", "research", "dashboard"]
1010
classifiers = [
11-
"Development Status :: 2 - Pre-Alpha",
11+
"Development Status :: 3 - Alpha",
1212
"Intended Audience :: Developers",
1313
"License :: OSI Approved :: MIT License",
1414
"Programming Language :: Python :: 3.11",

src/ycai/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
Phase 0 stub. Feature modules land in subsequent PRs.
44
"""
55

6-
__version__ = "0.0.1"
6+
__version__ = "0.1.0"

tests/test_smoke.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
def test_package_imports() -> None:
12-
assert ycai.__version__ == "0.0.1"
12+
assert ycai.__version__ == "0.1.0"
1313

1414

1515
def test_cli_version_subcommand() -> None:

0 commit comments

Comments
 (0)