Files
f0d695ec97
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Failing after 7s
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / ci-result (push) Failing after 6s
QRun-IO/ci-policy: native / native-result (push) Successful in 6s
chore: preserve paused QBit work and document remaining issues
Save the current implementation and README, status, and known-issue documentation at the user-requested stop. No completed release or deployment is claimed.

Co-Authored-By: Claude <noreply@anthropic.com>

Co-Authored-By: GPT-6 Codex <noreply@openai.com>
2026-11-04 10:45:28 -06:00
..

Execution supervisor qualification packaging

This subtree packages a candidate only. productionQualified=false and redistributionCleared=false remain explicit in the image, snapshot and workload. No build, image execution, cluster call or deployment was performed by these tools. This is the execution lane only: no strict TypeScript compiler, Node, renderer, QQQ application or printing service is added. Existing peer resources are untouched.

Local snapshot and build handoff

Use existing CPython 3.13+; scripts use only its standard library. No environment install or dependency resolver is needed. snapshot_execution.py accepts a JSON object with exactly these keys: supervisor, jna, json, extism, wasm, license, notice, licenseReview, cargoInventory. Each value has exactly path (absolute existing local file) and lowercase sha256. Supply actual values; there is deliberately no descriptor containing guessed artifact locations/hashes.

The supervisor hash must come from the accepted standalone build, not an app QBit JAR. LICENSE/NOTICE are the supervisor's own files; licenseReview/cargoInventory are the bounded release inventory under ../wasm-runtime/docs. Extism1.41.0, JNA5.18.1, JSON20251224 and the fixed Wasm hash (WASM_SHA, kept equal to ../wasm-runtime/PINNED-WASM.json by test_deploy.PinnedWasmTest; rebuild with ../wasm-runtime/Build-Wasm.ps1) are also enforced in the script. The JNA Linux x86-64 JNI bytes are extracted from that exact JAR and separately hashed. No guest code, certificates, secrets, test fixtures, SDK, compiler or operator configuration is copied. Supervisor class inventory rejects foreign Java package classes; native headers must be ELF64 little-endian x86-64.

Run from this directory (paths below are operator-created, not bundled defaults):

python snapshot_execution.py ABSOLUTE_LOCAL_INPUTS_JSON ABSOLUTE_NEW_USER_CACHE_DIRECTORY
python snapshot_execution.py --verify ABSOLUTE_EXISTING_CACHE_CONTEXT
python -m unittest -v test_deploy

The output directory must be new and resolve beneath the current user's .cache. All hashes are checked before copying and again after copying. Failure never overwrites an existing snapshot; preserve a partial failed context for diagnosis. metadata/candidate.json inventories copied inputs without leaking host paths. The closed Docker context contains only Containerfile/payload/metadata. All input files remain unchanged; no recursive cleanup or global package/cache writes occur. The verification mode refuses any unlisted file, symlink or changed hash. Run it again immediately before the separately authorized build; keep the context operator-owned and frozen between verification and build. It does not authenticate an attacker-rewritten manifest: retain its independently recorded digest outside the context as part of the root artifact handoff.

Root/operator-only build recipe, not executed here, after checking the base image is already cached and the snapshot is reviewed:

docker build --network=none --pull=false --platform=linux/amd64 --file ABSOLUTE_CACHE_CONTEXT/Containerfile --tag LOCAL_CANDIDATE_TAG ABSOLUTE_CACHE_CONTEXT

BuildKit itself must already exist; this file does not fetch an external syntax frontend. Base is the exact reviewed Temurin21.0.13+9 amd64 manifest eclipse-temurin@sha256:db724162e4ff5f71fa0a2815026314d9e5e0e9a139f49be1d4717e6930e93341. The sole RUN removes explicitly named shell/download-client files inside that image layer, never on the host. It installs nothing. Root must inspect final layers for unexpected shell aliases/utilities and dependency/linker availability; this pruning is not a containment guarantee or a complete minimal-OS inventory. The exec-form entrypoint bypasses the base certificate shell script. TLS stores are supplied separately. JNA uses its explicit read-only native directory with unpack disabled. Root-owned0555 payload directories/files are non-writable by UID/GID65532; Kubernetes also makes the whole root filesystem read-only.

Final-image checks remain required: exact source/artifact/OCI hashes, actual Java/native versions and linkage, no duplicate provider/dependency, real nonroot read-only launch, fixed trusted ABI corpus, mTLS identity, resource/retirement behavior, final OS/native/Wasm SBOM and complete notices. See NOTICE-GAPS.md; packaging that gap report does not discharge any notice obligation.

Qualification manifest renderer

Copy qualification.disabled.json to a private local descriptor, explicitly fill every field, and enable only for the agreed qualification exercise. Rendering refuses disabled/missing/unknown/duplicate keys, floating image tags, default RuntimeClass, absent client selectors, secrets as values, and invalid bounds.

python render_qualification.py PRIVATE_OPERATOR_DESCRIPTOR NEW_LOCAL_MANIFEST_JSON

This creates a Kubernetes List and never runs kubectl. The namespace must begin qqq-qual- and be distinct from the selected QQQ client namespace. It must be a new, dedicated qualification namespace: a Namespace object is not proof that an existing namespace is safe to adopt. Before any separately authorized deployment, review resource ownership and validate against the target Kubernetes schema and admission policies. The script does not create or change RuntimeClass, node PID settings, client resources, credentials, roles or service accounts.

fixtures/ contains a complete synthetic, never-deploy input and rendered List using the reserved registry.invalid domain. The positive tests compare the whole artifact and separately check object references, network selectors, volume/Secret paths, security and actual supervisor configuration keys. This is local structural validation, not a substitute for target-cluster schema and admission validation. Wire profile/toolchain/evidence/client namespace strings are limited to the actual supervisor's128-character [A-Za-z0-9._:-] grammar; Kubernetes selector keys/values use their separate label and DNS-prefix grammar.

Required operator inputs include immutable execution image@sha256; actual sandbox RuntimeClass and selected sandbox nodes; explicit Pod Security version; existing Secret names; exact client certificate DER SHA256→protocol namespace map; QQQ namespace plus nonempty pod labels; profile/toolchain/evidence IDs; finite CPU/memory/tmp/guest/cache/admission limits; and actual node PID policy evidence. Equal evidence strings are a wire precondition, not qualification.

The server Secret must contain server.p12, the trust Secret clients.p12, and the password Secret keyStorePassword/trustStorePassword. Only references enter the manifest. Restrict these Secrets to the qualification namespace and ensure the server certificate matches the DNS name used by the client. The fixed image contains neither credentials nor mutable trust. Clients retain current QQQ authority and broker tokens; readiness supplies no execution permission.

Restricted Pod security includes nonroot65532, dropped capabilities, no privilege escalation, RuntimeDefault seccomp, read-only root and bounded memory-backed/tmp. CPU/memory requests equal limits; the memory floor is a conservative refusal check, not demonstrated capacity. Extism common-runtime compilation, per-slot native heap, JVM, frames and caches still need measurements. No service-account token is mounted. No host namespaces, host volumes, PVC, ingress exposure or service-account/RBAC resources are generated.

The namespace default-deny policy denies ingress and egress. A second rule permits only TCP18443 from both the explicit QQQ namespace and pod labels in one peer. No DNS/HTTP/other outbound rule is added; established response traffic uses the incoming connection. An enforcing CNI and control of other additive policies are prerequisites. Host/kubelet traffic and CNI semantics require actual verification. See the primary NetworkPolicy specification and Restricted Pod Security controls.

Kubernetes has no per-PodSpec PID-limit field. pidLimit and pidPolicyEvidence produce explicit expectation annotations only; the operator must configure and verify the selected kubelet/runtime podPidsLimit (or stronger sandbox equivalent) and node process reservation before qualification. Node labels are scheduling intent, not enforcement. See official PID-limit guidance.

Readiness and termination limits

The server binds its port after fixed-runtime slot compilation and CPU-accounting checks. TCP startup/readiness probes establish listener availability only; they cannot prove authenticated admission capacity, intact prepared publications, usable compiler, current grants or safe native cleanup. They may transiently consume a handshake thread; measure this with configured connection limits. The existing QQQ native warm health check, including fresh authenticated heartbeat and complete current required pins, must gate QQQ application traffic. This manifest does not install or bypass that application health check.

There is deliberately no TCP liveness probe presented as a native-free watchdog. Hung cleanup and occupied/retired engine slots can leave a listening process. Independent hard-termination/liveness policy is an open qualification gate. The30s Pod termination grace permits the current15s bounded server drain and then orchestrator termination; actual CRI/sandbox enforcement must be tested. Do not claim that a signal, Java timer, NetworkPolicy or these manifests alone qualify hostile code or production Kubernetes operation.