Skip to content

Commit 32fcb89

Browse files
ci: cache scratch compilation targets
1 parent 2f41d50 commit 32fcb89

2 files changed

Lines changed: 11 additions & 0 deletions

File tree

.beads/issues.jsonl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
{"id":"openapi-generator-cv4","title":"Support exploded query parameters (GH #27)","description":"GH issue 27: query params with style=form, explode=true (OAS defaults) and object schemas currently map to Option\u003cimpl AsRef\u003cstr\u003e\u003e and are sent as one opaque string. Per OAS/RFC6570 form-explode, each object property must become its own query pair (?color=red). Fix: analyzer synthesizes/resolves a typed struct for object query params with form+explode semantics; client generator emits req.query(\u0026struct) so reqwest/serde_urlencoded serializes properties as individual pairs.","notes":"Implemented on branch issue-27-exploded-query-params, draft PR https://github.com/gpu-cli/openapi-to-rust/pull/28. Close when PR merges. Follow-ups: openapi-generator-anu (deepObject/explode=false/arrays), openapi-generator-0jz (server side).","status":"closed","priority":1,"issue_type":"feature","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-07-12T23:22:24Z","created_by":"James Lal","updated_at":"2026-07-13T04:21:19Z","started_at":"2026-07-12T23:22:49Z","closed_at":"2026-07-13T04:21:19Z","close_reason":"Released in v0.6.0 (PR #28)","dependency_count":0,"dependent_count":0,"comment_count":0}
3838
{"id":"openapi-generator-5q8","title":"DateStrategy::Time emits broken serde codec for time::Date/time::Time (GH #25)","description":"GitHub issue gpu-cli/openapi-to-rust#25: fields with format: date/time under DateStrategy::Time get #[serde(with = \"time::serde::iso8601\")], but that module only supports OffsetDateTime — generated code fails to compile. Fix: emit time::serde::format_description! helper codec modules (time_date_format / time_time_format) into generated code, and correct the time dep requirement features (serde alone doesn't even enable rfc3339).","notes":"Fixed in PR https://github.com/gpu-cli/openapi-to-rust/pull/26 (branch worktree-issue-25-time-date-serde). Close when PR merges.","status":"closed","priority":1,"issue_type":"bug","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-07-11T18:36:28Z","created_by":"James Lal","updated_at":"2026-07-11T18:57:02Z","started_at":"2026-07-11T18:36:45Z","closed_at":"2026-07-11T18:57:02Z","close_reason":"Fixed in PR #26, merged to main, released in v0.5.3","dependency_count":0,"dependent_count":0,"comment_count":0}
3939
{"id":"openapi-generator-dpd","title":"Hybrid string-or-object discriminated unions deserialize-fail","description":"When an anyOf/oneOf union contains a discriminator AND a non-object branch (e.g. string-enum like ToolChoiceOptions), the generator emits a tagged enum that cannot deserialize the string form. Real-world hit: OpenAI ToolChoiceParam returns 'auto' in Response.tool_choice, but generated type is #[serde(tag=\"type\")] enum with no untagged String variant. Need to fall back to #[serde(untagged)] when the union mixes string/scalar branches with tagged-object branches, OR add a String fallback variant before the tagged variants.","notes":"Live repro: `ToolChoiceParam` from openai.yaml line 52518. anyOf has 8 branches; the first (`ToolChoiceOptions`) is a string-enum (\"none\"|\"auto\"|\"required\"), the rest are objects with discriminator propertyName=type. Generator emits `#[serde(tag=\"type\")] enum ToolChoiceParam { ToolChoiceOptions(ToolChoiceOptions), ... }` which cannot deserialize the string \"auto\" because serde tries to read a \"type\" field from a JSON string. Fix: when an anyOf/oneOf branch is a non-object schema (string/number/etc), the generator must emit `#[serde(untagged)]` with the scalar branch first OR add a String variant before the tagged variants. Hit on real OpenAI Responses API `Response.tool_choice` field.","status":"closed","priority":1,"issue_type":"bug","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-05-10T23:47:35Z","created_by":"James Lal","updated_at":"2026-05-11T00:12:46Z","started_at":"2026-05-10T23:54:10Z","closed_at":"2026-05-11T00:12:46Z","close_reason":"Fixed in src/analysis.rs: (dpd) analyze_oneof_union now downgrades to untagged when any branch is non-object — verified live against OpenAI Response.tool_choice='auto' which now deserializes as ToolChoiceParam::ToolChoiceOptions(Auto). (bgo) merge_schema_into_properties now ORs in is_nullable_pattern() for allOf-merged props — verified live against OpenAI Response.incomplete_details which is now Option\u003cResponseIncompleteDetails\u003e and deserializes null cleanly. All 4 smoke tests (OpenAI+Anthropic, sync+stream) pass.","dependency_count":0,"dependent_count":0,"comment_count":0}
40+
{"id":"openapi-generator-tk1","title":"Cache CI scratch compilation targets","description":"Route install-smoke and spec-compile Cargo target directories into paths retained by the existing rust-cache steps so hosted runners reuse compiled dependencies across runs.","acceptance_criteria":"PR and scheduled spec compile jobs use a stable cached scratch target; install-smoke uses a stable cached install target; temporary packaging and generated fixture cleanup remain isolated; workflow syntax and relevant smoke commands pass.","status":"closed","priority":2,"issue_type":"task","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-07-26T22:35:49Z","created_by":"James Lal","updated_at":"2026-07-26T22:40:16Z","started_at":"2026-07-26T22:35:53Z","closed_at":"2026-07-26T22:40:16Z","close_reason":"CI now routes install-smoke and both spec-compile scratch targets through absolute paths under the rust-cache-managed root target tree. actionlint, targeted Anthropic spec compile (offline), and install smoke pass.","dependencies":[{"issue_id":"openapi-generator-tk1","depends_on_id":"openapi-generator-in6","type":"discovered-from","created_at":"2026-07-26T16:35:49Z","created_by":"James Lal","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
4041
{"id":"openapi-generator-in6.4","title":"Detect normalized server tag identifier collisions","description":"Distinct OpenAPI tags such as foo-bar and foo_bar normalize to identical Rust trait/router identifiers and generate duplicate items.","acceptance_criteria":"Server generation rejects or deterministically disambiguates colliding normalized tag identifiers with an actionable diagnostic; regression test covers colliding tags.","status":"closed","priority":2,"issue_type":"bug","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-07-26T21:55:43Z","created_by":"James Lal","updated_at":"2026-07-26T22:15:08Z","started_at":"2026-07-26T21:55:54Z","closed_at":"2026-07-26T22:15:08Z","close_reason":"Added deterministic normalized tag collision diagnostics with unit and integration coverage; full suite passes.","dependencies":[{"issue_id":"openapi-generator-in6.4","depends_on_id":"openapi-generator-in6","type":"parent-child","created_at":"2026-07-26T15:55:42Z","created_by":"James Lal","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
4142
{"id":"openapi-generator-in6.1","title":"Support YAML schema extension overlays","description":"README documents JSON/YAML schema_extensions, but analysis parses every overlay as JSON. Parse .yaml/.yml overlays consistently with specs and add merge/SSE regression coverage.","acceptance_criteria":"JSON and YAML overlays both deep-merge; a YAML text/event-stream overlay marks the operation streaming; malformed overlays report their file context.","status":"closed","priority":2,"issue_type":"bug","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-07-26T21:55:39Z","created_by":"James Lal","updated_at":"2026-07-26T22:15:05Z","started_at":"2026-07-26T21:55:53Z","closed_at":"2026-07-26T22:15:05Z","close_reason":"Implemented JSON/YAML/YML schema extension parsing with path-rich errors; 4 focused tests and full all-features suite pass.","dependencies":[{"issue_id":"openapi-generator-in6.1","depends_on_id":"openapi-generator-in6","type":"parent-child","created_at":"2026-07-26T15:55:39Z","created_by":"James Lal","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
4243
{"id":"openapi-generator-xov.8.2","title":"Phase 5: release docs and quality gates validation","description":"Independently verify the acceptance criteria and validation commands in planning/axum-validation/05-release-quality-gates.md; add missing regression coverage where necessary.","acceptance_criteria":"All scoped validation commands exit 0 and evidence is recorded in issue notes.","notes":"Validation evidence: cargo nextest run --all-features --no-fail-fast: 425/425 passed; cargo test --all-features including doctests passed; cargo clippy --all-features -- -D warnings passed; RUSTDOCFLAGS=-D warnings cargo doc --no-deps --all-features passed; generated dependency fragments compile; official openai-python 2.45.0 live base_url smoke passed; cargo fmt and git diff checks clean.","status":"closed","priority":2,"issue_type":"task","assignee":"James Lal","owner":"james@littlebearlabs.io","created_at":"2026-07-26T16:44:18Z","created_by":"James Lal","updated_at":"2026-07-26T18:23:25Z","started_at":"2026-07-26T18:23:23Z","closed_at":"2026-07-26T18:23:25Z","close_reason":"All scoped validation and release gates passed.","dependencies":[{"issue_id":"openapi-generator-xov.8.2","depends_on_id":"openapi-generator-xov.8","type":"parent-child","created_at":"2026-07-26T10:44:17Z","created_by":"James Lal","metadata":"{}"},{"issue_id":"openapi-generator-xov.8.2","depends_on_id":"openapi-generator-xov.8.1","type":"blocks","created_at":"2026-07-26T10:44:18Z","created_by":"James Lal","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0}

.github/workflows/ci.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ jobs:
119119
- uses: dtolnay/rust-toolchain@stable
120120
- uses: Swatinem/rust-cache@v2
121121
- run: scripts/install-smoke.sh
122+
env:
123+
# Keep cargo-install artifacts inside the target tree restored by
124+
# rust-cache; the script still isolates and removes its package root.
125+
CARGO_TARGET_DIR: ${{ github.workspace }}/target/install-smoke
122126

123127
msrv:
124128
runs-on: ubuntu-latest
@@ -136,6 +140,10 @@ jobs:
136140
spec-compile:
137141
if: github.event_name != 'schedule' && github.event_name != 'workflow_dispatch'
138142
runs-on: ubuntu-latest
143+
env:
144+
# Share scratch-crate dependencies across runs through rust-cache's
145+
# root-workspace target directory.
146+
SPEC_COMPILE_TARGET_DIR: ${{ github.workspace }}/target/spec-compile
139147
steps:
140148
- uses: actions/checkout@v4
141149
- uses: dtolnay/rust-toolchain@stable
@@ -147,6 +155,8 @@ jobs:
147155
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
148156
runs-on: ubuntu-latest
149157
timeout-minutes: 240
158+
env:
159+
SPEC_COMPILE_TARGET_DIR: ${{ github.workspace }}/target/spec-compile
150160
steps:
151161
- uses: actions/checkout@v4
152162
- uses: dtolnay/rust-toolchain@stable

0 commit comments

Comments
 (0)