Skip to content

[DOCS] Add a skill for the spec sync and regeneration pipeline - #37

Merged
johnyrahul merged 2 commits into
mainfrom
docs/spec-upgrade-skill
Sep 8, 2026
Merged

johnyrahul merged 2 commits into
mainfrom
docs/spec-upgrade-skill

Conversation

@chandrasekharan-zipstack

Copy link
Copy Markdown
Collaborator

What

Adds .claude/skills/spec-upgrade/SKILL.md — the ordered sequence for picking up a new LLMWhisperer spec, for a future maintainer or agent with no prior context.

Nothing notifies this repo when specs/llmwhisperer.json moves upstream, and the upgrade that follows is ordered:

  1. copy the spec byte-for-byte from the upstream commit
  2. move SPEC_SOURCE_REV in tools/gen_sdk.sh in the same commit — without it, a stale copy and a current one both report clean
  3. ./tools/gen_sdk.sh
  4. review with git add -N first, so a newly generated file counts
  5. expose anything new through client_v2.py, never the generated tree
  6. tox, leaving the tests/baseline/ parity reference where it is

Why

The pipeline is real and undocumented in-repo. It also writes down the two things about the api-surface gate that are not guessable from the workflow alone: it names modules rather than the package because the generated subpackage is public to griffe — so adding, deleting or renaming a public module means editing that list in the same PR — and it cannot see what goes out on the wire, which tests/unit/compat_test.py owns.

No version numbers, dates or codenames, so it should not go stale.

Notes

Docs only — no code, no CI changes.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CSm32dsxD56PkKENgav3Mn

Nothing notifies this repo when the service's spec moves, and the upgrade that
follows is ordered: copy the spec, move SPEC_SOURCE_REV with it, regenerate,
review the generated surface with `git add -N` so new files count, then expose
anything new through the facade. That sequence lived only in the heads of the
people who built it.

Records it as a repo-local skill, pointing at the existing scripts and gates
rather than restating them. Calls out the two things about api-surface that are
not guessable: it names modules rather than the package because the generated
subpackage is public to griffe, so adding or renaming a public module means
editing that list; and it cannot see the wire, which compat_test.py owns.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSm32dsxD56PkKENgav3Mn
@greptile-apps

greptile-apps Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds a reusable specification-upgrade skill documenting the ordered workflow for synchronizing the upstream OpenAPI specification and regenerating the Python client.

  • Covers spec provenance, regeneration, generated-code review, facade updates, and complete test execution.
  • Explains the responsibilities and limitations of the sdk-drift and api-surface gates.
  • Documents release-version selection and downstream follow-up.
  • The previously reported ambiguity between the full test suite and the unit-only shortcut has been corrected.

Confidence Score: 5/5

The documentation-only change appears safe to merge.

No actionable new issue remains, and the manually resolved previous finding is fully addressed by explicitly identifying the unit command as an offline subset rather than a substitute for tox.

Important Files Changed

Filename Overview
.claude/skills/spec-upgrade/SKILL.md Documents the complete spec synchronization, SDK regeneration, validation, compatibility, versioning, release, and downstream-update workflow without introducing an actionable issue.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Copy upstream specification byte-for-byte] --> B[Update SPEC_SOURCE_REV]
    B --> C[Run tools/gen_sdk.sh]
    C --> D[Mark generated files intent-to-add]
    D --> E[Review generated API changes]
    E --> F[Expose new surface through client_v2.py]
    F --> G[Run tox]
    G --> H{Caller-facing compatibility}
    H -->|Breaking| I[Select major release]
    H -->|New behavior| J[Select minor release]
    H -->|Compatible fix| K[Select patch release]
Loading

Reviews (2): Last reviewed commit: "docs: say what tox covers that pytest te..." | Re-trigger Greptile

Comment thread .claude/skills/spec-upgrade/SKILL.md
@chandrasekharan-zipstack chandrasekharan-zipstack changed the title docs: add a skill for the spec sync and regeneration pipeline [DOCS] Add a skill for the spec sync and regeneration pipeline Sep 8, 2026
…he major bump

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSm32dsxD56PkKENgav3Mn
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_usage\_info}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_v2}}$$ $$\textcolor{#23d18b}{\tt{9}}$$ $$\textcolor{#23d18b}{\tt{9}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_highlight}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_v2\_url\_in\_post}}$$ $$\textcolor{#23d18b}{\tt{4}}$$ $$\textcolor{#23d18b}{\tt{4}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_webhook}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail\_not\_found}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_line\_splitter\_strategy\_reaches\_service}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_register\_webhook}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_webhook\_details}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail\_success}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail\_not\_found}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_json\_string\_response\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_json\_string\_response\_202}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_invalid\_json\_response\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_invalid\_json\_response\_202}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_default\_word\_confidence\_threshold}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_custom\_word\_confidence\_threshold}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_sends\_corrected\_param\_names}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_sends\_page\_separator\_under\_both\_spellings}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_defaults\_when\_no\_param\_passed}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_deprecated\_page\_seperator\_is\_forwarded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_deprecated\_filename\_is\_forwarded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_deprecated\_line\_spitter\_strategy\_is\_ignored}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_rejects\_both\_spellings}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_429}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_500}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_retry\_on\_400}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_retry\_on\_401}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retries\_exhausted\_raises}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retries\_exhausted\_500\_returns\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_disabled}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_post\_uses\_min\_of\_api\_timeout\_and\_wait\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_post\_uses\_wait\_timeout\_when\_smaller}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_send\_request\_deadline\_caps\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_send\_request\_deadline\_stops\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_request\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{14}}$$ $$\textcolor{#23d18b}{\tt{14}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_auth\_header\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_wire\_headers\_match\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_custom\_headers\_override\_the\_transport\_defaults}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_case\_variant\_custom\_header\_overrides\_rather\_than\_duplicates}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_case\_variant\_key\_override\_does\_not\_also\_send\_the\_real\_key}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_custom\_headers\_still\_reach\_the\_request}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_headers\_changed\_after\_the\_first\_call\_reach\_the\_next\_one}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_transport\_can\_be\_released\_and\_reused}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_closing\_an\_unused\_client\_is\_not\_an\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_url\_mode\_does\_not\_put\_the\_url\_on\_the\_query\_string}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_upload\_mode\_does\_not\_send\_url\_in\_post}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_booleans\_are\_sent\_the\_way\_the\_previous\_transport\_sent\_them}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_send\_only\_covers\_every\_parameter\_whisper\_builds}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_an\_unrequested\_parameter\_is\_not\_sent}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_requested\_parameter\_is\_sent}}$$ $$\textcolor{#23d18b}{\tt{6}}$$ $$\textcolor{#23d18b}{\tt{6}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_undeclared\_parameters\_are\_refused}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_operation\_sends\_a\_spec\_default\_the\_client\_never\_set}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_return\_value\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{84}}$$ $$\textcolor{#23d18b}{\tt{84}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_error\_handling\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{70}}$$ $$\textcolor{#23d18b}{\tt{70}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_poll\_loop\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_transport\_errors\_are\_translated}}$$ $$\textcolor{#23d18b}{\tt{13}}$$ $$\textcolor{#23d18b}{\tt{13}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_httpx\_failure\_escapes\_untranslated}}$$ $$\textcolor{#23d18b}{\tt{19}}$$ $$\textcolor{#23d18b}{\tt{19}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_translation\_decides\_what\_gets\_retried}}$$ $$\textcolor{#23d18b}{\tt{6}}$$ $$\textcolor{#23d18b}{\tt{6}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_connect\_timeout\_is\_still\_a\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_translated\_errors\_keep\_the\_original\_cause}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_transport\_failures\_are\_still\_retried}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_retried\_upload\_replays\_the\_whole\_body}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_redirects\_are\_followed}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_request\_timeout\_reaches\_the\_transport}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_deadline\_still\_caps\_each\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_deadline\_still\_stops\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_malformed\_api\_key\_is\_not\_reported\_as\_a\_network\_failure}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_malformed\_base\_url\_is\_translated}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_call\_on\_a\_closed\_transport\_raises\_the\_documented\_exception}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_transport\_is\_built\_once\_under\_concurrent\_first\_calls}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_acquiring\_the\_transport\_never\_returns\_a\_cleared\_handle}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_stream\_upload\_is\_sent\_streaming\_and\_read\_back}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_body\_with\_no\_declared\_charset\_is\_read\_as\_utf\_8}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_encoding\_is\_applied\_to\_a\_real\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_constructor\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_public\_methods\_are\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_deprecated\_parameter\_resolver\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_highlight\_rect\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_class\_attributes\_are\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_policy\_attributes\_are\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_defaults\_match\_a\_default\_constructed\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_every\_wrapped\_operation\_is\_covered}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_every\_operation\_declares\_the\_failures\_callers\_actually\_hit}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_baseline\_is\_the\_released\_client\_unmodified}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{309}}$$ $$\textcolor{#23d18b}{\tt{309}}$$

@johnyrahul
johnyrahul merged commit b105c7b into main Sep 8, 2026
4 checks passed
@johnyrahul
johnyrahul deleted the docs/spec-upgrade-skill branch September 8, 2026 11:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants