Skip to content

chore(main): release 0.18.0 - #122

Open
kj-podonos wants to merge 1 commit into
mainfrom
release-please--branches--main--components--onepin
Open

kj-podonos wants to merge 1 commit into
mainfrom
release-please--branches--main--components--onepin

Conversation

@kj-podonos

@kj-podonos kj-podonos commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

🤖 I have created a release beep boop

0.18.0 (2026-10-01)

Features


This PR was generated with Release Please. See documentation.

podonos-eunseo added a commit that referenced this pull request Oct 1, 2026
… drift (#126)

## Problem

`.github/workflows/regen.yml` has been failing on every dev run since
9/28 — 18 of the last 20 runs. The two that passed were prod runs, which
skip the failing step entirely. It was never flaky: **success and
failure were two different code paths, not two outcomes of one check.**

```
dev  (runs the guards)   18 runs → failure 18
prod (skips the guards)   2 runs → success 2
```

Underneath that, a second and larger hole: **`ci.yml` never ran
`tests/build` at all.** pytest's default `norecursedirs` carries the
bare pattern `build`, which matches by basename, so recursing from
`testpaths = ["tests"]` skipped the directory whole. `uv run pytest -q`
collected 515 tests and not one came from there.

So every guard on the Fern regen pipeline — the `.fernignore` check, the
README sync, the CLI↔SDK contract — has never gated a PR. Guards ran
where no PR existed (dev), and PRs existed where no guards ran (prod).
The comment in `regen.yml` justifying the skip ("ci.yml runs the very
same `tests/build` on the regen PR") was simply not true.

That let a red guard merge. #119 added
`test_run_input_reference_matches_flattened_signatures` **and** was red
on it, with all 22 checks green. The defect it caught is real:
`reference.md` documents a `request` parameter on methods whose
generated clients take flattened kwargs, so following the docs raises
`TypeError`.

```python
client.workflows.estimate_workflow(workflow_id=..., script_text="hi")              # works
client.workflows.estimate_workflow(workflow_id=..., request=WorkflowRunStartIn())  # TypeError
```

`reference.md` ships in the PyPI wheel, so that lands in `site-packages`
for every installer.

## Solution

**Make the guards actually run** (`656a655`). Drop `build` from
`norecursedirs`, keep the `./build/` artifact tree out by path with
`--ignore=build`. Collection goes **515 → 937**.
`tests/unit/test_collection.py` asserts the behaviour from a separate
pytest process, because the whole failure was one word in a config file
going unnoticed.

**Generalize the contract check.** The three hand-named assertions
become a parse of all 90 documented methods, compared against
`inspect.signature` in both directions. It finds **six** mismatches, not
three — `workspace_members.update_member_role`, `update_invite_role`,
and `workflows.runs_summary` (`from` documented, `from_` generated, so
the documented call isn't even syntactically valid) were wrong the same
way and nothing said so. Known generator defects go in
`_REFERENCE_DEFECTS` with reasons, same contract as
`_INTENTIONALLY_UNEXPOSED`: the regen that fixes the generator deletes
the excuse.

**Stop blocking, start reporting** (`77c1b2e`). Guards run on both paths
and fail neither. The verdict is posted onto the PR as a comment —
including when clean, since "ran" being indistinguishable from "skipped"
is what hid all of this. The hard gate stays the shell guard (clobbered
`_cli/`, bare client); the merge gate is `ci.yml`.

**Autofix the one mechanical class.** SDK→CLI drift — a generated param
no CLI flag reaches — is fully specified by the failing test, so
`claude-code-action` adds the `Opt(...)`, regenerates the README block
and manifest snapshot, adds a test, and pushes to the PR branch.
Explicitly barred from allowlisting a guard, weakening a test, or
touching generated files; raises the `Cmd(gate=)` question for a human
instead of deciding it. Reference mismatches and renamed methods are out
of scope — the former is unfixable in-repo anyway. Authenticates with
the org-level `CLAUDE_CODE_OAUTH_TOKEN` (already visible to this repo,
so no secret to add; subscription billing rather than API).

**Close superseded regen PRs.** Each regen is a whole-SDK snapshot of
one spec commit, not an increment, so #123/#124/#125 open at once is
three ways to merge the SDK backwards. Scoped to the label, the
`fern-regen/` prefix, and a number below the PR just opened.

## Verification

- `pytest -q` → **935 passed, 2 skipped** (937 collected, up from 515);
`ruff` clean; `mypy` clean; coverage 95.39%
- Mutation-checked the new contract test: emptying `_REFERENCE_DEFECTS`
reds exactly the 6 known defects with actionable messages; simulating a
generator fix reds the stale-allowlist guard
- Ran the new guards against the real open regen PRs in throwaway
worktrees — **#123: 421 passed; #125: 421 passed, 1 failed**
(`voices.list` gained `provider_voice_id`, which is the drift alarm
working as designed)
- Verified `./build/` artifacts stay uncollected, and `pytest
tests/build` still works as an explicit path
- All 14 shell blocks in `regen.yml` pass `bash -n`; dry-ran the
supersede and comment logic against live PR data with `gh pr close`
stubbed — new PR #126 closes #123/#124/#125 and leaves #122
(release-please) alone; a PR-update scenario (#124) closes only #123 and
never the newer #125

## Follow-ups, not in this PR

- **Report the generator defect to Fern.** `fern/generators.yml` pins
the generator to `latest`, so this moved without a PR — worth pinning
- **`provider_voice_id` is a product decision**: expose
`--provider-voice-id`, or record it as intentionally unexposed. It can't
be allowlisted on main today — the param isn't in main's SDK yet, so the
entry would be stale on arrival. It belongs in #125

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kj-podonos
kj-podonos force-pushed the release-please--branches--main--components--onepin branch from 913f6ba to 6ec19bf Compare October 1, 2026 08:50

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant