feat(realtime): printer-approval-v1 and the PRINTERS frame for extension 2.4.0 #11

Merged
james.maes merged 1 commits from feat/printer-approval-20261105 into main 2026-11-05 22:22:15 +00:00
Owner

Contract half of the printer-approval feature (printing semantic extension 2.4.0, additive). Wire payload stays v1, subprotocol stays qqq-printing.v1, every 2.3.0 fixture is unchanged.

Changes

  • RealtimeHelloPayload.capabilities: enum gains printer-approval-v1, maxItems 5.
  • ControlCapability gains printer-approval-v1; the historical DeviceControlPollRequest.capabilities and management Device.control.capabilities arrays move from 3 to 4 entries.
  • New server -> client frame PRINTERS: RealtimePrinters (closed envelope), RealtimePrintersPayload (printers, max 200, open), PrinterApprovalState (printerId Id, enabled boolean, both required, open); added to RealtimeServerMessage.
  • Fixtures: realtime-printers.message.json, realtime-approval-hello.message.json (five capabilities), printing-realtime-extension-240.discovery.json.
  • Verifiers: PRINTERS in the directional server-message check; 4- and 5-capability hellos valid, duplicate/unknown sixth capability and missing realtime-v1 rejected; PRINTERS bounds (0, 200, 201), required fields, boolean type, closed envelope; control poll accepts all four non-realtime capabilities.
  • Docs: REALTIME.md frames row and "Printer approval" section, VERSIONS.md 2.4.0 row and negotiation rule (minimum 2.4.0), README mention, CHANGELOG 1.1.0 (unreleased), package version 1.1.0.

Semantics

The server sends PRINTERS only on connections whose HELLO advertised printer-approval-v1: after each accepted INVENTORY from that connection (after its ACK) and whenever any printer's approval for the device changes. It lists the complete approval state of the latest accepted inventory; each frame replaces the previous one; not acknowledged, not durable, no job or document data. An empty inventory yields { "printers": [] }.

Gates

  • npm run check: 79 definitions compiled, 82 fixtures passed (realtime directional, bounds, replay checks passed).
  • npm run lint: 0 problems. npm run typecheck: clean.
  • npm run quality: 17 + 13 tests OK, 6 Python scripts and 7 JavaScript files verified, 18 tracked source notices verified.
  • git diff --check: clean.

No tag or release. Server (qbit-printing 1.1.0 / 2.4.0) and client (qqq-print-agent 1.2.0) changes follow in their own repositories.

🤖 Generated with Claude Code

Contract half of the printer-approval feature (printing semantic extension **2.4.0**, additive). Wire payload stays v1, subprotocol stays `qqq-printing.v1`, every 2.3.0 fixture is unchanged. ## Changes - `RealtimeHelloPayload.capabilities`: enum gains `printer-approval-v1`, `maxItems` 5. - `ControlCapability` gains `printer-approval-v1`; the historical `DeviceControlPollRequest.capabilities` and management `Device.control.capabilities` arrays move from 3 to 4 entries. - New server -> client frame `PRINTERS`: `RealtimePrinters` (closed envelope), `RealtimePrintersPayload` (`printers`, max 200, open), `PrinterApprovalState` (`printerId` Id, `enabled` boolean, both required, open); added to `RealtimeServerMessage`. - Fixtures: `realtime-printers.message.json`, `realtime-approval-hello.message.json` (five capabilities), `printing-realtime-extension-240.discovery.json`. - Verifiers: PRINTERS in the directional server-message check; 4- and 5-capability hellos valid, duplicate/unknown sixth capability and missing `realtime-v1` rejected; PRINTERS bounds (0, 200, 201), required fields, boolean type, closed envelope; control poll accepts all four non-realtime capabilities. - Docs: REALTIME.md frames row and "Printer approval" section, VERSIONS.md 2.4.0 row and negotiation rule (minimum 2.4.0), README mention, CHANGELOG 1.1.0 (unreleased), package version 1.1.0. ## Semantics The server sends PRINTERS only on connections whose HELLO advertised `printer-approval-v1`: after each accepted INVENTORY from that connection (after its ACK) and whenever any printer's approval for the device changes. It lists the complete approval state of the latest accepted inventory; each frame replaces the previous one; not acknowledged, not durable, no job or document data. An empty inventory yields `{ "printers": [] }`. ## Gates - `npm run check`: 79 definitions compiled, 82 fixtures passed (realtime directional, bounds, replay checks passed). - `npm run lint`: 0 problems. `npm run typecheck`: clean. - `npm run quality`: 17 + 13 tests OK, 6 Python scripts and 7 JavaScript files verified, 18 tracked source notices verified. - `git diff --check`: clean. No tag or release. Server (`qbit-printing` 1.1.0 / 2.4.0) and client (`qqq-print-agent` 1.2.0) changes follow in their own repositories. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
james.maes added 1 commit 2026-11-05 21:40:05 +00:00
feat(realtime): add printer-approval-v1 and the PRINTERS frame for extension 2.4.0
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 3s
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1b3648d9421543350067e95e54959dfb471b26d5] (pull_request) Successful in 5s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
QRun-IO/ci-policy: Shared Node CI / secrets (pull_request) Successful in 11s
QRun-IO/ci-policy: Shared Node CI / verify (pull_request) Successful in 33s
QRun-IO/ci-policy: Shared Node CI / gate (pull_request) Successful in 9s
QRun-IO/ci-policy: ci / node-8 (pull_request) Successful in 44s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 4s
ac835f8b93
Add the printer-approval-v1 HELLO capability (maxItems 5), extend
ControlCapability and the historical control-poll/management capability
arrays to four entries, and define RealtimePrinters, RealtimePrintersPayload
and PrinterApprovalState with the union entry. The server sends PRINTERS only
on connections that advertised the capability, after each accepted INVENTORY
and on every approval change; it is not acknowledged and carries no job data.

Add the PRINTERS, five-capability hello and 2.4.0 discovery fixtures, cover
the new frame in the directional and negative verifier checks, document the
frame, the 2.4.0 registry row and the negotiation rule, and record
distribution 1.1.0 as unreleased. Wire payload v1, the subprotocol and every
2.3.0 fixture are unchanged. 79 definitions compile and 82 fixtures pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
james.maes merged commit 5005f3c9e2 into main 2026-11-05 22:22:15 +00:00
Sign in to join this conversation.