Files
james.maesandCodex 1a0964ef23 chore: enforce owned source copyright notices (#25)
* chore(standards): preserve owned-source copyright notices

Add accurate repository copyright and license comments to 50 owned source/build/configuration files. Preserve existing holders, upstream wrappers, legal payloads and schema/data exemptions. Exact inverse-byte reconstruction and applicable parser/token/AST checks prove comment-only changes; existing relevant regressions pass.

Co-Authored-By: Codex (GPT-6) <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>

* chore: enforce owned source copyright notices

Check real leading comments against explicit repository provenance and retain existing native style gates.

Co-Authored-By: Codex GPT-6 <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>

---------

Signed-off-by: James Maes <james@kof22.com>
Co-authored-by: Codex (GPT-6) <noreply@openai.com>
2026-11-01 12:41:00 -06:00
..

Local Docker development

Use this repository to start a separate QQQ application or run synthetic printing checks. Nothing imports an installed connector's pairing, accesses physical printers, or needs a cloud account. Docker Compose and PowerShell 7.4+ are required; Git identifies the checkout. Docker must support Linux/amd64 containers. The first build downloads pinned public images, Maven dependencies and the verified Windows Core source archive. Java and .NET run inside Docker; neither host SDK is required.

Start, test and stop

From the repository root, the default command runs 65 S3 checks and 40 network jobs, saves protected reports, and removes its containers and synthetic volumes:

pwsh ./dev/Invoke-Dev.ps1 -Action Test

For a persistent development application, start it and keep the state-directory path printed by the command:

pwsh ./dev/Invoke-Dev.ps1 -Action Start
pwsh ./dev/Invoke-Dev.ps1 -Action Test -StateDirectory '<printed state directory>'
pwsh ./dev/Invoke-Dev.ps1 -Action Stop -StateDirectory '<printed state directory>'

Open http://127.0.0.1:19081. The standard QQQ TABLE login username is developer. Read QQQ_ADMIN_PASSWORD from the generated, protected compose.env locally; never paste that file into an issue or commit it. There is no default password. The host provides native printing screens, settings, a dedicated MinIO document bucket and scheduled retention. No printer is enrolled automatically in this host. The test workload uses a separate disposable database and object store.

Add -Authentik when creating an environment or running a fresh test to include real Authentik/PostgreSQL. See the provider checks and remaining native grant prerequisite. Provider discovery does not establish successful OIDC user login or refresh; the current QQQ RC.20 API lacks that native-client grant.

pwsh ./dev/Invoke-Dev.ps1 -Action Test -Authentik
pwsh ./dev/Invoke-Dev.ps1 -Action Test -Workload 10000

The optional 10,000-job run keeps admission limits enabled, uses eight synthetic clients across two tenants, and reports client process memory, latency and receipt counts. It is a bounded burst, not a day-long soak or physical throughput claim. The default 40-job run measures idle event delivery one job at a time.

Isolation and cleanup

Each environment has a unique qbit-printing-dev-<random> Compose project and matching ownership labels. All published ports bind only to 127.0.0.1: QQQ19081, MinIO19095 and optional Authentik19010. Override them with -QqqPort, -MinioPort and -AuthentikPort when creating a new environment. Occupied ports fail startup; the command never stops another service to free them. PostgreSQL is not published.

State defaults to the current user's application-data directory, outside the checkout, with private filesystem permissions. A custom -StateDirectory must also be outside the checkout. It holds generated fixture credentials, frozen Compose files, ownership records and sanitized result files. Docker administrators can inspect container configuration; use these credentials only for this fixture.

Stop validates container, network and volume ownership before removing that project's resources. It deletes that environment's synthetic databases and objects. It leaves reports and ordinary image/build caches in place and never runs a global prune. A fresh one-command Test performs this cleanup in finally, including on failure. Tests against an existing environment remove only their three test containers; finish with Stop to remove its disposable test volume and the persistent development environment. Do not edit its frozen ownership files.

Images are pinned by digest in Compose/Dockerfiles. Containers have bounded CPU and memory, no automatic restart, and no Docker socket. The default profile has no host credential or source mounts. QQQ/test containers additionally cap process counts. Builds copy only explicit source inputs. The QQQ and MinIO containers share their own network namespace so the existing loopback S3 backend can be used without relaxing production endpoint validation.

What the results mean

  • The S3 fixture exercises the actual QQQ StorageAction/S3 backend and AWS SDK, including a multipart-size document, hashes, tenant namespaces, immutable binding checks, retention and unrelated-object preservation.
  • The workload uses the real current Java server and pinned Windows Core client: native TABLE authentication, outbound WebSocket notifications, event-driven claims, document downloads and durable server receipts. A fake file printer verifies bytes and rejects duplicate submission. It cannot produce paper.
  • The fixture's client receipt journal is intentionally simple; these results do not replace production SQLite crash-recovery tests. MinIO fixture credentials are unrestricted within their owned store and do not qualify production IAM.
  • Connections here are HTTP/WebSocket on an isolated local project. TLS, provider browser consent/renewal, real deployment policies and hardware behavior are separate qualifications. No silent bearer-authentication fallback is added.

Results include result.json, server-result.json, s3-results.json and execution.json under a run directory. The persistent host also writes qqq-result.json; optional provider checks write auth-result.json. Treat raw fixture logs as private even though only synthetic accounts/documents are used.

The client Dockerfile pins commit 346fc285198908c47a2ee9db7b9adb53d5e88c3c and verifies its source archive SHA-256 before compilation. The Java image builds this checkout, including local edits, and records its Git HEAD for context; a Git HEAD alone does not certify a dirty tree as that released artifact. This tooling is outside the production JAR and adds no application runtime dependency.

Script regressions

With Pester 5 installed, the initializer and cleanup-ownership tests need no Docker or network. Disable Pester's unrelated registry fixture on Windows:

$configuration = New-PesterConfiguration
$configuration.Run.Path = './dev/tests'
$configuration.Run.Exit = $true
$configuration.TestRegistry.Enabled = $false
Invoke-Pester -Configuration $configuration

Experimental native sign-in

The separate native sign-in profile builds an explicitly selected upstream candidate and uses container-private TLS trust. It mounts only public Caddy configuration and specific protected fixture input/result files. It is opt-in, Test-only, and does not change the default released QQQ dependency.

Continuous integration

The development workflow runs the Pester and PowerShell analysis checks on Windows and Ubuntu for every pull request and main-branch push. Ubuntu also runs the real 40-job/S3 Docker smoke. The longer experimental native-auth profile is an explicit manual workflow option; it is not silently substituted for the released dependency baseline.