270 lines
12 KiB
Markdown
270 lines
12 KiB
Markdown
# Worker Operator Experience Validation - 2026-09-24
|
|
|
|
## Scope and acceptance
|
|
|
|
This report closes the release and production-proof work for OpenSpec change
|
|
`add-worker-operator-experience`. Validation covered the shared worker event
|
|
contract, local supervisor and contained runner, progress and diagnostics APIs,
|
|
admin projections, reproducible Windows and Linux packages, packaged
|
|
cross-platform operation, bounded production behavior, and final restoration.
|
|
|
|
Acceptance required:
|
|
|
|
- the focused unit, integration, protocol, and package matrix to pass;
|
|
- independently reproducible Windows and Linux artifacts with documented and
|
|
registered package manifests;
|
|
- packaged Windows/Linux evidence for multi-slot operation, outage and restart
|
|
recovery, durable bundles and receipts, shutdown, and local cleanup;
|
|
- bounded production evidence for progress, a full scan-stage timeout,
|
|
diagnostics, reconciliation, and restoration; and
|
|
- a from-zero operator runbook covering acquisition through removal.
|
|
|
|
No production assignment was repeated to prepare this report. All production
|
|
facts below are derived from the retained validation snapshots. Raw targets,
|
|
findings, credentials, private routes, runtime configuration, and authenticated
|
|
worker command lines are intentionally excluded.
|
|
|
|
## Focused test matrix
|
|
|
|
The final 14-file worker-operator matrix completed on 2026-09-25:
|
|
|
|
```text
|
|
355 passed, 3 skipped in 49.54s
|
|
```
|
|
|
|
The matrix includes worker API/runtime, assignment and contained-runner,
|
|
CLI/contracts/local state, observability persistence, package, Linux handoff,
|
|
supervisor, remote database, scan execution, and admin API coverage. The three
|
|
independent-watchdog timing regressions also passed after their test setup bounds
|
|
were stabilized. The timing change did not alter product deadlines or watchdog
|
|
behavior.
|
|
|
|
An unrestricted repository-wide test run is not a release gate for this change:
|
|
the checkout has unrelated missing private/generated assets and platform
|
|
assumptions. The focused matrix, packaged E2E, production evidence, and strict
|
|
OpenSpec validation are the scoped gates.
|
|
|
|
## Reproducible artifacts
|
|
|
|
### Windows portable package
|
|
|
|
Final independently built archives:
|
|
|
|
- `build/operator-experience-validation/windows-i.zip`
|
|
- `build/operator-experience-validation/windows-j.zip`
|
|
|
|
Both archives have the following identical identities:
|
|
|
|
| Identity | Value |
|
|
| --- | --- |
|
|
| Archive bytes | `134850988` |
|
|
| Archive SHA-256 | `6ea9290736a059f1e17d8e89d9cf83506fa4abe2ba2f3731a7422a7b0f386e97` |
|
|
| Package manifest identity | `78a962b2bd3fa411413c79e9a8ffb021608a08ff020b1ad851f4505ea634b2b6` |
|
|
| Build-input identity | `6991ebbce6ae758c2bdd19a6ae934335aa585a50f86b18ccde8d88bca40ce436` |
|
|
| Raw `worker-package.json` SHA-256 | `e0b17d70fcb868fe39fac45ab6e05a17c6d40852e6034010fb63b6cab31f8a3c` |
|
|
|
|
Acceptance used the fresh extraction at `build/pwe-final-i-extracted`. Its own
|
|
`prepare-worker.ps1` established protected explicit ACLs before direct package
|
|
verification. Older G/H Windows archives are excluded because their preparation
|
|
script could leave packaged executables inaccessible.
|
|
|
|
### Linux worker image
|
|
|
|
Final independently built local tags:
|
|
|
|
- `truf-worker-test:operator-experience-final-3g`
|
|
- `truf-worker-test:operator-experience-final-3h`
|
|
|
|
Both provenance-disabled builds have the following identical identities:
|
|
|
|
| Identity | Value |
|
|
| --- | --- |
|
|
| Worker package identity | `45588f2cf406b41b239cfa3b8a9dc83fe84b587229bc997b2729016e1f0dde42` |
|
|
| Image manifest / accepted image ID | `sha256:3a088f5743121d823aae132234a29730a84339cecbfda5fc601e8e942f9948c3` |
|
|
| Config SHA-256 | `sha256:687a1c4c51c1b962c7fa7ea0cc4b04d159e7ba4f94ef347940c9fb225f7cb87d` |
|
|
| Raw `worker-package.json` SHA-256 | `ee926cce3c19e9e6094753f51fa902415bd7364c24fa649cd0c1b659c0aa4d60` |
|
|
|
|
The retained manifest snapshot is
|
|
`build/operator-experience-validation/linux-worker-package-g.json`.
|
|
|
|
### Trusted manifest registration
|
|
|
|
The accepted Linux and Windows manifests were registered after packaged E2E
|
|
acceptance. Their remote SHA-256 values match the raw manifest hashes above.
|
|
Both files are owned by `root:root` with mode `0644`; pre-change backups remain
|
|
intact and upload temporary files were removed. Registration required no runtime
|
|
restart or configuration mutation, and canonical health remained successful.
|
|
|
|
## Packaged Windows/Linux E2E
|
|
|
|
Run `35f3f52e232067c1` passed with the freshly extracted/prepared Windows I
|
|
package and Linux G image. The safe summary is
|
|
`build/pwe-35f3f52e232067c1/summary.json`.
|
|
|
|
The gate confirmed:
|
|
|
|
- real packaged Windows and Linux operation at two slots;
|
|
- server outage handling and restart recovery;
|
|
- durable and direct assignment bundle paths;
|
|
- authoritative receipt handling;
|
|
- graceful shutdown receipts;
|
|
- no active local work after completion while intentionally retained abandoned
|
|
roots remained inactive;
|
|
- matching normalized cross-platform evidence; and
|
|
- complete cleanup of owned resources with foreign Docker state unchanged.
|
|
|
|
## Production evidence
|
|
|
|
### Reconciliation
|
|
|
|
The retained snapshot records 34 issued assignments: 33 accepted and one
|
|
intentional expected expiry. All 33 accepted bundles were ingested, settled, and
|
|
projected. Final unresolved, precommit, quarantine, and drain-blocker counts were
|
|
zero.
|
|
|
|
Evidence sources:
|
|
|
|
- `build/operator-experience-validation/final-evidence.json`
|
|
- `build/operator-experience-validation/progress-v3-evidence.json`
|
|
- `build/operator-experience-validation/timeout-evidence.json`
|
|
- `build/operator-experience-validation/server-baseline.json`
|
|
|
|
### Duration percentiles
|
|
|
|
The table reports every retained end-to-end metric group. Values are seconds.
|
|
`Sufficient` means the server-side minimum sample count of five was met. Rows
|
|
below that minimum are retained observations, not statistically sufficient
|
|
percentile estimates.
|
|
|
|
| Platform | Source | Outcome | Samples | p50 | p95 | p99 | Sufficient |
|
|
| --- | --- | --- | ---: | ---: | ---: | ---: | --- |
|
|
| Linux | DockerHub | degraded | 1 | 305 | 305 | 305 | no |
|
|
| Linux | DockerHub | error | 1 | 19 | 19 | 19 | no |
|
|
| Linux | GitLab | error | 1 | 5371 | 5371 | 5371 | no |
|
|
| Linux | HuggingFace | expired | 1 | 7219 | 7219 | 7219 | no |
|
|
| Windows | DockerHub | clean | 2 | 31 | 31.9 | 31.98 | no |
|
|
| Windows | DockerHub | degraded | 4 | 275.5 | 443.45 | 462.29 | no |
|
|
| Windows | DockerHub | error | 7 | 619 | 1679.5 | 1731.1 | yes |
|
|
| Windows | GitLab | clean | 3 | 27 | 873 | 948.2 | no |
|
|
| Windows | GitLab | error | 6 | 342.5 | 1723.75 | 1916.75 | yes |
|
|
| Windows | HuggingFace | clean | 1 | 1019 | 1019 | 1019 | no |
|
|
| Windows | HuggingFace | error | 7 | 971 | 3092.6 | 3452.12 | yes |
|
|
|
|
The snapshot contains 11 Linux and 21 Windows phase/outcome metric groups in
|
|
total. Three Windows end-to-end error groups met the minimum; the other 29
|
|
phase/outcome groups did not. Rollout decisions must therefore preserve the
|
|
sample-count qualification rather than treating all reported percentiles as
|
|
stable capacity estimates.
|
|
|
|
### Progress and watchdog evidence
|
|
|
|
Reservation `1455` is the retained complete-stage progress reference. It was
|
|
acknowledged with an accepted bundle and persisted ten monotonic events spanning
|
|
`assigned`, `preparing`, `waiting_permit`, `scanning`, `filtering`, `cleaning`,
|
|
`bundling`, `uploading`, and `awaiting_receipt`. This demonstrates one coherent
|
|
server-visible sequence across the complete local execution and upload boundary.
|
|
|
|
Independent watchdog fault-injection coverage passed for blocked state
|
|
persistence, startup-gate persistence, and event draining. The contained runner
|
|
tests verify bounded process-tree termination rather than relying on scanner
|
|
cooperation. Packaged E2E additionally passed its watchdog, restart, durable
|
|
bundle, and cleanup gates.
|
|
|
|
### Natural full-stage timeout
|
|
|
|
Reservation `1453` is the retained natural timeout reference. The scan ended
|
|
with one `timeout / scan.stage_timeout / scanning` diagnostic after 603.367
|
|
seconds. The diagnostic was current and available, with no body or process-log
|
|
payload fabricated for the exception. The end-to-end assignment-resolution
|
|
duration was 619 seconds.
|
|
|
|
The scan outcome was `error`, while the transport outcome was independently
|
|
accepted: the bundle was acknowledged, the projection completed, and the
|
|
diagnostic was attached to the authoritative result. This confirms that a hard
|
|
scan-stage timeout remains a normal, uploadable terminal result and does not
|
|
collapse scan, transport, and projection outcomes into one status.
|
|
|
|
### Diagnostic and admin snapshots
|
|
|
|
The final diagnostic aggregate contains five grouped rows and 23 occurrences:
|
|
|
|
| Category | Code | Phase | Occurrences |
|
|
| --- | --- | --- | ---: |
|
|
| scanner | `scan.result_error` | `scanning` | 20 |
|
|
| timeout | `scan.stage_timeout` | `scanning` | 1 |
|
|
| assignment expiry | `assignment.deadline_expired` | `assigned` | 1 |
|
|
| network | `scan.result_error` | `scanning` | 1 |
|
|
|
|
The retained snapshots also confirm separate assignment and scan outcomes,
|
|
ordered progress, current diagnostic availability, accepted receipt state,
|
|
ingestion/settlement/projection completion, duration metrics, and zero unresolved
|
|
or precommit work. This is the durable machine-readable substitute for copying
|
|
private admin pages or unbounded diagnostic bodies into the report.
|
|
|
|
## Sanitized operator transcript
|
|
|
|
The release and validation sequence was:
|
|
|
|
1. Build the Windows package twice from the same reviewed inputs and compare the
|
|
archive, package-manifest, build-input, and raw-manifest identities.
|
|
2. Extract Windows I into a fresh directory, run its packaged
|
|
`prepare-worker.ps1`, and run direct package verification.
|
|
3. Build Linux G and H independently with provenance disabled and compare image,
|
|
config, package, and raw-manifest identities.
|
|
4. Run `docker/verify_packaged_workers.py` with the accepted Windows extraction,
|
|
Linux image, and isolated test image; retain only its safe summary and owned
|
|
evidence directory.
|
|
5. Register the two accepted trusted manifests through the reviewed deployment
|
|
path and recheck canonical runtime health.
|
|
6. Use typed operations to bound production dispatch, start at assignment cap
|
|
`1`, observe status/attach/history and server progress, exercise normal,
|
|
timeout, outage, and restart paths, and reconcile accepted, ingested, settled,
|
|
and projected counts.
|
|
7. Restore standard identities and normal/open controls, disable/revoke temporary
|
|
validation identities, and recheck runtime and edge health.
|
|
8. Run the exact focused pytest matrix recorded above.
|
|
|
|
Authentication values, worker argv, raw targets/findings, private route names,
|
|
and runtime configuration are omitted by design.
|
|
|
|
## Known limits
|
|
|
|
- There is no public ZIP download, image registry, installer, or automatic
|
|
updater. Release artifacts must move through a trusted channel and match a
|
|
server-registered manifest.
|
|
- Completed runner roots move under top-level `work/abandoned` and are retained
|
|
for at least 60 seconds; normal retention maintenance runs every 300 seconds.
|
|
They are inactive evidence, not live work.
|
|
- Most retained percentile groups have fewer than five samples. Their values are
|
|
useful validation observations but not stable performance baselines.
|
|
- Ownership fencing guarantees one authoritative acceptance, not exactly-once
|
|
physical execution across a long partition and server-side expiry/reissue.
|
|
- Local state remains recovery authority until the server resolves the slot.
|
|
Operators must not remove pending bundles or work trees to clear an alert.
|
|
|
|
## Rollout, rollback, and restoration
|
|
|
|
Rollout uses the exact accepted package identities, begins with one user/device at
|
|
server cap `1` and local parallelism `1`, and requires one accepted, ingested,
|
|
settled, and projected assignment before expansion. Caps and client count should
|
|
increase in stages while unresolved/precommit counts, diagnostic availability,
|
|
duration sample counts, and authenticated contact remain observable.
|
|
|
|
Rollback first sets the affected cap to `0`, allows pending uploads to resolve,
|
|
and obtains a graceful shutdown receipt. The operator then returns to the
|
|
previous exact artifact while preserving the same private state tree or volume.
|
|
Additive server progress and diagnostic records do not require schema rollback.
|
|
|
|
Final restored production state:
|
|
|
|
- operations controls normal/open at revision `126`;
|
|
- standard WSL production worker user enabled at assignment cap `1`;
|
|
- standard production device enabled and not revoked;
|
|
- temporary validation identities disabled/revoked;
|
|
- unresolved, precommit, quarantine, and drain blockers at zero;
|
|
- canonical runtime healthy; and
|
|
- edge service remained available.
|
|
|
|
Strict OpenSpec validation passed. The operationally validated change is ready
|
|
for archival.
|