Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.6.0-rc.12] β€” 2026-08-04

### Changed

- **Routine dependency maintenance across the root tooling, demo, UI, and website workspaces** ([#653](https://github.com/CodesWhat/drydock/pull/653), [#654](https://github.com/CodesWhat/drydock/pull/654), [#655](https://github.com/CodesWhat/drydock/pull/655), [#656](https://github.com/CodesWhat/drydock/pull/656)). The dependency-version guard's Next.js check became a 16.x floor instead of an exact pin so routine patch bumps stop tripping it ([#664](https://github.com/CodesWhat/drydock/pull/664)).
- **Crowdin translation sync** ([#665](https://github.com/CodesWhat/drydock/pull/665)): one French container-component string corrected.

### Fixed

- **"Agent Mismatch" no longer appears in the container list/SSE display during the brief window an agent's docker/dockercompose trigger is still (re)registering** ([#605](https://github.com/CodesWhat/drydock/issues/605)). Eligibility is recomputed live on every read, and `AgentClient._doHandshake()` deregisters the agent's components before awaiting the `/api/triggers` fetch and re-register. A read in that window found zero triggers for the agent and `computeUpdateEligibility` raised a hard `agent-mismatch` blocker, disabling the Update button, even though nothing was actually misconfigured — the condition self-corrected once registration finished. `agent-mismatch` now downgrades to a soft blocker (button stays enabled) on display surfaces whenever the container's own agent is mid-registration, per the new `AgentClient.isRegisteringComponents` flag (true only for the deregister→re-register span, not the whole reconnect backoff). Update **admission** (`app/updates/request-update.ts`) is unaffected and stays hard/fail-closed throughout, so an update can never be enqueued through a wrong-agent trigger during that window.
Expand Down Expand Up @@ -2319,7 +2326,8 @@ Remaining upstream-only changes (not ported β€” not applicable to drydock):
| Fix codeberg tests | Covered by drydock's own tests |
| Update changelog | Upstream-specific |

[Unreleased]: https://github.com/CodesWhat/drydock/compare/v1.6.0-rc.11...HEAD
[Unreleased]: https://github.com/CodesWhat/drydock/compare/v1.6.0-rc.12...HEAD
[1.6.0-rc.12]: https://github.com/CodesWhat/drydock/compare/v1.6.0-rc.11...v1.6.0-rc.12
[1.6.0-rc.11]: https://github.com/CodesWhat/drydock/compare/v1.6.0-rc.10...v1.6.0-rc.11
[1.6.0-rc.10]: https://github.com/CodesWhat/drydock/compare/v1.6.0-rc.9...v1.6.0-rc.10
[1.6.0-rc.9]: https://github.com/CodesWhat/drydock/compare/v1.6.0-rc.8...v1.6.0-rc.9
Expand Down
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</div>

<p align="center">
<a href="https://github.com/CodesWhat/drydock/releases"><img src="https://img.shields.io/badge/version-1.6.0--rc.11-blue" alt="Version"></a>
<a href="https://github.com/CodesWhat/drydock/releases"><img src="https://img.shields.io/badge/version-1.6.0--rc.12-blue" alt="Version"></a>
<a href="https://github.com/orgs/CodesWhat/packages/container/package/drydock"><img src="https://img.shields.io/badge/platforms-amd64%20%7C%20arm64-informational?logo=linux&logoColor=white" alt="Multi-arch"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-C9A227" alt="License AGPL-3.0"></a>
<br>
Expand Down Expand Up @@ -178,6 +178,17 @@ See the [Quick Start guide](https://getdrydock.com/docs/quickstart) for Docker C
<h2 align="center" id="recent-updates">πŸ†• Recent Updates</h2>

<details open>
<summary><strong>v1.6.0-rc.12 highlights</strong></summary>

- **Security dependency refresh** β€” `brace-expansion` 5.0.9 (app/UI/e2e, CVE-2026-69152), `ip-address` 10.3.1 (app runtime, CVE-2026-54272/-69192/-69198), and `fast-uri` 4.1.2 (app/UI, CVE-2026-18446). ([#659](https://github.com/CodesWhat/drydock/pull/659))
- **Maturity clock** β€” the hot/mature badge resolves per-container `updatePolicy.maturityMinAgeDays` before the global threshold, matching the gate, and registry publish-date failures log at `warn` instead of disappearing at `debug`. ([#604](https://github.com/CodesWhat/drydock/issues/604))
- **Agent registration grace** β€” transient `agent-mismatch`/`no-update-trigger-configured` blockers soften on display surfaces while an agent's components re-register; admission stays fail-closed. ([#605](https://github.com/CodesWhat/drydock/issues/605))
- **WS log streams + anonymous auth** β€” log-stream WebSocket upgrades accept sessions when anonymous authentication is the registered mode. ([#636](https://github.com/CodesWhat/drydock/issues/636))
- **Explicit 501s** β€” lifecycle actions on agent containers without controller Docker transport return 501 naming the cause instead of an ambiguous 404. ([#637](https://github.com/CodesWhat/drydock/issues/637))

</details>

<details>
<summary><strong>v1.6.0-rc.11 highlights</strong></summary>

- **Portwing transport** β€” Portwing 0.9.0's exact `transport=docker-api`, `execution=controller`, `events=portwing` marker now routes native registry checks, single/batch updates, start/stop/restart, update previews, and backup rollbacks through authenticated Standard HTTP or Edge request/response/stream transport. Portwing remains the lifecycle-event source, and raw inventory cannot erase controller-enriched update results. ([#632](https://github.com/CodesWhat/drydock/issues/632), [#637](https://github.com/CodesWhat/drydock/issues/637), [Portwing #76](https://github.com/CodesWhat/portwing/issues/76))
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/mocks/data/agents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export const agents = [
host: '192.168.1.50',
port: 3001,
connected: true,
version: '1.6.0-rc.11',
version: '1.6.0-rc.12',
os: 'linux',
arch: 'amd64',
cpus: 4,
Expand Down
4 changes: 2 additions & 2 deletions apps/demo/src/mocks/data/audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ export const auditEntries = [
id: 'aud-001',
timestamp: '2026-03-10T08:00:00.000Z',
action: 'system:start',
details: 'Drydock v1.6.0-rc.11 started',
details: 'Drydock v1.6.0-rc.12 started',
},
{
id: 'aud-002',
Expand Down Expand Up @@ -207,6 +207,6 @@ export const auditEntries = [
timestamp: '2026-03-03T18:00:00.000Z',
action: 'container:watch',
container: 'drydock',
details: 'Started watching ghcr.io/codeswhat/drydock:1.6.0-rc.11',
details: 'Started watching ghcr.io/codeswhat/drydock:1.6.0-rc.12',
},
];
2 changes: 1 addition & 1 deletion apps/demo/src/mocks/data/containers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ export const containers = [
displayName: 'Drydock',
displayIcon: 'sh-drydock',
image: 'codeswhat/drydock',
tag: '1.6.0-rc.11',
tag: '1.6.0-rc.12',
registryType: 'ghcr',
registryUrl: 'https://ghcr.io',
scanStatus: 'scanned',
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/mocks/data/server.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const serverInfo = {
version: '1.6.0-rc.11',
version: '1.6.0-rc.12',
uptime: 864000,
hostname: 'drydock-demo',
platform: 'linux',
Expand Down
4 changes: 2 additions & 2 deletions apps/demo/src/mocks/handlers/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export const appHandlers = [
http.get('/api/v1/app', () =>
HttpResponse.json({
name: 'Drydock',
version: '1.6.0-rc.11',
version: '1.6.0-rc.12',
description: 'Docker container update manager',
repository: 'https://github.com/CodesWhat/drydock',
documentation: 'https://getdrydock.com/docs',
Expand All @@ -16,7 +16,7 @@ export const appHandlers = [
return HttpResponse.json(
{
generatedAt: new Date().toISOString(),
server: { version: '1.6.0-rc.11', mode: 'demo' },
server: { version: '1.6.0-rc.12', mode: 'demo' },
summary: {
containers: 25,
watchers: 2,
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/lib/site-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const SITE_CONFIG = {
/** Brand name shown in the header, footer, and metadata. */
name: "Drydock",
/** Current release version shown in the hero badge. */
version: "1.6.0-rc.11",
version: "1.6.0-rc.12",
/** Short product tagline used in page titles and OG metadata. */
tagline: "Container Update Monitoring",
/** Default meta / OpenGraph / Twitter description. */
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/lib/site-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ export const roadmap: Milestone[] = [
],
},
{
version: "v1.6.0-rc.11",
version: "v1.6.0-rc.12",
title: "Notifications, Policy & Release Intel",
emoji: "\u{1F4E8}",
status: "next",
Expand Down
4 changes: 2 additions & 2 deletions content/docs/current/api/agent.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ curl http://drydock:3000/api/v1/agents
"host": "192.168.1.50",
"port": 3000,
"connected": true,
"version": "1.6.0-rc.11",
"version": "1.6.0-rc.12",
"os": "linux",
"arch": "amd64",
"cpus": 4,
Expand Down Expand Up @@ -153,7 +153,7 @@ Sent immediately upon connection to confirm the handshake.
{
"type": "dd:ack",
"data": {
"version": "1.6.0-rc.11",
"version": "1.6.0-rc.12",
"os": "linux",
"arch": "amd64",
"cpus": 4,
Expand Down
2 changes: 1 addition & 1 deletion content/docs/current/api/app.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ curl http://drydock:3000/api/v1/app

{
"name":"drydock",
"version":"1.6.0-rc.11"
"version":"1.6.0-rc.12"
}
```

Expand Down
4 changes: 2 additions & 2 deletions content/docs/current/api/portwing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ A versioned alias `/api/v1/portwing/ws` is also accepted and is signature-equiva
"agentId": "edge-host-01",
"agentName": "edge-host-01",
"protocol": "portwing/1.0",
"version": "1.6.0-rc.11",
"version": "1.6.0-rc.12",
"pubKeyId": "3f8a1c2e9b047d56",
"timestamp": 1780329600,
"nonce": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
Expand All @@ -220,7 +220,7 @@ A name collision with an already-connected agent under the same key (or the in-f
"data": {
"pollInterval": 300,
"config": {
"drydockVersion": "1.6.0-rc.11",
"drydockVersion": "1.6.0-rc.12",
"supportedProtocols": "portwing/1.0",
"serverCompatLevel": "1.4.0"
}
Expand Down
2 changes: 1 addition & 1 deletion content/docs/current/quickstart/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ Release tags use the same channel names in every registry:

| Tag | Behavior |
| --- | --- |
| `1.6.0-rc.11` | Immutable release candidate; best for reproducible testing |
| `1.6.0-rc.12` | Immutable release candidate; best for reproducible testing |
| `1.6-rc` | Rolling release-candidate channel; moves to the newest `1.6.0-rc.N` |
| `1.6` | Rolling stable minor channel; published only for GA releases |
| `1` | Rolling stable major channel; published only for GA releases |
Expand Down
8 changes: 8 additions & 0 deletions content/docs/current/updates/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ description: "Release update notes and feature highlights, with direct links to

## Unreleased

## v1.6.0-rc.12 Highlights β€” August 4, 2026

- **Security dependency refresh** β€” `brace-expansion` advanced to 5.0.9 across the app, UI, and e2e workspaces (CVE-2026-69152), `ip-address` to 10.3.1 in the app runtime (CVE-2026-54272, CVE-2026-69192, CVE-2026-69198), and `fast-uri` to 4.1.2 in app and UI (backslash-authority host confusion, CVE-2026-18446) ([#659](https://github.com/CodesWhat/drydock/pull/659)).
- **Maturity badge and gate agree again** β€” the hot/mature badge now resolves each container's own `updatePolicy.maturityMinAgeDays` before the global `DD_UI_MATURITY_THRESHOLD_DAYS`, matching the gate, and registry publish-date lookup failures (including GHCR/LSCR auth errors) log at `warn` instead of vanishing at `debug` ([#604](https://github.com/CodesWhat/drydock/issues/604)).
- **No more transient "Agent Mismatch"** β€” the container list and SSE stream soften `agent-mismatch`/`no-update-trigger-configured` to soft blockers while an agent's components are mid-(re)registration; update admission stays fail-closed throughout ([#605](https://github.com/CodesWhat/drydock/issues/605)).
- **WebSocket log streams accept anonymous-auth sessions** β€” under `DD_ANONYMOUS_AUTH_CONFIRM=true`, both the system and container log-stream upgrades now pass the same auth gate as every REST endpoint ([#636](https://github.com/CodesWhat/drydock/issues/636)).
- **Explicit 501 for missing agent lifecycle transport** β€” start/stop/restart/rollback on an agent-owned container without controller Docker transport returns a 501 naming the cause instead of an ambiguous 404 ([#637](https://github.com/CodesWhat/drydock/issues/637)).

## v1.6.0-rc.11 Highlights β€” August 1, 2026

- **Portwing 0.9 Docker watcher, updates, and lifecycle actions now run controller-side** β€” Drydock 1.6.0-rc.11+ recognizes the exact `transport=docker-api`, `execution=controller`, `events=portwing` watcher marker, starts its native registry checks and Docker action against a loopback-only authenticated bridge, and carries Docker calls over Standard HTTP or Edge correlated request/response/stream transport. Single/batch updates, start/stop/restart, update preview, and backup rollback use this path even though Portwing advertises no remote trigger. Portwing stays authoritative for lifecycle events, and raw false/unknown inventory no longer erases controller enrichment ([#632](https://github.com/CodesWhat/drydock/issues/632), [#637](https://github.com/CodesWhat/drydock/issues/637), [Portwing #76](https://github.com/CodesWhat/portwing/issues/76)).
Expand Down
3 changes: 2 additions & 1 deletion scripts/changelog-links.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ test('every linked changelog heading has exactly one link definition', () => {
test('v1.6 RC and v1.5.2 GA have a complete chronological comparison-link chain', () => {
const definitions = new Map(getLinkDefinitions(changelog).map(({ label, url }) => [label, url]));
const expected = new Map([
['Unreleased', `${repositoryUrl}/compare/v1.6.0-rc.11...HEAD`],
['Unreleased', `${repositoryUrl}/compare/v1.6.0-rc.12...HEAD`],
['1.6.0-rc.12', `${repositoryUrl}/compare/v1.6.0-rc.11...v1.6.0-rc.12`],
['1.6.0-rc.11', `${repositoryUrl}/compare/v1.6.0-rc.10...v1.6.0-rc.11`],
['1.6.0-rc.10', `${repositoryUrl}/compare/v1.6.0-rc.9...v1.6.0-rc.10`],
['1.6.0-rc.9', `${repositoryUrl}/compare/v1.6.0-rc.8...v1.6.0-rc.9`],
Expand Down
8 changes: 4 additions & 4 deletions scripts/release-docs-identity.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import assert from 'node:assert/strict';
import { readdirSync, readFileSync } from 'node:fs';
import test from 'node:test';

const RC_VERSION = '1.6.0-rc.11';
const PREV_RC_VERSION = '1.6.0-rc.10';
const RC_DATE = '2026-08-01';
const RC_DISPLAY_DATE = 'August 1, 2026';
const RC_VERSION = '1.6.0-rc.12';
const PREV_RC_VERSION = '1.6.0-rc.11';
const RC_DATE = '2026-08-04';
const RC_DISPLAY_DATE = 'August 4, 2026';
const DOC_ROOTS = ['content/docs/current', 'content/docs/v1.5'];
const BROAD_401_CLAIM =
/(?:all|every) API (?:call|request)s?(?: (?:is|are) rejected with| returns?) `401`/iu;
Expand Down
2 changes: 1 addition & 1 deletion scripts/release-identity.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { readFileSync } from 'node:fs';
import test from 'node:test';

const BASE_VERSION = '1.6.0';
const RC_VERSION = '1.6.0-rc.11';
const RC_VERSION = '1.6.0-rc.12';
const DEMO_RELEASE_FIXTURES = [
{
path: 'apps/demo/src/mocks/data/server.ts',
Expand Down
Loading