Conversation
`danglesIn` kept a `$ref` whenever its location still existed in the
output, but the 3.1 → 3.0 converter writes new values over some converted
keywords: `const` replaces the `enum` beside it, a null-only `type` whose
`enum` excludes null sets `not: {}`, and `"null"` in `type` sets
`nullable: true`. A `$ref` into the original keyword was kept and resolved
to the replacement, e.g. a root `not: {$ref: '#/properties/a/not'}` came
out rejecting everything.
Such writes now go through `replace()`, which tags the key on its parent.
`danglesIn` treats a tagged key like a removed one, so the `$ref` is
inlined with the converted original. This replaces the value-based
`placeholder()` tag, which only `items` used and which could not mark an
array entry or a primitive.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pgu7SuAf7FD4Muuwafi9z5
Only four key names are ever replaced, so a WeakSet per name avoids a Set per tagged object, drops the hand-written object guard, and lets `danglesIn` check the tag where it steps into the output, leaving the array-length check as it was. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pgu7SuAf7FD4Muuwafi9z5
|
your Pullfrog Router balance is empty, and this repo has no provider key to fall back on, so the agent never ran. To fix, any one of: add a payment method or top up your Router balance · add a provider API key (GitHub Actions secret or Pullfrog secret) · switch this repo to a free model. Top up Router → · Model settings → · Setup docs → · Ask in Discord → |
…2h6o85 # Conflicts: # packages/downgrader/src/shared.ts # packages/downgrader/src/v3.1-to-v3.0.ts
|
your Pullfrog Router balance is empty, and this repo has no provider key to fall back on, so the agent never ran. To fix, any one of: add a payment method or top up your Router balance · add a provider API key (GitHub Actions secret or Pullfrog secret) · switch this repo to a free model. Top up Router → · Model settings → · Setup docs → · Ask in Discord → |
|
The No change in this PR can fix it. It needs a Pullfrog top-up or a provider key in the repo's secrets. I'm not re-running it, because it would fail on the same billing error. The repo's own CI ( Generated by Claude Code |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
…2h6o85 # Conflicts: # packages/downgrader/src/v3.1-to-v3.0.ts
|
your Pullfrog Router balance is empty, and this repo has no provider key to fall back on, so the agent never ran. To fix, any one of: add a payment method or top up your Router balance · add a provider API key (GitHub Actions secret or Pullfrog secret) · switch this repo to a free model. Top up Router → · Model settings → · Setup docs → · Ask in Discord → |

Problem
danglesInkeeps a$refwhile its location still exists in the output. It treated only a missing location, or theitems: {}placeholder, as gone. But 3.1 → 3.0 writes new values over some converted keywords, so a$refinto one of them was kept and resolved to the new value:amatches nothing, so the converter gives itnot: {}in place ofnot: { type: 'string' }.not1{ type: 'string' }, through the$refmain{ $ref: '#/properties/a/not' }, which now finds{}{ type: 'string' }, inlinedThe same happens in
components.schemas, and for two more keywords:constreplaces theenumbeside it. The newenumhas the same length, so the index check missed it, and a$reftoenum/0got theconstvalue."null"intypesetsnullable: trueover a 3.0nullable: false.Fix (
packages/downgrader/src/shared.ts)replace(target, key, value)writes a value that stands in for the source's instead of converting it, and tagskeyontarget, with oneWeakSetper key name.danglesIntreats a tagged key like a removed one, so the$refis inlined with the converted original.not: {},enumfromconst,nullable: true, and theitems: {}placeholder now go throughreplace(). It replacesplaceholder(), which tagged the value and so could not mark an entry inside it, such asenum/0, or a primitive, such astrue.Tests
schema/references.test.ts: a$refto each replaced keyword, and to anenumreplaced by a nullconstand then narrowed by a null-onlytype.spec/components.test.ts: thenotcase incomponents.schemas.main.pnpm test(697 passed),pnpm lintandpnpm type:checkare clean.Known limits
$ref:required: trueover a path parameter'srequired: false,minimumormaximumover a value that is not a number, and XMLattributeorwrappedoverfalse.🤖 Generated with Claude Code
https://claude.ai/code/session_01Pgu7SuAf7FD4Muuwafi9z5