Skip to content

ci: Skip Codecov upload when the uploader download fails - #4176

Closed
ntucker wants to merge 2 commits into
masterfrom
claude/project-thread-q41enb
Closed

ntucker wants to merge 2 commits into
masterfrom
claude/project-thread-q41enb

Conversation

@ntucker

@ntucker ntucker commented Oct 5, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by Nathaniel · project thread

Before: when uploader.codecov.io is unreachable, curl -Os exits 35 under bash -eo pipefail, so unit_tests-latest fails before any test runs, on every branch.

After: the download failure is logged and tests run normally; the coverage upload is skipped only when the uploader binary is missing.

How: curl -fsSO ... && chmod +x codecov || echo ..., and the upload is wrapped in if [ -x ./codecov ].

🤖 Generated with Claude Code

https://claude.ai/code/session_01QDVmN5NNnPCy3tAPkwgWpT


Generated by Claude Code


Note

Low Risk
CI-only change to the coverage upload path; test execution is unchanged and upload is simply skipped when the binary is missing.

Overview
Makes the latest React unit_tests job resilient when the Codecov uploader cannot be downloaded, so CI no longer fails before Jest runs.

The Codecov curl step now uses fail-soft flags (-fsSO, connect/time limits) and || echo ... so a network error does not abort the step under pipefail. Coverage tests still run and write lcov.info; upload runs only inside if [ -x ./codecov ], preserving token vs. no-token behavior when the binary is present.

Reviewed by Cursor Bugbot for commit 0a51706. Bugbot is set up for automated code reviews on this repo. Configure here.

A Codecov outage (curl exit 35) failed unit_tests-latest before any
tests ran. Download with -f and continue; upload only if the binary exists.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QDVmN5NNnPCy3tAPkwgWpT
@vercel

vercel Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
docs-site Ignored Ignored Preview Oct 5, 2026 1:06am UTC

Request Review

@changeset-bot

changeset-bot Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 0a51706

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@ntucker ntucker self-assigned this Oct 5, 2026

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at 4d75f4c.

I checked the failure modes: -f plus the && chmod chain means a partial or HTTP-error download never gets the execute bit, so [ -x ./codecov ] skips it, and the A && B || C form can't abort the step under -eo pipefail. Tests and lcov.info generation are unchanged, and the token/no-token upload branches are byte-for-byte the same inside the guard. Smallest fix that unblocks unit_tests-latest; nothing to change here.

Optional nit: the curl has no timeout. Today the host fails fast (TLS handshake, exit 35), but if it ever hangs instead the job sits until CircleCI's no-output timeout. --connect-timeout 10 --max-time 60 would cover that. Take it or leave it.

FOLLOW_UP (after merge, not this PR):

  • From here right now, uploader.codecov.io and cli.codecov.io both fail the TLS handshake, and api.codecov.io serves an expired certificate. That looks like more than a blip. Before investing in coverage tooling again, decide whether Codecov stays. If it does, move to the maintained path (the Codecov CircleCI orb or the Codecov CLI), which also verifies the binary's signature/SHA. The current flow runs an unverified latest binary with the token in env, which is the exact shape of Codecov's 2021 uploader compromise. If it doesn't stay, drop the step and the Codecov badges in the root and package READMEs together so they don't rot.
  • Once that's decided, this if [ -x ./codecov ] guard goes away with it, so no need to generalize it now.

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

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Took the timeout nit in 0a51706 (--connect-timeout 10 --max-time 60), because a hung download would block every PR the same way. I sent the Codecov keep/replace/remove decision to the project's work queue as its own follow-up, which also removes this guard.


Generated by Claude Code

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at 0a51706.

The only change is --connect-timeout 10 --max-time 60 on the uploader curl. A timeout exits non-zero (28), so chmod never runs and any partial file left by -O stays non-executable, which means the [ -x ./codecov ] guard still skips it. Nothing else changed; the Codecov keep/replace/remove FOLLOW_UP stands as tracked.

ntucker pushed a commit that referenced this pull request Oct 5, 2026
Ported from #4176 so unit_tests-latest is not blocked by the codecov
uploader outage; it no-ops once #4176 lands on master.

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

@ntucker ntucker left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 0a517068e15b4c790b9f98c94253d652f3211da8. No actionable correctness findings. Traced the curl failure/timeout → skipped chmod → non-executable partial download → skipped upload path and confirmed coverage test failures still propagate under -e. The token/no-token upload paths retain their behavior. Validation: diff and surrounding CI configuration review; I did not run CircleCI or contact the uploader.

ntucker pushed a commit that referenced this pull request Oct 5, 2026
Same change as #4176 so unit_tests-latest isn't failed by a Codecov
uploader download outage. No-ops once #4176 merges.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vgk3hcd3isv6cRrgAuADg4
ntucker added a commit that referenced this pull request Oct 5, 2026
* docs(website): Restyle playground chrome and diff highlighting

- Editor tab bar: selected tab joins the code panel with a primary top edge;
  light mode bar matches the Live Preview header
- EndpointPlayground: one dark header style, "Usage" label for the calling
  code, status pill (e.g. "200 OK")
- Tighter Store toggle letters; base styles for preview buttons and inputs
- DiffEditor: highlight only changed characters; slim Before/After labels
  aligned with each pane

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

* docs(website): Simplify playground chrome styles

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

* docs(website): Limit preview control skin to unclassed elements

Keeps DesignSystem rt-* inputs and vote arrow buttons on their own chrome.

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

* fix(website): Build previews whose previous deploy is the commit itself

Vercel can report the commit being built as VERCEL_GIT_PREVIOUS_SHA on a
preview branch with no successful preview yet. Diffing HEAD against itself
is empty, so every new site PR's preview was skipped. Ignore that value and
fall back to the merge-base with master.

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

* Revert "fix(website): Build previews whose previous deploy is the commit itself"

The preview for that commit was still skipped, so this was not the cause.

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

* fix(website): Stop skipping every site preview on Vercel

Vercel logged "skip — preview changes vs master" for site PRs. Its clone
can carry a master ref at the commit being built, so the merge-base was HEAD
and the diff was empty. Always fetch master, never treat a ref equal to HEAD
as master, and log the base sha.

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

* fix(website): Fetch master once so deepen() keeps its history

Refetching master with --depth=80 inside upstream() undid deepen(), so PRs
forked more than 80 commits behind master fell back to a full build. Fetch
once before the preview checks; upstream() only looks refs up. Adds a
file:// shallow-clone test with a far fork point and a master ref at HEAD.

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

* fix(website): Deepen master in its own fetch

Under git 2.55 a single fetch of the branch and master with --deepen
leaves master at its earlier depth, so forks far behind master found no
merge base and always built.

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

* fix(website): Give the preview side the editor's bar colors

The live preview header and Store toggle kept the neutral grey while the
editor bar turned slate, so dark mode showed two clashing bands. All
playground headers now share the bar color, the dark preview body takes a
slate tint, and the line between the tab rows is gone.

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

* fix(website): Tone dark playground chrome down to near-neutral grey

The slate bars and preview tint read too blue in dark mode. Keep the hue
but drop saturation so the chrome sits close to the site's neutral greys.

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

* refactor(website): Drop bar colors the base header rule already sets

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

* fix(website): Desaturate the endpoint playground edge to match its bar

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

* fix(website): Use master's neutral greys for dark playground chrome

Dark mode bars and the preview body go back to the Infima greys master
used, now shared by every playground header. Only the always-dark
endpoint playground keeps its own bar tokens.

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

* ci: Skip Codecov upload when the uploader download fails

Ported from #4176 so unit_tests-latest is not blocked by the codecov
uploader outage; it no-ops once #4176 lands on master.

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

* fix(website): Restore full-contrast text in playground header bars

Header and tab labels used a muted grey and read faintly; they now use
the content color master used, and the endpoint playground's labels are
opaque.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Closing: #4174 merged with this exact change, so .circleci/config.yml on master is now identical to this branch.


Generated by Claude Code

@ntucker ntucker closed this Oct 5, 2026
ntucker pushed a commit that referenced this pull request Oct 5, 2026
Ported from #4176 (already on master via #4174) so unit_tests-latest isn't
blocked by the Codecov uploader outage; it no-ops once this branch
reaches master.

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

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Sol review bot (GPT-6.1 Sol, High): I posted this review of commit 0a517068e15b.

ntucker added a commit that referenced this pull request Oct 5, 2026
* docs: Add social card generator and v0.19 card

Renders static/img/social/X.Y-card.png from a release post's title,
description and summary bullets, matching the v0.16/v0.18 card style.

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

* docs: Use the site's bundled fonts for social cards

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

* docs: Accept CRLF blog posts in social card script

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

* internal: Port #4176 Codecov uploader fallback

Same change as #4176 so unit_tests-latest isn't failed by a Codecov
uploader download outage. No-ops once #4176 merges.

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

* docs: Show headline feature code on social cards

The card's right side now shows the headline feature's Before/After code
(or each new feature's first code block) plus any 'Nx faster' claim, and
falls back to the What's new list when the post has no code.

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

* Pick each social card feature's chart, diagram, image or code, and theme the background

Feature sections can show a PerfChart or xychart as bars, a mermaid diagram,
an /img image, or code; {/* card */} before a block picks it. The background
motif (speed, network, grid or flow) follows the release's title.

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

* List mermaid as a website devDependency for social card diagrams

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

* Simplify social card script

Parse frontmatter with Docusaurus's own parser (drops js-yaml), match the
mermaid range @docusaurus/theme-mermaid uses, and load mermaid with
addScriptTag instead of inlining it into the page. Each feature window gets
its own speedup chip, {/* card */} marks the next visual however far after
it, background themes carry their own draw function, and the fitter starts
from the CSS font sizes. Multi-window diagrams and images are capped in
height so they don't cover the window above.

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

* Match bullets to headings without an explicit {#id} by their generated anchor

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

* Generate heading anchors with Docusaurus's own slugger

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

* Parse heading ids with Docusaurus and slug every heading level like it does

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
ntucker added a commit that referenced this pull request Oct 6, 2026
)

* docs(skills): Generate skill references from the docs

Skill references were symlinks to docs MDX, so agents saw raw :::react/:::vue
blocks, never saw imported partials (e.g. the install code in
_installation.mdx), and Vue skills shipped React-only pages.

Each skill now lists its docs in references.json; `yarn build:skills`
renders them per framework into plain markdown (website/framework-docs/
docsToMarkdown.mjs, reusing remarkFramework.js and Docusaurus' MDX
preprocessing), writing <name>.vue.md where the Vue page differs. A
`skills` workflow fails on drift, and Cursor/Claude Code edit hooks
regenerate automatically.

Also fixes docs this surfaced: :::react blocks whose nested admonition had
more colons rendered a stray ":::" on React pages, and several relative
links in rest docs pointed at missing pages. The Vue testing skill now
imports from @data-client/vue/test and no longer ships the React-only
hooks testing guide.

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

* docs(skills): Add skills-sync rule and dead reference link check

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

* fix(skills): Generate references from docs only, keep <name>.md for any framework

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

* ci(skills): Check on lockfile bumps and master; reject symlinks and unmentioned variants

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

* docs(skills): Bundle protocol setup guides into data-client-setup

references.json can now list `skills` to bundle. `yarn build:skills`
copies each bundled skill's SKILL.md body to references/<skill>.md and
its references and scripts under references/<skill>/, so
data-client-setup works without the REST, GraphQL or endpoint setup
skills installed. The --check drift check covers the copies.

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

* internal(skills): Simplify skill bundling

Reuse the front matter regex, memoize skill generation, rewrite every
relative link in a bundled SKILL.md, and only rerun the edit hook for
skills another skill bundles.

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

* docs(skills): Word setup guides to read right when bundled

Setup skills describe themselves as guides used after provider setup,
since data-client-setup now carries them. The bundler keeps a script's
shebang first and leaves links in fenced code alone.

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

* internal(skills): Drop duplicated comment

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

* internal(skills): Regenerate bundles when the axios codemod changes

data-client-rest-setup symlinks its codemod from website/static/codemods,
so the skills check and edit hook now watch that folder too.

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

* internal(skills): Regenerate references once per agent turn instead of per edit

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

* docs(skills): Regenerate references for master's Vue concept docs

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

* internal(skills): Tell the agent about skill problems at end of turn; survive stale stamps

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

* internal(skills): Regenerate references before agent pushes instead of every turn

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

* docs(skills): Don't require data-client-rest before REST setup

data-client-setup bundles the REST setup guide but not data-client-rest,
so the guide now points at its own RestEndpoint and resource references
and treats data-client-rest as optional.

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

* ci: Skip Codecov upload when the uploader download fails

Ported from #4176 (already on master via #4174) so unit_tests-latest isn't
blocked by the Codecov uploader outage; it no-ops once this branch
reaches master.

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

* internal(skills): Follow git symlinks in checkouts without symlink support

With core.symlinks=false, git writes the axios codemod symlink as a file
holding its target path, so bundling copied the path instead of the
codemod. Resolve paths git tracks as symlinks either way.

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

* Move bundled-skill push inputs into pre-push.js

Master folded build-skills.js into pre-push.js; the merge had kept the old
file, which no hook runs. Bundled skills' files and the codemods they
symlink now trigger regeneration from pre-push.js.

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

* Simplify skill bundling: reuse index.js walk and FM, skip generated files before reading

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

* Add GraphQL and custom async rows to setup's skills table

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

* Simplify skillReferences: generateSkill reads its own manifest, one git helper

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
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