Skip to content

chore: promote CLI v5.8.0 - #228

Merged
finalerock44 merged 12 commits into
promote/cli-5.8.0from
dev
Oct 16, 2026
Merged

finalerock44 merged 12 commits into
promote/cli-5.8.0from
dev

Conversation

@finalerock44

Copy link
Copy Markdown
Contributor

What & why

Type of change

  • fix — bug fix
  • feat — new feature
  • perf — performance improvement
  • refactor — code change that's neither a fix nor a feature
  • docs — documentation only
  • chore / ci / build / test — tooling, no user-facing change
  • Breaking change (title has ! or PR notes a BREAKING CHANGE:)

Checklist

  • PR title follows the Conventional Commits format (see comment above)
  • pnpm lint passes
  • pnpm typecheck passes
  • pnpm build passes
  • I have not bumped the version or edited CHANGELOG.md (release-please handles this)
  • I have signed the CLA (the bot will prompt on first contribution)
  • Docs / README.md / STYLE_GUIDE.md updated if behaviour or output changed

How to test

github-actions Bot and others added 12 commits October 7, 2026 13:26
The dcd cloud poll loop fetched every result row in full, including
result_files and its main_log, every 20-60s, even when nothing had
changed. It now asks for ?view=summary, which an older API ignores
(returning the full rows, a superset), and revalidates with the last
ETag so an unchanged poll is an empty 304.

The conditional request also sends Cache-Control: max-age=0. Without
it undici appends Cache-Control: no-cache, and Express then never
answers 304. Only a non-empty result set with an ETag is cached; the
200 error envelope and empty sets are not.
chore: merge production into dev after 5.7.1
feat(cloud): add --priority flag for within-org run ordering (dcd#1581)

--priority low|normal|high (default normal) reorders only the org's own
queued runs across its concurrency pool, for every flow in the upload. It
never moves the org ahead of other customers. Runs queued longer than 6
hours are promoted first, so low runs are not starved, and retries keep
the run's priority.

Sent as a top-level submission field (not inside config), and only when
it is not normal, so the default path and older APIs see no change. Also
exposed on the dcd_run_cloud_test MCP tool.
Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 76.0.0 to 77.0.0.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](sindresorhus/eslint-plugin-unicorn@v76.0.0...v77.0.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-unicorn
  dependency-version: 77.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the minor-and-patch group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) | `1.32.0` | `1.32.1` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) | `2.117.2` | `2.117.3` |
| [js-yaml](https://github.com/nodeca/js-yaml) | `5.4.2` | `5.4.3` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.6.4` | `26.6.5` |
| [prettier](https://github.com/prettier/prettier) | `3.9.9` | `3.9.10` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.0` | `8.71.1` |


Updates `@modelcontextprotocol/sdk` from 1.32.0 to 1.32.1
- [Release notes](https://github.com/modelcontextprotocol/typescript-sdk/releases)
- [Commits](modelcontextprotocol/typescript-sdk@1.32.0...1.32.1)

Updates `@supabase/supabase-js` from 2.117.2 to 2.117.3
- [Release notes](https://github.com/supabase/supabase-js/releases)
- [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md)
- [Commits](https://github.com/supabase/supabase-js/commits/v2.117.3/packages/core/supabase-js)

Updates `js-yaml` from 5.4.2 to 5.4.3
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](nodeca/js-yaml@5.4.2...5.4.3)

Updates `@types/node` from 26.6.4 to 26.6.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `prettier` from 3.9.9 to 3.9.10
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.9.9...3.9.10)

Updates `typescript-eslint` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@modelcontextprotocol/sdk"
  dependency-version: 1.32.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@supabase/supabase-js"
  dependency-version: 2.117.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: js-yaml
  dependency-version: 5.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@types/node"
  dependency-version: 26.6.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: prettier
  dependency-version: 3.9.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ci(claude-review): keep the review in the foreground and fail if nothing is posted

Headless runs can background the bug-review subagents and end the turn
to 'wait' for them. In -p mode that ends the session, so no comment is
posted and the job still goes green. Port of devicecloud-dev/dcd#1536.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: finalerock44 <77282157+finalerock44@users.noreply.github.com>
)

The API's default Android API level moves from 34 to 36 on 19 October 2026
(the device stays Pixel 7), so a device-only request is now checked
against 36. `--android-device pixel-10` on its own is accepted, as the API
accepts it.

pixel-7 / API 36 has no Google Play image, and the API does not apply the
global default to a Play request that omits one half: it picks the value
that makes the pair a Play cell. The check now fills the omitted half the
same way, so `--google-play --android-device pixel-8` or
`--google-play --android-api-level 36` is no longer refused here when the
API would run it. A device with no Play image, or a level no Play device
offers, is still refused with the same messages.
…ing is posted (#224)

Port of dcd's fixes. Headless runs ended the turn early (backgrounded
reviewers, denied tools), so no comment was posted and the job still went
green. PR #223's review stopped after 10 turns with 3 permission denials.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(cloud): re-send a flow submit whose response was lost

When the API stalls, a `dcd cloud` submit can wait 300 s and then get a
502 from Railway's edge. The CLI can't tell whether the run was created,
so it failed the command even when the run went ahead (dcd#1617).

The API now answers a repeat of the same submit (same body, same upload
id) with the run it already created, or a 409 while that run is still
being created, and never creates a second run or charge. So the CLI
sends a submit again while its outcome is unknown:

- submitWithRetry (services/flow-submit.service.ts) re-sends the same
  body on a 409/500/502/503/504 or on any transport failure (network
  error, timeout, a body cut off), waiting 2 s and then up to 30 s
  between attempts, about three minutes in all. The flow zip is not
  uploaded again.
- Each attempt has a 90 s timeout, well under the 300 s at which
  Railway's edge cuts it with a 502.
- The multipart fallback for an API without the client-direct endpoint
  runs only when the first attempt 404s or 405s. A 404 after a retry
  comes from an API that took an earlier attempt.
- `dcd cloud` prints one warning per retry (not in --json); dcd-mcp logs
  to stderr. Both record `submit_attempts` on the lifecycle telemetry
  event.
- enhanceFetchError keeps the undici cause, so a timeout, a reset and a
  DNS failure no longer all read as "fetch failed".

No new flags: `--retry` already means re-running failed tests.

* fix(cloud): refresh auth between submit retries, and count failed attempts

Review on #226:

- Every retry reused the auth resolved at the start of the command,
  and the retries can outlast a `dcd login` access token. The next
  attempt then got a non-retryable 401, possibly after an earlier
  attempt had already created the run. Each attempt now calls
  refreshAuth first, as the poll loops do. A session that can't be
  refreshed (definitive SessionRefreshError, or no stored session) is
  not retried.
- `submit_attempts` was only recorded on success, so `command failed`
  never carried it. That is the worst-stall case it exists to measure.
  submitWithRetry now calls onAttempt before each attempt, and both
  `dcd cloud` and dcd-mcp record the count there.

Also bounds the worst case. No attempt starts more than 5 minutes after
the first. With every attempt timing out at 90 s the retries could
otherwise hold the command for about 16 minutes; now the worst case is
about 6.5.
…#227)

The API stops accepting API levels 29, 30 and 31 on 19 October 2026 (they
were only ever offered on pixel-6, which keeps 32-37). Validation already
comes from the compatibility endpoint at run time, so this enum only feeds
the flag's help text; it no longer advertises levels that are rejected.

src/types/generated/schema.types.ts is left for the next full regeneration:
regenerating now would also pull in unrelated API drift, including a device
slug that is still gated to dev.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@finalerock44 finalerock44 self-assigned this Oct 16, 2026
@claude

claude Bot commented Oct 16, 2026

Copy link
Copy Markdown

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

🤖 Generated with Claude Code

@finalerock44
finalerock44 merged commit 0df161c into promote/cli-5.8.0 Oct 16, 2026
11 checks passed
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