@crvouga/mockingbird-service-docker 1.0.0 → 1.2.0

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.
package/API_EVIDENCE.md CHANGED
@@ -4,7 +4,7 @@ US-002 research, retrieved **2026-09-25 UTC**. Status: documentation and pinned
4
4
  source inspected; **historical research status, superseded by the US-013 live
5
5
  run recorded below**.
6
6
  This file defines a planned subset, not an implemented support claim. See
7
- [boundaries and scenario IDs](../../../docs/INFRASTRUCTURE_MOCKS.md).
7
+ [boundaries and scenario IDs](../../../docs/INFRASTRUCTURE_EMULATORS.md).
8
8
 
9
9
  ## Compatibility target and provenance
10
10
 
@@ -73,7 +73,7 @@ limit includes non-running containers. Exited filtering requires a stopped
73
73
  container that has started. JSON filter maps accept legacy arrays and boolean
74
74
  sets (keys matter even if false); null denotes an empty map. Boolean query
75
75
  parsing is permissive: trimmed empty/0/no/false/none are false, other values true.
76
- The mock bounds name regex support as documented in README and returns explicit
76
+ The emulator bounds name regex support as documented in README and returns explicit
77
77
  501 for other patterns/filters. No installed Engine or differential run was used.
78
78
  Pinned [container lookup](https://github.com/moby/moby/blob/710302ecf2e958db92cb7d92f8838ea063a31765/daemon/container.go)
79
79
  and [prefix lookup](https://github.com/moby/moby/blob/710302ecf2e958db92cb7d92f8838ea063a31765/daemon/container/view.go)
@@ -81,20 +81,20 @@ confirm full ID, exact name, then unique prefix precedence; ambiguous prefixes
81
81
  return InvalidParameter (400), while missing containers return 404.
82
82
  List status descriptions follow pinned S7 and its
83
83
  [duration formatter](https://github.com/moby/moby/blob/710302ecf2e958db92cb7d92f8838ea063a31765/vendor/github.com/docker/go-units/duration.go),
84
- using the injected mock clock rather than host process uptime.
84
+ using the injected emulator clock rather than host process uptime.
85
85
 
86
86
  S2/S3 explain why the observed `/v1.52/containers/{id}/attach` and unversioned
87
87
  `/info` can belong to one client: every provider route is registered with and
88
88
  without a version, and an absent version uses the daemon default (1.52 here).
89
89
  Deprecation guidance is not evidence that this pinned daemon rejects `/info`.
90
90
 
91
- Planned mock policy: support v1.52 and unversioned aliases for the listed subset.
91
+ Planned emulator policy: support v1.52 and unversioned aliases for the listed subset.
92
92
  Do not claim to emulate all older APIs merely because the real Engine accepts them.
93
93
  For numeric versions above 1.52, use the provider's too-new `400` error; versions
94
94
  below the default minimum 1.44 use its too-old `400` error. Versions 1.44–1.51
95
- are **unsupported by this mock subset**: return an explicitly Mockingbird-labelled
95
+ are **unsupported by this emulator subset**: return an explicitly Mockingbird-labelled
96
96
  `501` message, not a fictional Engine rejection. Historical compatibility can only
97
- be expanded with new evidence. Document these mock-only 501 responses in codegen.
97
+ be expanded with new evidence. Document these emulator-only 501 responses in codegen.
98
98
 
99
99
  Provider version-error message templates from S2 are:
100
100
 
@@ -107,7 +107,7 @@ S3 serializes errors as `{"message":"..."}` except requests below API 1.24,
107
107
  which receive plain text. Unknown paths/methods use `404` with
108
108
  `{"message":"page not found"}`. Malformed version paths are not a promise of
109
109
  version negotiation. No automatic client reconnection or fallback is part of
110
- the mock. Its declared API support must remain distinct from simulated Engine
110
+ the emulator. Its declared API support must remain distinct from simulated Engine
111
111
  `MinAPIVersion` metadata.
112
112
 
113
113
  ## Planned operation contract
@@ -115,7 +115,7 @@ the mock. Its declared API support must remain distinct from simulated Engine
115
115
  Paths below are relative to `/v1.52`, also available unversioned as above.
116
116
  The status column is the pinned S1 vendor contract; additional implementation
117
117
  errors supported by pinned source must be annotated explicitly, not silently
118
- invented. Global version errors and mock-only unsupported-feature errors are
118
+ invented. Global version errors and emulator-only unsupported-feature errors are
119
119
  separate from this table. Unless stated otherwise, vendor errors use
120
120
  `ErrorResponse` with required string `message`.
121
121
 
@@ -156,9 +156,9 @@ and [configuration merge](https://github.com/moby/moby/blob/710302ecf2e958db92cb
156
156
  establish image resolution, platform warnings, request-over-image environment
157
157
  and label precedence, command/entrypoint defaults, empty-entrypoint clearing,
158
158
  and `no command specified` (400). The selected 1.52 request fields come from S1.
159
- The mock stores launch/host/network configuration without executing it. Full
159
+ The emulator stores launch/host/network configuration without executing it. Full
160
160
  daemon resource/network validation and image execution are excluded; the README
161
- lists the explicit supported subset and mock-only501 behavior. No real Engine
161
+ lists the explicit supported subset and emulator-only501 behavior. No real Engine
162
162
  creation or host resource operation was performed.
163
163
 
164
164
  - S4/S6: a successful stop `204` follows backend completion. For delayed-stop
@@ -197,7 +197,7 @@ Upgrade: tcp
197
197
  D1/S1's old illustrative handshake uses raw-stream, but its framing prose and
198
198
  S4 agree on multiplexed-stream for upgraded non-TTY API >=1.42. S4's non-upgrade
199
199
  path really uses HTTP 200/raw-stream; it is deliberately excluded from initial
200
- mock serving. Fetch cannot represent the raw hijacked duplex connection.
200
+ emulator serving. Fetch cannot represent the raw hijacked duplex connection.
201
201
 
202
202
  Output frames have an 8-byte header: stream byte (1 stdout, 2 stderr), three zero
203
203
  bytes, and a uint32 big-endian payload length, followed by exactly that many bytes.
@@ -219,7 +219,7 @@ execution remains necessary to establish observed fidelity.
219
219
  Excluded modes: TTY/PTY, websocket attach, non-upgrade attach, log replay
220
220
  (`logs=true`), exec, standalone logs/events, detach-key processing, image
221
221
  pull/build, real networking/volumes/__admin/health checks and arbitrary command execution.
222
- Unsupported modes receive explicit mock-only 501 errors before upgrade rather
222
+ Unsupported modes receive explicit emulator-only 501 errors before upgrade rather
223
223
  than silently different successful behavior. Reset/checkout/shutdown terminate
224
224
  owned streams and waiters; handles are never serialized into Timeline state.
225
225
 
@@ -269,10 +269,10 @@ Pinned sources resolve the precise v1.52 semantics:
269
269
  - [signal.go](https://github.com/moby/moby/blob/710302ecf2e958db92cb7d92f8838ea063a31765/vendor/github.com/moby/sys/signal/signal.go) and [Linux map](https://github.com/moby/moby/blob/710302ecf2e958db92cb7d92f8838ea063a31765/vendor/github.com/moby/sys/signal/signal_linux.go): zero is invalid; kill restricts to the Linux map (1–31 and34–64). Real-time aliases are supported.
270
270
  - S4/S6 and [HTTP status mapping](https://github.com/moby/moby/blob/710302ecf2e958db92cb7d92f8838ea063a31765/daemon/server/httpstatus/status.go): malformed t returns an unclassified strconv error (500), while a stop signal parsing error is wrapped as System (500). Kill signal errors are InvalidParameter (400). Stop on an already stopped record returns304 before validating its signal.
271
271
 
272
- The mock holds stop/SIGKILL/forced-removal replies until explicit completion;
272
+ The emulator holds stop/SIGKILL/forced-removal replies until explicit completion;
273
273
  acceptance and socket loss never prove retirement. Signal/timeout parameters are
274
274
  stored diagnostic metadata; fixture-controlled completion replaces process/timer
275
- scheduling. v is inert without modeled volumes; link removal is explicit mock-only501.
275
+ scheduling. v is inert without modeled volumes; link removal is explicit emulator-only501.
276
276
  Shared state/checkpoints and transient handles are reused. Fetch and real Node HTTP
277
277
  tests cover acceptance versus exit and response loss; no live Engine parity claimed.
278
278
 
@@ -283,7 +283,7 @@ limit, receive timeouts and retained connections. The Docker-local transport use
283
283
  these Node facilities plus its own bounded body collector and owned connection
284
284
  set. [Node IPC sockets](https://nodejs.org/api/net.html#ipc-support) define local
285
285
  path serving and normal server-close cleanup. Transport bounds and path refusal
286
- are explicit mock controls, not assertions of Docker daemon limits. Verification
286
+ are explicit emulator controls, not assertions of Docker daemon limits. Verification
287
287
  uses synthetic project-local Unix sockets and TCP, including a built-entry fixture
288
288
  executed under Node; it does not use Linux peer credentials or a real Engine.
289
289
 
@@ -323,7 +323,7 @@ and Unix. All mutations, inspections, setup and completion travel through HTTP;
323
323
  Node attachment handles supply scripted output/input observation. Both transports
324
324
  exercise accepted create/start/stop/kill/remove response loss and re-inspection,
325
325
  retained ordinary HTTP connections and fragmented attach with exact binary frames.
326
- This is independent client/protocol evidence against the mock, not a real Engine
326
+ This is independent client/protocol evidence against the emulator, not a real Engine
327
327
  oracle or evidence of the external consumer's retry policy.
328
328
 
329
329
  OpenAPI walks assert eligible planned/exercised operation coverage. A seeded
@@ -376,7 +376,7 @@ wait results and post-removal 404. The three named/labeled containers were confi
376
376
  absent during cleanup. The [captured JSON report](evidence/engine-29.8.0-api-1.52.json)
377
377
  retains actual/model values, image identity, exact Engine version and cleanup.
378
378
 
379
- An earlier attempt failed at mock image seeding before creating any container:
379
+ An earlier attempt failed at emulator image seeding before creating any container:
380
380
  the PostgreSQL image contained unsupported metadata and declared storage. The
381
381
  harness now rejects declared volumes/active healthchecks and projects only modeled
382
382
  image defaults, recording omitted metadata. The successful fixture omitted
@@ -384,9 +384,9 @@ image defaults, recording omitted metadata. The successful fixture omitted
384
384
  published and no config-equivalence claim covers those fields.
385
385
 
386
386
  Normalization excludes dynamic IDs/timestamps, daemon identity/platform fields,
387
- frame/packet boundaries and cross-channel interleaving. The mock scripts expected
387
+ frame/packet boundaries and cross-channel interleaving. The emulator scripts expected
388
388
  process completion; it never executes the image. Existing synthetic response-loss
389
389
  checks remain separate from real Engine execution. Daemon restart/live-restore,
390
390
  host isolation, SDKs, all API 1.56 features and external consumer policies remain
391
- unverified. The historical mock discovery profile remains explicit; this narrow
391
+ unverified. The historical emulator discovery profile remains explicit; this narrow
392
392
  live run does not certify every operation/response field against every newer Engine.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog — @crvouga/mockingbird-service-docker
2
2
 
3
+ ## 1.2.0 (2026-10-09)
4
+
5
+ ### Features
6
+
7
+ - match Emulate provider coverage ([16b65ce](https://github.com/crvouga/mockingbird/commit/16b65ce791fa216f28ec1521df636f57771d9c5e))
8
+
9
+ ### Dependencies
10
+
11
+ - `@crvouga/mockingbird-service-sqlite`
12
+
13
+ ## 1.1.0 (2026-10-08)
14
+
15
+ ### Features
16
+
17
+ - redesign emulator experience ([d6038c2](https://github.com/crvouga/mockingbird/commit/d6038c27eebbaa1751f02bc9305002a5b1304779))
18
+
3
19
  ## 1.0.0 (2026-10-07)
4
20
 
5
21
  ### ⚠️ Breaking changes
package/DISCOVERY.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @crvouga/mockingbird-service-docker discovery
2
2
 
3
3
  This is the installed-package index for coding agents and tooling. All relative links resolve
4
- inside `node_modules/@crvouga/mockingbird-service-docker/`; no repository checkout is needed to discover the mock's
4
+ inside `node_modules/@crvouga/mockingbird-service-docker/`; no repository checkout is needed to discover the emulator's
5
5
  supported surface or documented behavior.
6
6
 
7
7
  ## Capability and behavior sources
@@ -47,7 +47,7 @@ designed for assertions and diagnosis by consuming test suites.
47
47
  ## Report a mismatch or missing capability
48
48
 
49
49
  Follow the [agent reporting contract](https://github.com/crvouga/mockingbird/blob/main/docs/REPORTING_ISSUES.md). Include package version,
50
- operation/command, a minimal redacted request, actual mock result, expected oracle result or vendor
50
+ operation/command, a minimal redacted request, actual emulator result, expected oracle result or vendor
51
51
  documentation, and whether the mismatch appears in the matrix. Never include keys, tokens,
52
52
  customer data, prompts, PHI, card data, or unredacted recordings.
53
53
 
package/ORACLE.md CHANGED
@@ -67,7 +67,7 @@ wait exit code, attach upgrade headers and stdout/stderr bytes. Multiplexed outp
67
67
  is decoded independently and concatenated by channel, removing arbitrary frame
68
68
  and packet boundaries. Output bytes are recorded as base64. Container IDs,
69
69
  timestamps, daemon-specific metadata and cross-channel interleaving are not
70
- compared. The mock's completion control scripts the known exit behavior; it does
70
+ compared. The emulator's completion control scripts the known exit behavior; it does
71
71
  not execute the image. Tests of image execution or host isolation are not implied.
72
72
 
73
73
  The harness performs no daemon restart or live-restore operation. Existing
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @crvouga/mockingbird-service-docker
2
2
 
3
- > Familiar calls. Faithful echoes. Part of [Mockingbird](https://github.com/crvouga/mockingbird).
3
+ > Local emulators. Real API contracts. Part of [Mockingbird](https://github.com/crvouga/mockingbird).
4
4
 
5
- Work-in-progress Docker Engine API 1.52 mock. It implements GET/HEAD `/_ping`,
5
+ Work-in-progress Docker Engine API 1.52 emulator. It implements GET/HEAD `/_ping`,
6
6
  GET `/version`, `/info`, `/containers/json`, and `/containers/{id}/json`, plus
7
7
  Mockingbird's shared runtime controls. POST `/containers/create` persists a stopped
8
8
  container. Start, wait, stop, kill, and removal use explicit simulated completion.
@@ -38,7 +38,7 @@ HTTP clients can target `http://127.0.0.1:8826`. A Docker client using `DOCKER_H
38
38
  can select `tcp://127.0.0.1:8826`. Unversioned and `/v1.52` provider routes work.
39
39
  Versions above 1.52 or below the simulated Engine minimum 1.44 receive provider
40
40
  400 errors (plain text below 1.24, JSON otherwise). Versions 1.44–1.51 receive an
41
- explicit mock-only 501: their wire formats are not implemented. The mock reports
41
+ explicit emulator-only 501: their wire formats are not implemented. The emulator reports
42
42
  a synthetic Engine 29.1.0 identity; this is not a required local Docker version.
43
43
  Selected API 1.52 scenarios passed against Engine 29.8.0; full client and Engine
44
44
  compatibility are not claimed. See [verification boundaries](#verification-boundaries).
@@ -95,7 +95,7 @@ or exact tag. Duplicate IDs, names and image tags conflict; unknown images retur
95
95
  fields also accept `exitCode`, `entrypoint`, `env`, `workingDir`, `user`,
96
96
  `hostConfig`, `networkSettings`, `sizeRw`, and `sizeRootFs`. Status is one of
97
97
  `created`, `running`, `paused`, `restarting`, `removing`, `exited`, or `dead`.
98
- Timestamps use the mock clock; reported PIDs are zero, never host processes.
98
+ Timestamps use the emulator clock; reported PIDs are zero, never host processes.
99
99
 
100
100
  `GET /__admin/docker/daemon` reports `{ available, rootless, simulated: true }`.
101
101
  `POST` to the same route changes either boolean. `available: false` drops provider
@@ -113,7 +113,7 @@ other values mean true. Inspect resolves full IDs, unique prefixes, and names.
113
113
  `status`, `label`, and `exited`. Categories combine with AND; values within a
114
114
  category combine with OR, except labels which all must match. Name matching
115
115
  supports literals, dots, anchors, and at most one `.*`; other regex constructs
116
- and other filter categories return explicit mock-only 501 errors. Malformed
116
+ and other filter categories return explicit emulator-only 501 errors. Malformed
117
117
  filter shapes, statuses and exit codes return 400. Seeded state and daemon
118
118
  settings participate in shared reset and Timeline checkpoints.
119
119
 
@@ -129,7 +129,7 @@ The supported body fields are `Image`, `Cmd`, `Entrypoint`, `Env`, `Labels`,
129
129
  `WorkingDir`, `User`, `Hostname`, `Domainname`, `AttachStdin`, `AttachStdout`,
130
130
  `AttachStderr`, `OpenStdin`, `StdinOnce`, `Tty`, `NetworkDisabled`, `StopSignal`,
131
131
  `StopTimeout`, `HostConfig`, and `NetworkingConfig`. Unsupported fields return
132
- explicit mock-only 501 errors. Bad field types, relative working directories,
132
+ explicit emulator-only 501 errors. Bad field types, relative working directories,
133
133
  invalid stop signals, invalid names, and missing commands return 400.
134
134
  Image defaults supply commands/entrypoints, environment, labels and selected
135
135
  strings. Request environment keys and labels take precedence. `Entrypoint: [""]`
@@ -157,7 +157,7 @@ network validation is not modelled. No host isolation claim follows from it.
157
157
  returns 304 when already running/restarting, and returns 409 for paused, dead,
158
158
  or removing records. No image is executed. The clock supplies `StartedAt`;
159
159
  restart clears the exit code but retains the prior `FinishedAt` until completion.
160
- Checkpoint, checkpoint-dir and detachKeys options return explicit mock-only 501.
160
+ Checkpoint, checkpoint-dir and detachKeys options return explicit emulator-only 501.
161
161
  As in the pinned Engine route, bodies longer than seven bytes and chunked bodies
162
162
  return 400; use an empty body.
163
163
 
@@ -195,7 +195,7 @@ checks selected wait and termination outcomes; cancellation coverage is syntheti
195
195
  finishes execution, then returns 204. Already-stopped containers return 304.
196
196
  `signal` selects the requested signal (default Config.StopSignal or TERM); `t`
197
197
  selects the timeout (default Config.StopTimeout or 10 seconds; negative means no
198
- escalation timeout). The mock records these parameters for scenario inspection.
198
+ escalation timeout). The emulator records these parameters for scenario inspection.
199
199
  It does not schedule real timers or automatically declare exit when a timeout
200
200
  expires: script graceful completion or forced completion, including the exit code,
201
201
  through `/__admin/docker/containers/<id>/complete`. This permits controlled delayed
@@ -207,7 +207,7 @@ signal names/numbers acknowledge delivery with 204 while preserving execution
207
207
  state. The fixture decides the subsequent process response. No host signal is
208
208
  sent. Killing a stopped container returns 409. Invalid kill signals return 400;
209
209
  pinned Engine stop signal errors and malformed `t` return 500. Timeouts outside
210
- JavaScript's safe integer range return explicit mock-only 501.
210
+ JavaScript's safe integer range return explicit emulator-only 501.
211
211
 
212
212
  `DELETE /containers/<id>` removes a stopped record and releases its name (204).
213
213
  Running or paused records require `force=true`; otherwise removal returns 409.
@@ -215,7 +215,7 @@ Forced removal records intent and waits for explicit completion, then removes th
215
215
  record and wakes both exit and removed waiters. A second removal while forced
216
216
  removal is pending returns 409. Seed status `removing` to model an existing removal
217
217
  conflict. Missing records return 404. `v` is accepted but no host volumes exist;
218
- `link=true` is outside this subset and returns mock-only 501.
218
+ `link=true` is outside this subset and returns emulator-only 501.
219
219
 
220
220
  `GET /__admin/docker/containers/<id>/termination` returns the last accepted request
221
221
  (operation, numeric signal, optional timeout and request time), `removalPending`,
@@ -270,7 +270,7 @@ Type exports include `DockerAPIOptions`, `DockerRuntime`, `DockerRuntimeOptions`
270
270
  ## Deliberately not modelled
271
271
 
272
272
  Fetch attach and unsupported options return Mockingbird-specific 501 JSON errors;
273
- unknown routes return 404. The mock never starts real containers or executes
273
+ unknown routes return 404. The emulator never starts real containers or executes
274
274
  commands. The Node server supports the documented non-TTY attach handshake and
275
275
  scripted duplex streams; a Fetch response cannot represent that upgrade.
276
276
 
@@ -359,7 +359,7 @@ already-framed bytes to the last fragment. This does not promise OS packet
359
359
  boundaries. The bytes are caller-owned wire fixtures, not generated container
360
360
  output. Use the live attachment controls below for framing, channel routing and scripted
361
361
  stdin. No command interprets the input, and payload bytes never enter the journal. Connection loss does not stop the container.
362
- Owned sockets close on server shutdown. The mock never connects to a real Engine;
362
+ Owned sockets close on server shutdown. The emulator never connects to a real Engine;
363
363
  the separately invoked oracle performs the authorized provider comparison.
364
364
 
365
365
  ## Scripted attach streams
@@ -411,7 +411,7 @@ stale writes reject. Socket handles and buffered payloads are never snapshotted.
411
411
  `attachStreams.maxQueuedBytes` and `maxStdinBytes` default to 1 MiB. Queued output
412
412
  includes frame headers; exceeding the output limit rejects the write. Exceeding
413
413
  unread stdin capacity cancels that attachment. Stream limits must be positive
414
- integers no greater than 16 MiB. These bounds are mock resource controls.
414
+ integers no greater than 16 MiB. These bounds are emulator resource controls.
415
415
 
416
416
  ## Verification boundaries
417
417
 
@@ -429,7 +429,7 @@ requests on a retained connection and raw attach bytes. It verifies lost create
429
429
  and start responses, lookup by name, duplicate-name conflict, framed binary
430
430
  stdout/stderr, raw stdin, continued execution after attachment loss, and lost
431
431
  stop/kill/remove responses followed by completion and re-inspection. Setup and
432
- completion use public mock admin controls; attachment handles only script output
432
+ completion use public emulator admin controls; attachment handles only script output
433
433
  and observe synthetic stdin. Public request metadata confirms each dropped mutation
434
434
  was accepted and checkpointed. No client assertion imports provider handlers or
435
435
  internal state. The fixture never automatically retries a mutation.
package/SUPPORT.md CHANGED
@@ -3,10 +3,10 @@
3
3
  Generated from `openapi.yaml`; do not edit by hand.
4
4
 
5
5
  - operations in spec: **13**
6
- - supported by the mock: **12**
6
+ - supported by the emulator: **12**
7
7
  - parity enabled: **8**
8
8
 
9
- | operationId | route | mock | parity | notes |
9
+ | operationId | route | emulator | parity | notes |
10
10
  | --- | --- | --- | --- | --- |
11
11
  | `ContainerList` | `GET /containers/json` | ✅ supported | ✅ | |
12
12
  | `ContainerCreate` | `POST /containers/create` | ✅ supported | ⚠️ unsafe (opt-in) | |