@norskvideo/ctl-dev-kit 0.1.64 → 0.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -97,14 +97,19 @@ jobs:
97
97
  echo "NORSK_RUNNER_OWNS_DOCKER=true" >> "$GITHUB_ENV"
98
98
  fi
99
99
 
100
- # `product add --image` publishes the control plane on 127.0.0.1:14321 and
101
- # the container is a singleton that outlives its daemon, so a job killed
102
- # after registering -- this workflow cancels its own superseded runs --
103
- # strands it holding the port and every later job here fails to bind. One
104
- # leaked on 2026-08-30 and took out the next nine smoke and integration
105
- # jobs across four repos before a human cleared it. The harness teardown
106
- # closes the clean-exit half; nothing but this can heal a runner that is
107
- # already poisoned, because a SIGKILLed job runs no teardown.
100
+ # `product add --image` publishes the control plane on 127.0.0.1:14321. The
101
+ # daemon means to reap it on shutdown (daemon.ts, model B) but only does so
102
+ # gracefully, and this workflow cancels its own superseded runs -- a killed
103
+ # daemon reaps nothing and the port stays held for every later job here.
104
+ #
105
+ # On 2026-08-30 something held it on one runner from 11:18 to ~16:00 and
106
+ # took out the next nine smoke and integration jobs across four repos.
107
+ # What held it was never established: the job that last bound it PASSED
108
+ # and shut down cleanly, so it may not have been a control-plane container
109
+ # at all -- a stale docker-proxy or dangling endpoint reports the same
110
+ # "already allocated". So this reaps what it can name AND names whatever
111
+ # still holds the port, rather than exiting quiet and leaving the next
112
+ # occurrence as much of a mystery as this one.
108
113
  #
109
114
  # Gated on the daemon being this runner's own. The GPU box runs several
110
115
  # runners as sibling CONTAINERS against one host daemon, where a blanket
@@ -114,10 +119,20 @@ jobs:
114
119
  run: |
115
120
  set -uo pipefail
116
121
  stale="$(docker ps -aq --filter 'name=^norsk-product-')"
117
- [ -n "$stale" ] || { echo "no stranded control plane"; exit 0; }
118
- echo "::warning::reaping a stranded product control plane -- a previous job did not tear its own down"
119
- docker inspect --format '{{.Name}} {{.State.Status}} {{.Config.Image}}' $stale || true
120
- docker rm -f $stale || true
122
+ if [ -n "$stale" ]; then
123
+ echo "::warning::reaping a stranded product control plane -- a previous job did not tear its own down"
124
+ docker inspect --format '{{.Name}} {{.State.Status}} {{.Config.Image}}' $stale || true
125
+ docker rm -f $stale || true
126
+ fi
127
+ # Whatever is left on the port is the thing worth seeing: if this is
128
+ # ever non-empty after the reap above, the holder is not a control
129
+ # plane and `docker rm` was never going to clear it.
130
+ holder="$(docker ps -a --filter 'publish=14321' --format '{{.Names}} {{.Status}} {{.Image}}')"
131
+ if [ -n "$holder" ]; then
132
+ echo "::warning::14321 is still published by: $holder"
133
+ else
134
+ echo "14321 free; no container publishes it"
135
+ fi
121
136
 
122
137
  - name: Write the Norsk license (from the org secret)
123
138
  env:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@norskvideo/ctl-dev-kit",
3
- "version": "0.1.64",
3
+ "version": "0.1.65",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./create-product": "./create-product/create-product.ts",