diff --git a/.env.template b/.env.template index 44023433..3574c9f9 100644 --- a/.env.template +++ b/.env.template @@ -4,6 +4,10 @@ # loopback-only. # --- HTTP / WS --- +# Prism supplies the one shared Solar/Orion native receiver. When set, Orion +# must verify it before startup and on every readiness request. +ORION_LSDP_NATIVE_ADDRESS= +ORION_LSDP_NATIVE_RESOURCE=orion/state ORION_LISTEN_ADDR=127.0.0.1:4007 ORION_INTERNAL_ADDR=127.0.0.1:4017 # /internal/metrics, local diagnostics only # B7 (ADR 003 §3.1.6, #89): /internal/metrics exports @@ -32,7 +36,6 @@ ORION_COMPILER_CACHE_DIR=/var/lib/orion/compiler-cache # ZabAuth /validate endpoint, called via ZabGate. # Cache TTL bounds how long Orion trusts a "valid" answer for a given jti. ORION_ZABAUTH_VALIDATE_URL=http://127.0.0.1:4000/auth/api/v1/tokens -ORION_AUTH_CACHE_TTL_S=60 # Durable service token (ADR ZabAuth 003 Amendment 3 § A3.3 parts 1/2/5). # Orion holds its outbound credential BY POSSESSION of a refresh token and @@ -216,3 +219,8 @@ ORION_LOCAL_EDITOR_TOKEN= # Cosmetic user id stamped on the local operator Identity. Optional; the # role (operator) is what gates, not the user id. ORION_LOCAL_AUTH_USER=local-operator + +# Orion-owned durable global Blue intent (LSML). Empty uses local runtime data. +# ORION_STREAM_INTENT_PATH=C:/Users/operator/AppData/Roaming/Prism/local-runtime/stream-control.lsml +# Installed local overlay declaration, read-only. Empty declares no executable. +# ORION_OVERLAY_APPS_PATH=C:/Users/operator/AppData/Roaming/Prism/overlay-apps.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12e90cb8..86d00804 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,15 +42,10 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - # Pinned to an exact patch (not "1.26.x") after govulncheck kept - # finding 6 stdlib CVEs (net/url, crypto/tls, net/http, - # encoding/xml, encoding/asn1) fixed upstream in go1.26.6 but - # still resolving to go1.26.5 here — the runner's local toolchain - # cache/image apparently pinned an older patch under the wildcard. - # Bastion clearance: CLEARED_WITH_CONDITIONS (Orion#336) — DoS-only - # CVEs, no RCE/confidentiality/integrity impact, no veto. Bump the - # pin again when a newer patch closes a future govulncheck finding. - go-version: "1.26.6" + # Pin the patch instead of a wildcard. govulncheck found reachable + # net/http and crypto/tls vulnerabilities with Go 1.26.6; the + # upstream fixes are in Go 1.26.9 (released 2026-10-08). + go-version: "1.26.9" # cache disabled on purpose (all 8 Go jobs). The setup-go cache # never helps on this self-hosted pool: runners are EPHEMERAL so # the on-disk Go cache never survives, and the GitHub Actions cache @@ -288,7 +283,7 @@ jobs: fi - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token @@ -329,7 +324,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token @@ -370,7 +365,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token @@ -412,7 +407,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token @@ -451,7 +446,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token @@ -490,7 +485,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token @@ -529,7 +524,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: mint Blue-read App token for private Go module fetch id: blue-read-app-token diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3dfd8fe..10737045 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,7 +43,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@v6 with: - go-version: "1.26.6" + go-version: "1.26.9" cache: false - name: Mint Blue-read App token id: blue-read-app-token diff --git a/CLAUDE.md b/CLAUDE.md index 8af30c24..634d315b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,176 +1,49 @@ -# Orion - -@../../docs/rules/git.md -@../../docs/rules/security.md -@../../docs/rules/agents.md -@../agents/_shared/architecture.md -@../agents/_shared/conventions.md -@../agents/_shared/deploy.md -@../agents/_shared/projects.md -@../agents/_shared/live-testing.md - -## Status — local Prism runtime - -Orion v2 (Go) is the local runtime embedded and launched by Prism. The v0.x Python implementation -was deleted on 2026-05-02; the Go rewrite shipped progressively through -205 merged PRs. ADR 004 (Orion v2 runtime) and ADR 005 (Quasar concerns -relocation) were superseded or absorbed during the build campaign — their -slot numbers (004, 005) are no longer present in `docs/adr/`; the -numbering jumps 003 → 006 (ADR 006 = exec-activation R9-lift). This is -not a gap: ADR 004/005 content was folded into ADR 003 §3.x and the -Quasar CLAUDE.md respectively before the slot files were removed. - -## Stack - -| Layer | Technology | -|---|---| -| Runtime | Go 1.26.2 — single statically-linked binary | -| HTTP / WS | `net/http` (1.22 routing) + `coder/websocket` | -| DB | SQLite in the Prism user-data directory | -| Logging | `log/slog` | -| Metrics | `prometheus/client_golang` on internal-only endpoint | -| Test | stdlib `testing`; `httptest` + `coder/websocket` test client | - -No web framework. Stdlib + small libs. - -## Layout - -``` -Orion/ -├── cmd/orion/main.go process entry, wires every dep -├── internal/ -│ ├── compiler/ Canvas+Blue+components → graph+bundle -│ ├── runtime/ show, scene loop, tick, test sessions -│ ├── adapters/ inbox, http poller, pg-listen -│ ├── ws/ upgrade, codec, connection -│ ├── api/ HTTP handlers (one file per resource) -│ ├── store/ pgx repositories -│ ├── auth/ ZabGate header parsing + show-token validate -│ ├── obs/ slog, prom metrics, panic handler -│ ├── protocol/ ADR 002 envelope + golden fixtures -│ └── config/ env parsing -├── migrations/0001_init.sql retained schema fixtures (not a remote service) -├── Dockerfile optional local image build -├── docker-compose.yml local-dev compose -├── tests/e2e/ build-tagged tests against a live PG -├── .github/workflows/ci.yml vet / test / build / staticcheck / golangci / trufflehog -├── .env.template every env var documented -└── go.mod go 1.26.2 +# Orion — contexte courant + +Orion est un runtime Go local lancé par l'hôte applicatif. Il admet les capsules +ZabCanvas signées, prépare les programmes Blue validés et publie leurs sorties au +récepteur LSDP natif partagé. Solar rend le LSML avec Vision. Aucun bundle Solar +n'est compilé au switch. Program, Preview, générations et sessions de test ont +leurs identités et ressources natives distinctes. + +## Points d'entrée et invariants + +- cmd/orion/main.go injecte les dépendances, secrets locaux, catalogue et producer. +- internal/api/public.go est le propriétaire des routes réellement enregistrées. +- internal/api/scene_intent.go admet la référence source/Blue et tient le bail de + commit bluehost par voie jusqu'à la barrière native ; Preview reste indépendante. +- internal/lsdpreception conserve la transaction pendant une reprise transport, + expose l'état de livraison et refuse un résultat ambigu après perte de reçu. +- internal/streamcontrol conserve les règles et intentions en LSML, puis réconcilie + les processus possédés. Ce fichier est un snapshot durable, pas un abonnement. +- internal/providers et internal/bluehost possèdent les capacités typées, + disponibilité et politiques Preview. Le catalogue Blue authorable est externe. + +Les anciennes routes push/store, render-bundle et LSDP/1 ne sont pas enregistrées +par l'exécutable. Les modules conservés ont leurs consommateurs documentés ; les +ADR et runbooks anciens restent des traces historiques, pas la vérité des routes. +La sélection désirée dans orion/state est raccordée au catalogue signé et aux +deux présentations Solar. Le coordinator prépare, attend le renderer et conserve +l'ancien host/bridge/frame pour compensation avant finalisation. Après celle-ci, +aucun rollback distribué d'effets externes n'est promis. Seule la sélection désirée +et les sources/capsules immuables sont persistées ; les mutations live restent en RAM. +La clé admise artifact_set_digest reste distincte de l'adresse LSML scene_version. + +## Lecture et validation + +Lire README.md, docs/development/scene-feature-map.md et le README du propriétaire. +Pour les contrats de source/admission : docs/development/source-render-boundary.md. +Pour une capacité : docs/development/extending-orion.md. Pour les incidents natifs : +docs/runbooks/native-recovery.md. .env.template et internal/config font autorité sur +la configuration. Ne pas confondre un port ouvert avec la readiness. + +```sh +go test ./... +go vet ./... +staticcheck ./... +go build -o ./bin/orion ./cmd/orion ``` -## Endpoints - -All routes start at `/api/v1/...` (ZabGate strips its `/orion` -prefix on the way in). Source: `internal/api/public.go`. - -| Method + path | Purpose | -|---|---| -| `GET /api/v1/health` | liveness | -| `GET /api/v1/ready` | readiness (local store + scene roster) | -| `POST /api/v1/scenes/{id}/push` | compile + persist + activate | -| `GET /api/v1/scenes/{id}/render-bundle?v={hash}` | Solar fetch (content-hashed) | -| `GET /api/v1/scenes/{id}/lsml-bundle?v={hash}` | LSML bundle for authoring tools (ADR 002) | -| `GET /api/v1/scenes/{id}/operator-inputs?v={hash}` | non-Solar surface | -| `GET /api/v1/scenes/{id}/graph?v={hash}` | internal debug | -| `POST /api/v1/scenes/{id}/status` | archive / reactivate | -| `POST /api/v1/scenes/{id}/validate` | validate + gate antenna-eligibility (ADR 003 §3.2.2) | -| `GET /api/v1/scenes/{id}/validation` | read last validation record | -| `POST /api/v1/scenes/{id}/exec/completion` | exec completion probe (ADR 006) | -| `POST /api/v1/validate/simulate` | service-scoped simulate (ADR 015, Amendment 1) | -| `GET /api/v1/show` | show summary | -| `POST /api/v1/show/active-scene` | switch active scene | -| `POST /api/v1/show/test-sessions` | open isolated test session | -| `POST /api/v1/show/stream-rules` | create stream-level Blue rule (ADR 009) | -| `DELETE /api/v1/show/stream-rules/{id}` | delete stream-level rule | -| `GET /api/v1/assets/{id}` | content-addressed binary | -| `GET /api/v1/credentials/{id}/stream-key` | preserved verbatim — currently 503 until Quasar wires it | -| WS `/api/v1/show/stream` | live show (legacy) | -| WS `/api/v1/show/stream.lsdp` | LSDP wire — `ORION_LSDP_MODE=dual` required; subprotocol `lsdp.v1.1` | -| WS `/api/v1/scenes/{id}/test` | isolated scene preview (`?session={uuid}`) | -| `GET /static/solar/v{N.N.N}/*` | static Solar bundle (immutable, long TTL) | -| `POST /api/v1/operator/call/{blueprint_id}/{entrypoint}` | fire `core.operator.on-call@1` spine (active-only, 409 if dormant) — Blue ADR 008 §3.2. `{blueprint_id}` = the scene-local blueprint key; the DEFAULT (legacy single / blueprint-free) key is addressed with the token `_` (the empty key cannot ride a path segment). Same token the cockpit announces; `_` is reserved as an authored key (ADR 016 RC-6). | -| `POST /api/v1/operator/resolve/{blueprint_id}/{await_name}` | resolve `core.operator.await-value@1` (type-checked; 410 if scene inactive) — Blue ADR 008 §3.3 | -| `GET /api/v1/runtime/{blueprint_id}/pending` | list armed await-value points — Blue ADR 008 §3.3 | -| `GET /api/v1/cockpit/contracts?stream_id={id}` | aggregate operator-UI contract (params/triggers/awaits, scope scene|stream-level) — Blue ADR 008 §3.5 | -| `GET /api/v1/db/{service}/schema` | introspectable DB catalogue for datasource selectors — Blue ADR 008 §3.4 | - -## Resolution criteria — coverage - -The 18 criteria from the chantier brief (15 from ADR 004 § 12 + 3 -chantier-specific). Status updated post-#88 (conformance matrix merged, -`c145e49`) and post-ADR 006 (exec activation + IMPURE_COMPUTE retired): - -| # | Criterion | Coverage | -|---|---|---| -| 1 | `POST /push` accepts envelope, advances `latest_pushed_version`; malformed leaves it unchanged. **ADR 003 #1 (master conformance) — COVERED** (#88 `c145e49`): CI job `conformance-matrix` asserts every manifest node has a registered executor + passing test; ratchet armed. | `internal/api/scenes_push.go` + `tests/e2e/push_test.go` + `internal/conformance/` (job `conformance-matrix`) | -| 2 | `POST /show/active-scene` rejects scenes never pushed (`SCENE_NOT_PUSHED`). **ADR 003 #2 (no capability rejection) — COVERED** (#88 `c145e49`): `TestConformance_Matrix` pushes a blueprint with one node of each served type; `conformance-matrix` CI job gates it. | `internal/api/show.go` + `internal/conformance/conformance_test.go::TestConformance_Matrix` | -| 3 | `GET /render-bundle?v=` byte-for-byte match + immutable cache header. | `internal/api/scenes_get.go` | -| 4 | WS `/show/stream` input-to-delta ≤ 50 ms. | `internal/ws/server_test.go::TestWS_OperatorEndToEnd` (200 ms threshold via WS) + `internal/runtime/scene_test.go` (50 ms direct). | -| 5 | Scene switch emits `scene_changed` + `snapshot` ≤ 100 ms. | `internal/runtime/scene_test.go::TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged` | -| 6 | 5 Hz HTTP poll → leaf writes + deltas. | `internal/adapters/poller_test.go::TestPoller_5HzWritesAtCadence` | -| 7 | Test session WS accepts `__test.*`; live show rejects with `WRITE_FORBIDDEN`. | `internal/ws/server_test.go::TestWS_LiveRejectsTestNamespace` | -| 8 | Pulsar CEF show-token → viewer; cannot send `input`. | `internal/ws/server_test.go::TestWS_ViewerCannotInput` | -| 9 | Re-push of active scene mid-broadcast emits `scene_changed` + fresh `snapshot`. | `internal/api/scenes_push.go` (push handler), runtime tests cover the emit path. | -| 10 | Pushing not-loaded scene makes it live without restart. | `internal/api/scenes_push.go::Show.Load` (idempotent swap). | -| 11 | Restart reseeds from declared defaults (no persisted live state). | `internal/runtime/state.go::State.Seed` + `cmd/orion/main.go::loadActiveScenes`. | -| 12 | Solar bundle served from `/static/solar/v{N}/*` with long-TTL cache. | `internal/api/static.go` | -| 13 | Archive purges compiled artefacts; pointer reset to null. | `internal/api/scenes_get.go::handleArchive` | -| 14 | Archive on active scene rejected with `SCENE_IN_USE`. | `internal/api/scenes_get.go::handleArchive` | -| 15 | `{rollback_to: ...}` re-points without recompile. | `internal/api/scenes_push.go::handleRollback` | -| 16 | Solar mock-orion fixtures round-trip against the real Orion. | `internal/protocol/fixtures_test.go` (golden fixtures byte-stable). | -| 17 | Cyclic component reject (`CYCLIC_COMPONENT`). | `internal/compiler/compile_test.go::TestCompile_CyclicComponent` | -| 18 | Impure compute reject (`IMPURE_COMPUTE`). **SUPERSEDED par ADR 006** : la partition exec-compilateur tue ce reject ; purity devient scheduling metadata. Les deux tests `TestCompile_ImpureCompute` sont réécrits en assertions de partition (ADR 006 §3.2 + §6 #3). | ~~`internal/compiler/compile_test.go::TestCompile_ImpureCompute`~~ → voir ADR 006 §3.2 | - -## ADR ledger — post-ADR 006 decisions (accepted, on main) - -| ADR | Title | Status | Key fact | -|---|---|---|---| -| 007 | `core.db.*` atomics as pure descriptor builders | accepted | PR #142 · `compute_db.go` | -| 008 | Active-scene-only execution (dormant roster) | accepted + Amendment 1 | PR #152 (#163 amendment) · inbox routing, freeze-resume | -| 009 | Stream-level Blue rules | accepted | PR #156 #157 · stream-rule union routing + `core.show.emit@1` | -| 010 | `core.http.request@1` canonical executor + content hardening | accepted | PR #160 · query/headers/response_headers/timeout_ms + host-only logging | -| 011 | `core.animation.play@1` keyframe lowering (ADR 003 §3.4 reconciliation) | accepted | PR #161 #164 #167 · scalar gen leaf, compiler lowering, I7 live proof | -| 012 | `core.source.read@1` reclassified to pure compute (Option B) | accepted | PR #165 #166 · compile-time resolution, `__resolved_source` in Config; Blue `is_pure` flip pending | -| 013 | Platform-event exec entrypoint (`core.event.on-platform-event@1`) | accepted | PR #170 #171 #173 #175 · exec entrypoint arming `__events` leaf, reactive payload binding, stream-level rule finale | -| 014 | Blueprint-reference support via compile-time subgraph expansion | accepted | PR #183 #184 #185 #189 #190 · expand at compile, cyclic detection (`CYCLIC_BLUEPRINT_REFERENCE`), `__vars` input-reader promotion | -| 015 | Service-scoped simulate endpoint | accepted + Amendment 1 (2026-06-16) | PR #198 #200 #201 · `POST /validate/simulate`; Amendment 1 = compile Blue graph in-body (not pre-compiled) | -| Blue 008 | Operator-UI contract (runtime surface — Orion side) | accepted | PR #209 #210 #211 #213 #215 · operator call/resolve/pending routes, cockpit aggregate, DB catalog — see Blue ADR 008 | - -> Full resolution criteria live in each ADR doc (`docs/adr/`). -> ADR 010 and ADR 012 doc files were committed with this resync (scribe/solar-v029-adr-sync). -> ADR 013/014/015 added by resync 2026-06-20 (drift report). -> Blue ADR 008 (operator-UI contract) added 2026-06-21 : Orion runtime surface delivered in #209/#210/#211/#213/#215. - -## Solar version history - -| Version | Status | Key change | -|---|---|---| -| v0.2.8 | installed, kept | URL/auth/value fixes (go-live Solar) | -| v0.2.9 | **current go-live** | box `position:absolute;inset:0` + `translateX→x`/`translateY→y` framer-motion (animation fix, ADR 011 I7) | - -`SOLAR_VERSIONS: "v0.2.8 v0.2.9"` in `ci.yml` (PR #168). Go-live URL: `static/solar/v0.2.9/host/index.html`. -Rollback: re-point browser-source to `v0.2.8` (already on VPS, instant). Runbook: `docs/runbooks/solar-v029-animation-fix.md`. - -## Resolution criterion (branch-level, per workspace `git.md`) - -The local runtime is resolved when: -1. CI is green on `main`. -2. Prism launches Orion on loopback with the generated handshake and the - local health/readiness probes return 200. -3. Smoke run: `POST /scenes/{id}/push` against loopback Canvas/Blue stubs - round-trips; `WS /show/stream` accepts a connection. - -## Concerns relocated - -- **Twitch** (OAuth Helix + IRC chat + EventSub) → **Quasar** (ADR 005). - No code lifted from the v0.x Python; Quasar implements the surface - from scratch. -- **Streaming media plane** (RTMP / WHIP via MediaMTX) → **Pulsar**. - Pulsar pushes RTMP directly to Twitch. - -## Concern preserved verbatim - -- The stream-key handover endpoint - `GET /orion/api/v1/credentials/{id}/stream-key` — referenced by - Prism's `src/main/broadcast-engine.ts`. Returns 503 - (`TWITCH_CREDENTIAL_UNAVAILABLE`) until Quasar wires through. +Les scénarios Rust, CEF, caméra et Marker demandent un opt-in et des preuves +séparées ; leur skip ne valide pas le chemin réel. La campagne locale du 5 octobre +2026 est référencée dans docs/development/maturity.md, avec hashes et exclusions. diff --git a/README.md b/README.md index 02d96e7a..96300d3d 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,76 @@ # Orion -[![Release](https://img.shields.io/github/v/release/ZabLaboratory/Orion?logo=github)](https://github.com/ZabLaboratory/Orion/releases/latest) -[![CI](https://github.com/ZabLaboratory/Orion/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/ZabLaboratory/Orion/actions/workflows/ci.yml) -[![Local runtime release](https://img.shields.io/badge/Prism-local%20runtime-0f766e)](https://github.com/ZabLaboratory/Orion/releases/latest) +Orion est le runtime local d'exécution broadcast. Il admet les capsules signées +ZabCanvas, exécute leurs programmes Blue validés, expose les contrats opérateur +et publie les mutations LSML au récepteur LSDP natif partagé. Solar rend ces +documents avec Vision. Un changement de scène ne compile aucun bundle Solar. -Reactive runtime for the Zablab broadcast platform's compiled scenes. -Owns the scene compiler (Canvas + Blue + components → graph + Solar -render bundle), per-scene goroutine event loops, and the WS fan-out -to live show subscribers (Solar, Prism, mPrism, Companion, Quasar). +Program et Preview ont chacun leur instance Blue et leur ressource native. +Les stream-rules ont leurs propres instances et survivent au changement de scène. +Le LSML durable stream-control conserve les règles activées et l'intention des +applications ; le contrôleur de processus maintient leur état réel, dont Marker. -- **Port** : `127.0.0.1:4007` (HTTP + WS) -- **Internal port** : `127.0.0.1:4017` (local diagnostics only) -- **Local base path** : `/orion` (loopback only; no remote gateway deployment) -- **Status** : v2 local runtime — the same Go runtime is built as the - Prism sidecar; the former remote Orion service and gateway deployment are - retired. See - [CLAUDE.md](./CLAUDE.md) for the layout map and resolution matrix; - [ADR 004](../docs/adr/004-orion-v2-runtime.md) for the contract. +## Responsabilités -## Prism local runtime +| Responsabilité | Propriétaire | Contrat | +|---|---|---| +| Démarrage et autorité locale | cmd/orion/main.go | Loopback et secret de handshake par requête | +| Admission de scène | internal/api/scene_intent.go | Référence signée, digests, bail de commit par voie, barrière native | +| Exécution Blue | internal/bluehost et internal/bluewire | Step initial avant ticks ; calls/awaits typés, événements bornés | +| Capacités | internal/providers et bluehost/effect_*.go | Disponibilité configurée et politique Preview explicite | +| Publication et reprise native | internal/lsdpreception | Identité de transaction conservée, queue bornée, refus des issues ambiguës | +| Règles et processus locaux | internal/streamcontrol | Intention atomique durable, PID possédé, réconciliation et OFF | +| Affichage et médias | Solar, Vision, Pulsar | Révision source exacte, textures caméra, composition CEF | -Each Orion release tag publishes platform binaries and -`prism-orion-runtime-manifest.json`. The manifest includes the SHA-256 digest -of every platform artifact and the Blue runtime `source_digest` embedded at -build time. Prism downloads the matching local binary during its authenticated -startup gate, verifies the digest, and activates it only after Blue confirms -the same pair. Scene switching and show-slot execution then stay on the local -Orion process; ZabCanvas, ZabTruth, ZabRanking and Quasar remain gateway -services for synchronization and live data. No release is deployed as a public -Orion endpoint. +L'adresse source est artifact_set_digest ; Blue et l'interface opérateur utilisent +scene_digest. Ces valeurs peuvent différer. L'hôte applicatif lance le nÅ“ud natif +avec le serveur packagé Solar ; Orion le vérifie et l'utilise sans second daemon. -## Quick start +## Surface opérateur et diagnostic -```sh -# Install deps + verify -go mod tidy -go vet ./... -go test ./... +HTTP écoute sur loopback 4007, les diagnostics sur 4017 par défaut. +internal/api/public.go est le propriétaire canonique des routes. -# Build the binary -go build -o ./bin/orion ./cmd/orion - -# Boot the local Prism sidecar against a loopback gateway fixture -ORION_PROFILE=embedded-local \ -ORION_LOCAL_OPERATOR_SECRET=dev-only-change-me \ -ORION_SQLITE_PATH=./.orion/orion.sqlite \ -ORION_ZABAUTH_VALIDATE_URL=http://127.0.0.1:4000/auth/api/v1/tokens \ -ORION_CANVAS_BASE_URL=http://127.0.0.1:4000/canvas \ -ORION_BLUE_BASE_URL=http://127.0.0.1:4000/blue \ -ORION_ZABGATE_URL=http://127.0.0.1:4000 \ -./bin/orion -``` +| Entrée | Comportement | +|---|---| +| POST /api/v1/host/scene-intent | Admission Preview ou Take Program | +| GET /api/v1/host/status | Identités chargées et dernière projection | +| GET /api/v1/cockpit/contracts | Inputs source, triggers et awaits | +| POST /api/v1/operator/call/{blueprint}/{entrypoint} | Appel opérateur admis | +| POST /api/v1/operator/resolve/{blueprint}/{await} | Résolution typée | +| GET /api/v1/runtime/host-surface | Capacités, disponibilité, limites et état de livraison native | +| GET /api/v1/show/stream-rules | Instances globales activées | +| GET /api/v1/show/overlay-apps | État réel PID/running/error | +| GET /api/v1/ready | Dépendance native et contrôleur local vérifiés | -## Repository layout +Les ressources de rendu sont solar/program, solar/preview, solar/generations et +solar/sessions. orion/state porte les projections de contrôle. Les anciennes +routes push/store et LSDP/1 de rendu ne sont pas enregistrées par l'exécutable. +Les modules de compatibilité conservés ont des consommateurs/tests explicites. -See [CLAUDE.md](./CLAUDE.md) — full tree plus the spec → file mapping -for every chantier resolution criterion. +## Développement et qualification -## Concerns relocated +```sh +go test ./... +go vet ./... +staticcheck ./... +go build -o ./bin/orion ./cmd/orion +``` -- **Twitch** (OAuth Helix + IRC chat + EventSub) → **Quasar** (ADR 005). -- **Streaming media plane** (RTMP/WHIP via MediaMTX) → **Pulsar** - (bundled in Prism). +Consulter .env.template et internal/config pour les paramètres réels : secret +local, adresse/ressource native, clés de confiance Canvas et capsules exactes. +Un port ouvert ne prouve pas la readiness. Les tests natifs/Marker sont opt-in ; +un skip ne compte jamais comme preuve d'exécution complète. -## Concern preserved verbatim +- [Carte des fonctionnalités](docs/development/scene-feature-map.md) +- [Frontière source et rendu](docs/development/source-render-boundary.md) +- [Ajouter une capacité](docs/development/extending-orion.md) +- [Reprise native](docs/runbooks/native-recovery.md) +- [Maturite locale et preuves](docs/development/maturity.md) +- [Publication native](internal/lsdpreception/README.md) +- [Contrôle durable](internal/streamcontrol/README.md) -- `GET /orion/api/v1/credentials/{id}/stream-key` — exposed on the local - loopback runtime and referenced by - Prism's main process. Returns 503 until Quasar wires the - underlying Twitch credential storage. +Cette migration est qualifiée localement, sans publication ni déploiement. +Un petit LSML déclarant une scène désirée ne déclenche pas encore l'admission +coordonnée Blue/contrats/Solar. La synchronisation et le transfert d'autorité Prism +restent hors de ce périmètre. Les limites courantes sont dans la frontière source. diff --git a/cmd/orion/camera_slot_mirror.go b/cmd/orion/camera_slot_mirror.go index ade3c25e..9c3bb46d 100644 --- a/cmd/orion/camera_slot_mirror.go +++ b/cmd/orion/camera_slot_mirror.go @@ -2,7 +2,6 @@ package main import ( "github.com/ZabLaboratory/Orion/internal/bluehost" - "github.com/ZabLaboratory/Orion/internal/lsdp" ) // cameraSlotMirror fans one editor projection into the two non-Pulsar @@ -14,7 +13,7 @@ type cameraSlotMirror struct { mirrors []bluehost.SlotAssignmentMirror } -func newCameraSlotMirror(preview, antenne *lsdp.Wire) bluehost.SlotAssignmentMirror { +func newCameraSlotMirror(preview, antenne bluehost.SlotAssignmentMirror) bluehost.SlotAssignmentMirror { mirrors := make([]bluehost.SlotAssignmentMirror, 0, 2) if preview != nil { mirrors = append(mirrors, preview) diff --git a/cmd/orion/main.go b/cmd/orion/main.go index 9bb92750..fbe37467 100644 --- a/cmd/orion/main.go +++ b/cmd/orion/main.go @@ -27,6 +27,7 @@ import ( "github.com/ZabLaboratory/Orion/internal/config" "github.com/ZabLaboratory/Orion/internal/effects" "github.com/ZabLaboratory/Orion/internal/lsdp" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" "github.com/ZabLaboratory/Orion/internal/obs" "github.com/ZabLaboratory/Orion/internal/providers" "github.com/ZabLaboratory/Orion/internal/runtime" @@ -63,6 +64,22 @@ func run() error { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() + if cfg.NativeLSDPAddress == "" { + return errors.New("ORION_LSDP_NATIVE_ADDRESS_REQUIRED") + } + reception, err := lsdpreception.New(cfg.NativeLSDPAddress, cfg.NativeLSDPResource) + if err != nil { + return err + } + if err := reception.Check(ctx); err != nil { + return fmt.Errorf("shared native LSDP not ready: %w", err) + } + producer := lsdpreception.NewProducer(ctx, reception) + defer producer.Close() + nativeHub := lsdpreception.NewHub(producer, logger) + if reception.PhysicalLanes.Load() { + nativeHub.EnablePhysicalLanes() + } // Orion has one executable posture now: the Prism-embedded local sidecar. // config.Load rejects the retired remote profile; keep this guard at the @@ -95,93 +112,37 @@ func run() error { show.SetWSMetrics(metrics) defer show.Stop() - // LSDP/1.1 wire (ADR 007 §C.3b) — built and installed on the show - // only in dual/lsdp mode, before cold-start so every loaded scene is - // paired with a kit scene. In bespoke mode the wire is nil: the kit - // is never constructed and the bespoke WS is the only wire (no-op - // deploy). Gateway-first holds by construction — the wire derives - // identity from the SAME local operator AuthSource as the HTTP gates and - // the bespoke WS; no JWT, no token. - var lsdpHandler http.Handler - var sessionWires runtime.SessionWireFactory - var previewLSDPHandler http.Handler - var generationLSDPHandler http.Handler - var previewSlot *runtime.PreviewSlot - var antenneWire *lsdp.Wire - var previewWire *lsdp.Wire - var generationWires *lsdp.GenerationWires - if cfg.LSDPMode == config.LSDPModeDual || cfg.LSDPMode == config.LSDPModeLSDP { - wire, err := lsdp.NewWire(logger, authSource) - if err != nil { + // One native receiver is supervised by Prism. Orion publishes source LSML, + // authored leaf mutations and isolated generations; it owns no LSDP listener. + antenneWire := nativeHub.Lane("program") + streamStore, streamControl, closeApps, err := wireStreamControl(cfg, antenneWire) + if err != nil { + return err + } + defer closeApps() + nativeFlush := func(ctx context.Context) error { + if err := producer.Flush(ctx); err != nil { return err } - // LSDP Snapshot identity-gap observability (ADR-BLUE-012 §16.1, - // B3-R6-16-ORION-PGM): orion_lsdp_snapshot_identity_gap_total{scene_id} - // counts a reseed that drops a KNOWN projection identity because the - // Snapshot frame has no metadata field — never a fix, just makes the - // wire-schema limitation observable instead of silent. - wire.SetSnapshotMetrics(metrics) - show.SetMirrors(wire) - antenneWire = wire - lsdpHandler = wire.Handler() - if cfg.Profile.IsEmbeddedLocal() && cfg.LocalViewerToken != "" { - lsdpHandler = lsdp.AllowLoopbackBrowserOrigin(lsdpHandler) - lsdpHandler = auth.LocalViewerQuery( - cfg.LocalViewerToken, - cfg.LocalAuthSecret, - lsdpHandler, - ) - } - // Per-session preview LSDP wire (preview/antenne split): each test - // session gets its OWN isolated kit server so the preview Solar - // runtime follows only the session clone, never the antenne's - // active scene. Wired onto the TestSessionManager below. - sessionWires = lsdp.NewSessionWireFactory(logger, authSource) - - // Persistent PREVIEW wire (preview/antenne split, the working model): - // a SECOND lsdp.Wire beside the antenne's. The cockpit preview Solar - // connects here ONCE (fixed /show/preview.lsdp); switching the previewed - // scene swaps this wire's active clone via PreviewSlot.Activate → - // previewWire.SetActive (scene_changed + snapshot over the existing - // socket, no reload). The antenne wire above is never touched, so a - // preview switch can never flip the live antenne. - var pwErr error - previewWire, pwErr = lsdp.NewWire(logger, authSource) - if pwErr != nil { - return pwErr - } - previewWire.SetSnapshotMetrics(metrics) - previewLSDPHandler = previewWire.Handler() - generationWires = lsdp.NewGenerationWires(logger, authSource) - generationLSDPHandler = generationWires.Handler() - if cfg.Profile.IsEmbeddedLocal() && cfg.LocalViewerToken != "" { - previewLSDPHandler = lsdp.AllowLoopbackBrowserOrigin(previewLSDPHandler) - previewLSDPHandler = auth.LocalViewerQuery( - cfg.LocalViewerToken, - cfg.LocalAuthSecret, - previewLSDPHandler, - ) - generationLSDPHandler = lsdp.AllowLoopbackBrowserOrigin(generationLSDPHandler) - generationLSDPHandler = auth.LocalViewerQuery( - cfg.LocalViewerToken, - cfg.LocalAuthSecret, - generationLSDPHandler, - ) + return streamControl.Error() + } + receptionCheck := func(ctx context.Context) error { + if err := producer.Check(ctx); err != nil { + return err } - previewSlot = runtime.NewPreviewSlot(ctx, registry, previewWire, logger) - // Editable Preview → live uses the immutable generation registry only. - // The antenne/Program wire remains owned by the regular scene-intent - // path; hot editable patches fan out to this generation mirror after an - // explicit operator hand-off. - previewSlot.SetEditableAirWire(generationWires) - defer previewSlot.Close() - logger.Info("lsdp wire enabled", "mode", string(cfg.LSDPMode)) + return streamControl.Error() } + previewWire := nativeHub.Lane("preview") + generationWires := nativeHub + show.SetMirrors(streamMirrors{MirrorRegistry: antenneWire, controller: streamControl}) + previewSlot := runtime.NewPreviewSlot(ctx, registry, previewWire, logger) + previewSlot.SetEditableProgramWire(antenneWire) + previewSlot.SetEditableAirWire(generationWires) + defer previewSlot.Close() testMgr := runtime.NewTestSessionManager(registry, logger, 5*time.Minute) - if sessionWires != nil { - testMgr.SetSessionWires(sessionWires) - } + testMgr.SetSessionWires(nativeHub) + go testMgr.RunSweep(ctx) defer testMgr.Close() // Scene-validation harness (ADR 003 §3.2, issue #87). CPU-bound and @@ -195,8 +156,6 @@ func run() error { tick.Run() defer tick.Stop() - _ = auth.NewValidator(cfg.ZabAuthValidateURL, cfg.ServiceToken, cfg.AuthCacheTTL) - // Engine B egress uses a durable family only to obtain exact, short-lived // route tokens. The family bearer is never sent to a data route, and an // absent/expired exchange fails closed in the effect. The local sidecar @@ -280,8 +239,7 @@ func run() error { Logger: logger, } // Editor-authored Meet slots and Blue assign-slot effects share the same - // bounded projection fan-out. The preview wire is a separate consumer lane; - // Pulsar/Program is deliberately not part of this mirror. + // bounded native projection fan-out to separate Program and Preview resources. cameraSlots := newCameraSlotMirror(previewWire, antenneWire) effectDeps.SlotMirror = cameraSlots // Curated service-egress (ADR Blue 002 §3.3) no longer uses a standing @@ -299,14 +257,8 @@ func run() error { // blueprint/_query surface) and is never logged. Antenne wire only — // preview keeps the Prism global. if antenneWire != nil { - // core.overlay-app.set@1's real effector for Engine B - // (ENGINE-B-PARITY-ORION, internal/bluehost/effect_overlay.go): - // the SAME show-level wire Engine A's show.SetMirrors(wire) above - // already drives. Assigned only inside this guard — antenneWire is - // a *lsdp.Wire and assigning a nil one to the OverlayAppMirror - // interface field would store a non-nil interface wrapping a nil - // pointer, defeating dispatchOverlayAppSet's nil check. - effectDeps.OverlayMirror = antenneWire + // Both Blue execution paths publish overlay control to native orion/state. + effectDeps.OverlayMirror = streamControl credsFetcher := lsdp.NewZabCamCredsFetcher(cfg.ZabGateURL, serviceTokenMinter.Token, logger) antenneWire.EnableViewerCreds(ctx, credsFetcher, time.Duration(cfg.ViewerCredsRefreshS)*time.Second) @@ -437,26 +389,59 @@ func run() error { // path even though the SAME mechanism is already proven safe on // the legacy Show-backed path. sceneIntent.MirrorFor = sceneIntentMirrorFor(lsdpWires{preview: previewWire, antenne: antenneWire, generation: generationWires}) - sceneIntent.Activate = sceneIntentActivate(lsdpWires{preview: previewWire, antenne: antenneWire, generation: generationWires}) + sceneIntent.WireFlush = nativeFlush + activateWire := sceneIntentActivate(lsdpWires{preview: previewWire, antenne: antenneWire, generation: generationWires}) + sceneIntent.Activate = func(sceneID, version string, slot bluehost.Slot) { + if slot == bluehost.SlotPreview { + previewSlot.ReleasePreview(sceneID) + } + if slot == bluehost.SlotOnAir { + previewSlot.ReleaseEditableAir() + } + activateWire(sceneID, version, slot) + } sceneIntent.EmitRoster = sceneIntentEmitRoster(lsdpWires{preview: previewWire, antenne: antenneWire}) sceneIntent.Bridges = bluewire.NewRegistry() + sceneIntent.BeginLaneTransition = func(slot bluehost.Slot) func(bool) { + if slot == bluehost.SlotOnAir { + return antenneWire.BeginTransition() + } + return previewWire.BeginTransition() + } + sceneIntent.PresentScene = api.NativeScenePresenter(reception, func(slot bluehost.Slot, id, version string, raw []byte) (map[string]any, error) { + if slot == bluehost.SlotOnAir { + return antenneWire.PrepareSource(id, version, raw) + } + return previewWire.PrepareSource(id, version, raw) + }, func(slot bluehost.Slot) string { + if slot == bluehost.SlotOnAir { + return antenneWire.Target() + } + return previewWire.Target() + }) sceneIntent.Logger = logger + sceneIntent.CommitLaneRoles = api.NativeLaneCommitter(nativeHub, sceneIntent.Host, sceneIntent.Bridges, previewSlot) + sceneIntent.CheckProgramRelease = api.NativeProgramReleaseChecker(nativeHub, previewSlot) + sceneIntent.InspectProgram = api.NativeProgramInspector(nativeHub, sceneIntent.Host, previewSlot) + sceneIntent.ReleaseProgram = api.NativeProgramReleaser(nativeHub, sceneIntent.Host, sceneIntent.Bridges, previewSlot) } if sceneIntent.Host != nil { inbox.SetPlatformEventSink(newStatelessPlatformEventSink( sceneIntent.Host.WritePlatformEvent, sceneIntent.Bridges.Forward, logger, + func(slot bluehost.Slot) (func(), error) { return sceneIntent.Host.AcquireSceneCommit(ctx, slot) }, )) } } - // Global stream-rule runtime (ADR 009): one volatile Engine B plane, - // independent of the preview/on-air scene Host. Prism remains the durable - // intent owner and replays missing rules after restart. The plane receives - // the same providers, capability policy and effect dependencies as scene - // instances, including the show-level overlay mirror, but no Canvas - // artefact or Orion store participates in promotion. + sceneControl, sceneControlErr := wireSceneControl(cfg, sceneIntent, reception) + if sceneControlErr != nil { + return fmt.Errorf("scene control startup: %w", sceneControlErr) + } + // Global Engine B rules run independently of the preview/on-air scenes. + // Orion persists their published programs and overlay intent in one LSML; + // restart restores them without compiling or contacting an upstream service. rulePlane := bluehost.NewRulePlane( providers.Registry(), providers.Policy(len(cfg.HTTPEgressAllowHosts) > 0), @@ -465,20 +450,56 @@ func run() error { logger, ) defer rulePlane.Stop() + rulePlane.SetStore(streamStore) if sceneIntent != nil && sceneIntent.Host != nil { - rulePlane.SetShowEmitSink(func(topic string, payload any) { + showEvents := bluehost.NewShowEventRouter(func(topic string, payload any) { + rulePlane.EmitEvent(topic, payload) for _, slot := range []bluehost.Slot{bluehost.SlotPreview, bluehost.SlotOnAir} { - if err := sceneIntent.Host.EmitEvent(slot, topic, payload); err != nil && !errors.Is(err, bluehost.ErrNotLoaded) { + release, leaseErr := sceneIntent.Host.AcquireSceneCommit(ctx, slot) + if leaseErr != nil { + continue + } + result, err := sceneIntent.Host.EmitEventProjected(slot, topic, payload) + if err == nil && sceneIntent.Bridges != nil { + err = sceneIntent.Bridges.Forward(slot, bluewire.StepResult{RuntimeSequence: result.RuntimeSequence, Outputs: result.Outputs}) + } + if err != nil && !errors.Is(err, bluehost.ErrNotLoaded) { logger.Warn("stateless show.emit delivery failed", "slot", slot, "topic", topic, "error", err) } + release() } - }) + }, func() { logger.Error("Blue show event cascade exceeded budget") }) + rulePlane.SetShowEmitSink(showEvents) + sceneIntent.Host.SetShowEmitSink(showEvents) + if sceneIntent.Bridges != nil { + sceneIntent.Host.SetSceneMutationSink(sceneIntent.Bridges.Mutate) + rulePlane.SetSceneMutationSink(sceneIntent.Bridges.Mutate) + } } inbox.SetStreamRulePlatformSink(rulePlane) + startupIntent := streamStore.Snapshot() + for id, rule := range startupIntent.Rules { + if err := rulePlane.Promote(id, rule.Digest, rule.Program); err != nil { + return fmt.Errorf("restore stream rule %s: %w", id, err) + } + } + for id, app := range startupIntent.Apps { + streamControl.EmitOverlayApp(id, &app.Running, &app.OnAir) + } + if err := streamControl.Error(); err != nil { + logger.Error("overlay intent restore failed", "error", err) + } + controlCtx, stopControl := context.WithCancel(ctx) + controlDone := make(chan struct{}) + go func() { defer close(controlDone); streamControl.Run(controlCtx) }() + defer func() { stopControl(); <-controlDone }() // Public mux: HTTP + WS surface routed through ZabGate. publicMux := http.NewServeMux() api.RegisterPublic(publicMux, api.PublicDeps{ + NativeLSDPCheck: receptionCheck, + NativeLSDPFlush: nativeFlush, + NativeLSDPStatus: func() any { return producer.Status() }, Logger: logger, Metrics: metrics, Config: cfg, @@ -489,15 +510,17 @@ func run() error { Harness: harness, StaticDir: http.Dir(cfg.SolarRoot), QuasarBaseURL: cfg.QuasarBaseURL, - LSDPHandler: lsdpHandler, + LSDPHandler: nil, Preview: previewSlot, EditablePreview: previewSlot, LocalEditorToken: cfg.LocalEditorToken, StaticAssetBaseURL: strings.TrimRight(cfg.CanvasBaseURL, "/") + "/api/v1/scene-assets", - PreviewLSDP: previewLSDPHandler, - GenerationLSDP: generationLSDPHandler, + PreviewLSDP: nil, + GenerationLSDP: nil, CameraSlots: effectDeps, AuthSource: authSource, + OverlayStatus: streamControl.Status, + HostEffects: &effectDeps, // Read-only DB catalog (ADR Blue 008 §3.4): same gateway as the // db.query client; both use the same exact-route exchange callback. SchemaClient: effects.NewSchemaClientWithPathTokenFunc(cfg.ZabGateURL, serviceTokenMinter.Token, nil), @@ -543,6 +566,11 @@ func run() error { ReadHeaderTimeout: 5 * time.Second, } + go func() { + if err := sceneControl.Run(ctx); err != nil && ctx.Err() == nil { + logger.Error("native scene control stopped", "err", err) + } + }() errs := make(chan error, 2) go func() { logger.Info("public server listening", "addr", cfg.ListenAddr) diff --git a/cmd/orion/platform_event_sink.go b/cmd/orion/platform_event_sink.go index b4ac1fb5..1500eafd 100644 --- a/cmd/orion/platform_event_sink.go +++ b/cmd/orion/platform_event_sink.go @@ -25,14 +25,25 @@ func newStatelessPlatformEventSink( write platformEventWriter, forward platformEventForwarder, logger *slog.Logger, + acquire ...func(bluehost.Slot) (func(), error), ) func(string, any) { return func(path string, payload any) { for _, slot := range []bluehost.Slot{bluehost.SlotPreview, bluehost.SlotOnAir} { + release := func() {} + if len(acquire) > 0 { + var err error + release, err = acquire[0](slot) + if err != nil { + logger.Warn("stateless platform role unavailable", "slot", slot, "error", err) + continue + } + } result, err := write(slot, path, payload) if err != nil { if !errors.Is(err, bluehost.ErrNotLoaded) { logger.Warn("stateless platform event delivery failed", "slot", slot, "path", path, "error", err) } + release() continue } if err := forward(slot, bluewire.StepResult{ @@ -41,6 +52,7 @@ func newStatelessPlatformEventSink( }); err != nil { logger.Warn("stateless platform event projection failed", "slot", slot, "path", path, "error", err) } + release() } } } diff --git a/cmd/orion/scene_control.go b/cmd/orion/scene_control.go new file mode 100644 index 00000000..1481f24d --- /dev/null +++ b/cmd/orion/scene_control.go @@ -0,0 +1,54 @@ +package main + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "github.com/ZabLaboratory/Orion/internal/api" + "github.com/ZabLaboratory/Orion/internal/auth" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "net/http" + "path/filepath" +) + +func wireSceneControl(cfg config.Config, deps *api.SceneIntentDeps, reception *lsdpreception.Reception) (*api.SceneControl, error) { + if deps == nil { + return nil, fmt.Errorf("scene control requires signed scene admission") + } + // Orion owns this subtree. It never writes Prism's immutable artifact cache. + root := "" + switch { + case cfg.StreamIntentPath != "": + root = filepath.Dir(cfg.StreamIntentPath) + case cfg.ServiceTokenStatePath != "": + root = filepath.Dir(cfg.ServiceTokenStatePath) + default: + root = cfg.AssetRoot + } + identity := sha256.Sum256([]byte(cfg.OwnerID + "\x00" + cfg.TenantID + "\x00" + cfg.LocalAuthUser)) + root = filepath.Join(root, "orion-scenes", hex.EncodeToString(identity[:])) + path := cfg.SceneControlPath + if path == "" { + path = filepath.Join(root, "selection.lsml") + } + path, err := filepath.Abs(path) + if err != nil { + return nil, err + } + cache := cfg.SceneCachePath + if cache == "" { + cache = filepath.Join(root, "catalog") + } + cache, err = filepath.Abs(cache) + if err != nil { + return nil, err + } + deps.Catalog, err = api.OpenSceneCatalog(cache) + if err != nil { + return nil, err + } + header := http.Header{} + header.Set(auth.HandshakeHeader, cfg.LocalAuthSecret) + return api.OpenSceneControl(*deps, reception, path, header) +} diff --git a/cmd/orion/scene_intent_wiring.go b/cmd/orion/scene_intent_wiring.go index 577a8d28..11a3e1e3 100644 --- a/cmd/orion/scene_intent_wiring.go +++ b/cmd/orion/scene_intent_wiring.go @@ -21,7 +21,9 @@ import ( "github.com/ZabLaboratory/Orion/internal/workload" ) -const embeddedLocalAttestationClockSkew = 5 * time.Second +// Remote Canvas and an embedded Windows runtime have independent wall clocks. +// Bound only not-before tolerance; expired refs and readiness remain strict. +const embeddedLocalAttestationClockSkew = 10 * time.Second // wireSceneIntent builds the additive stateless-cutover surface (#331, // ADR-BLUE-012). It returns (nil, nil) only when NONE of the workload diff --git a/cmd/orion/stream_control.go b/cmd/orion/stream_control.go new file mode 100644 index 00000000..5467cd20 --- /dev/null +++ b/cmd/orion/stream_control.go @@ -0,0 +1,47 @@ +package main + +import ( + "fmt" + "path/filepath" + + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/runtime" + "github.com/ZabLaboratory/Orion/internal/streamcontrol" +) + +func wireStreamControl(cfg config.Config, mirror streamcontrol.Mirror) (*streamcontrol.Store, *streamcontrol.Controller, func(), error) { + path := cfg.StreamIntentPath + if path == "" { + root := cfg.LocalArtifactRoot + if cfg.ServiceTokenStatePath != "" { + root = filepath.Dir(cfg.ServiceTokenStatePath) + } + if root == "" { + root = cfg.AssetRoot + } + path = filepath.Join(root, "stream-control.lsml") + } + path, err := filepath.Abs(path) + if err != nil { + return nil, nil, nil, err + } + store, err := streamcontrol.Open(path) + if err != nil { + return nil, nil, nil, fmt.Errorf("stream intent: %w", err) + } + apps, err := streamcontrol.NewApps(cfg.OverlayAppsPath) + if err != nil { + return nil, nil, nil, fmt.Errorf("overlay applications: %w", err) + } + controller := streamcontrol.NewController(store, apps, mirror) + return store, controller, func() { apps.Close() }, nil +} + +type streamMirrors struct { + runtime.MirrorRegistry + controller *streamcontrol.Controller +} + +func (m streamMirrors) EmitOverlayApp(id string, running, onAir *bool) { + m.controller.EmitOverlayApp(id, running, onAir) +} diff --git a/docs/development/extending-orion.md b/docs/development/extending-orion.md new file mode 100644 index 00000000..10565759 --- /dev/null +++ b/docs/development/extending-orion.md @@ -0,0 +1,30 @@ +# Étendre Orion + +Propriétaire : internal/providers pour le catalogue, internal/bluehost pour +l'exécution. Commencer par la carte des fonctionnalités et chercher l'adaptateur +existant. Un descripteur n'est pas une implémentation ni un nœud d'éditeur Blue. + +1. Déclarer l'opération dans providers.Registry : types, bornes, erreurs, + politique Preview. Préserver les noms existants. +2. Injecter l'implémentation dans bluehost.EffectDeps depuis cmd/orion. Réutiliser + le résolveur de routes, les politiques egress, le pool, DB, le sink de mutation + ou le contrôleur d'applications ; ne pas créer un second propriétaire. +3. Pour une invocation générique, compléter explicitement succès et échec dans + effect_http/effect_local. Une opération inconnue ne doit pas rester pendante. + Les opcodes dédiés sont annoncés par la route host-surface. +4. Vérifier Program, Preview et stream-rules selon la disponibilité. La politique + annoncée doit correspondre au comportement, dont les écritures caméra bloquées. +5. Ajouter les tests catalogue/disponibilité, les erreurs/bornes, puis une preuve + de l'adaptateur réel. Mettre à jour le README propriétaire et la carte. + +Le contrat de mutation accepte au plus 128 add/remove/replace/test sur layout, +defaults authored et animations. Identité, pins Blue et autorité caméra restent +protégés. Chaque invocation d'animation possède une identité de commande. + +Les nouveaux stores conservent source LSMLZ/assets/manifeste Blue et artefacts +d'admission signés. Le cache SceneSourceStore de Solar ne confère pas l'autorité +d'exécuter Blue : Orion vérifie toujours la référence signée et le programme. + +Créer un nœud authorable demande aussi le catalogue et le typage dans Blue. +La présence d'un adaptateur Orion ne rend pas automatiquement authorables +core.effect.invoke@1 ou les opcodes internes de caméra. diff --git a/docs/development/maturity.md b/docs/development/maturity.md new file mode 100644 index 00000000..05b43e5a --- /dev/null +++ b/docs/development/maturity.md @@ -0,0 +1,112 @@ +# Maturité locale — prête pour l'intégration Prism + +ZabCanvas valide la scène et ses Blues. Orion charge les artefacts admis, exécute +les commandes/awaits/stream-rules et rapporte dispatch, effets et erreurs. +Solar acquiert le LSMLZ ou le LSML avec ses assets et présente Vision. +Orion ne compare aucun résultat métier attendu pour décider si une Blue est vraie. + +Le prochain propriétaire de changements applicatifs est **Prism**. +Le verdict est **PASS_LOCAL_READY_FOR_PRISM_INTEGRATION** : préparation et preuves +locales, sans commit, push, merge, CI distante ni déploiement. Les continuations +Prism et Lumencast ont été comparées intégralement au baseline et sont inchangées. + +[Certificat, hashes et matrice de preuves](../../evidence/local-20261005-final-certification/forge/20261005T123800Z-final-chain-certificate.json). + +## Critères et preuves + +| Critère | Risque vérifié | Commande / preuve | +|---|---|---| +| Admission Vision sans bundle de rendu | projection ou fermeture Blue incomplète | Canvas `scripts/prove-vision-source.py` : vraie identité ZabAuth, vraie Blue publiée via ZabGate, publication/projection/validation HTTP et SQL locales, verdict persisté ; 7 assets ; aucun verdict semé | +| Source et capsule Blue indissociables | mauvaise révision, digest, assets ou déclaration | LSML/LSMLZ servis par Canvas ; manifeste auteur + définition + fermeture validée ; vérifications Solar/Orion et reprise des mêmes capsules | +| Arrêt complet puis reprise | conservation accidentelle du LSML live ou cache incomplet | Solar `scripts/prove-cold-start-cef.py --capsule ...` : deux phases, processus neufs, 4 captures CEF 1920×1080, cache/selection inchangés, zéro lecture amont hors ligne | +| Exécution générique | couverture limitée à LEC/LCK | découverte de toutes les commandes du programme réel sur les deux lanes, reçus et erreurs ; tests génériques de tous les scopes et awaits dans Orion | +| Caméras peer | signaling, départ/retour, slot réaffecté ou libéré | `scripts/prove-peer-camera-cef.py` : serveur Meet réel, caméra physique publiée dans un Pulsar séparé, deux viewers CEF receive-only, 10 captures, arrivée/départ/retour/réaffectation/libération | +| Réception native et récupération | état périmé, transaction incertaine, duplication | 4 opt-in Go avec Rust release réel ; remplacement LSML et mutation structurelle ; reprise au même port et reçu perdu | +| Installation | scripts manquants, dépendances hoistées, binaire absent | tarball npm installé dans un dossier neuf ; postinstall exécuté ; 161 fichiers dist identiques ; adaptateur Prism existant chargé en mémoire, client Orion réel et enfant récolé | +| Concurrence et maintenance | course, référence morte, drift des assets | Solar 145 tests/18 fichiers, lint/types/reachability/pins ; Orion race 1812 tests/sous-tests/22 packages, vet/staticcheck/build ; Canvas 1402 tests, ruff complet et mypy 121 fichiers | +| Préservation | modification hors autorité | état Git, diff binaire et chaque fichier non suivi Prism/Lumencast identiques au baseline | + +Les tests Canvas annoncent 85 skips et un avertissement OpenAPI GET/HEAD préexistant. +Les harnais PostgreSQL, intégrations externes et santé CI ne sont pas comptés comme +des preuves réussies ; les logs de frontière et leurs raisons sont dans le certificat. +Aucune migration de schéma n'est introduite. + +## Contrats stabilisés + +- La source LSML conserve son adresse `scene_version`. Le programme Blue, le + `artifact_set_digest` et la revision signée ont leurs propres identités ; + `x-orion-artifact-set` transporte l'ensemble admis dans le document natif. +- La validation `presentation=vision` de Canvas conserve résolution/compilation + Blue, fermeture et digests, vérifie source et assets, puis produit une admission + sans bundle de rendu compilé. Le défaut historique `compiled` conserve uniquement + la compatibilité du Prism actuel. Solar utilise un seul moteur Vision. +- Toute source projetée doit déclarer l'inventaire complet des assets, polices + comprises, par leurs chemins `assets/.`, notamment dans + `assets.files`. Les liens implicites hors LSML ne peuvent pas être devinés. +- Le serveur commun est fourni par `@zablab/solar/server`. Le navigateur Solar + et Orion sont consommateurs du même processus Rust ; l'hôte applicatif le possède. +- Les opérations LSDP live, résultats Blue et observations restent en RAM. + Seuls source/assets/déclarations/programmes immuables et sélection désirée sont + conservés. Après perte du parent, les derniers résultats dynamiques sont abandonnés. +- Un snapshot devenu périmé pendant la préparation du rendu est relu, avec quatre + tentatives bornées et vérifications de hash intactes ; les autres erreurs restent + visibles. Une transaction d'issue incertaine n'est pas réémise sous une nouvelle identité. +- Une libération explicite d'un slot reste vide pendant les changements de roster. + Les feuilles caméra appartiennent à Solar et restent hors des bindings de Vision. +- Une erreur avant finalisation restaure l'ancien host/bridge/frame exact. + Une compensation n'annule pas un effet externe déjà émis ; un reçu de dispatch + ne prétend pas qu'un effet asynchrone est fini. + +## Ce que Prism doit intégrer + +1. Projeter l'inventaire complet des assets, notamment les polices, dans le LSML + immuable, appeler la validation Canvas en mode Vision et récupérer les capsules admises. +2. Posséder le serveur natif packagé commun : origins, readiness, propagation TCP/WS, + reprise, logout et arrêt de l'application. +3. Synchroniser source/assets/programme/déclarations au lancement, dans un stockage + stable par compte ; réutiliser les exports Solar et le catalogue Orion existants. +4. Obtenir et renouveler les références via le flux broker autorisé existant. + Expiration et renouvellement restent des décisions d'intégration applicative. +5. Muter la sélection souhaitée du LSML `orion.scene-control.v1` pour Program/Preview, + puis suivre `observed` et l'acquittement du renderer. +6. Consommer les commandes, états stream-rules/Marker et erreurs Orion ; + distribuer les capacités de capture et les rooms viewer. +7. Prouver le cycle complet de l'application installée et sa mise à jour. + +## Frontières externes + +La route source du Canvas **déployé** répond encore 404 : il faut publier/déployer +le candidat Canvas avant une acquisition distante par Prism. Ce n'est pas un +changement de conception supplémentaire de Solar/Orion. + +Le 404 obtenu avec le bearer opérateur sur un locator **broker-only** est le refus +attendu. Il ne prouve pas une absence d'artefacts. Le flux mTLS/delegation broker +n'a pas été exercé dans cette phase et reste à vérifier dans l'intégration Prism. +La preuve actuelle emploie une clé de signature locale au producteur Canvas, +la vraie identité et la vraie compilation Blue distantes, avec HTTP/SQL locaux. + +Les références réelles gardent leur durée de cinq minutes et la readiness sa minute. +La reprise démontrée est dans cette validité ; aucune autorité Blue hors ligne +indéfinie n'est ajoutée. Les six commandes découvertes sont dispatchées hors ligne +et leurs six erreurs DB_QUERY_FAILED remontent ; aucun succès métier distant +n'est revendiqué dans cette situation. + +Le cache disque immuable est qualifié entre processus. Le cache IndexedDB a ses +tests de transactions/quota/éviction, mais cette preuve à froid n'est pas une preuve +de sa persistance interprocessus. Prism devra choisir le cache commun par compte. +La caméra est qualifiée en WebRTC local ; WAN/TURN et release Linux restent hors +de ces preuves Windows. La stabilité longue durée Pulsar est acceptée par l'utilisateur. + +Les contrôles de workspace sont bornés aux preuves nouvelles dans leurs dépôts +et aux continuations préservées ; aucun nettoyage d'écarts historiques globaux. +Les preuves historiques restent conservées sous leurs phases d'origine. Les +anciennes mentions « gcc absent », « debug seulement », « pas de pair réel » et +« locator opérateur 404 donc artefacts manquants » sont remplacées par les résultats +et la correction de frontière ci-dessus. + +## Reproduction de la consolidation + +`Solar/scripts/certify-chain.py --orion --canvas --pulsar +--output ` lit les preuves existantes, vérifie +leurs hashes et la préservation, puis écrit une synthèse dans chacun des trois +dépôts. Il ne lance, ne publie ni ne déploie un service. diff --git a/docs/development/scene-control.md b/docs/development/scene-control.md new file mode 100644 index 00000000..b5924001 --- /dev/null +++ b/docs/development/scene-control.md @@ -0,0 +1,164 @@ +# Sélection déclarative de scènes + +Orion possède l'admission et l'exécution Blue ; Solar possède la préparation et +la présentation Vision. Program utilise `solar/program`, Preview utilise +`solar/preview`. Le petit LSML de sélection vit sous `/scene_control` dans la +ressource native `orion/state`. + +Dans desired/observed, `scene_version` identifie l'ensemble admis +`artifact_set_digest`, comme la clé du catalogue. Dans les documents complets +`solar/program` et `solar/preview`, `scene_version` conserve l'adresse LSML +publiée par Canvas ; `x-orion-artifact-set` transporte séparément l'identité +admise. Solar acquiert cette adresse LSML et l'utilise dans son acquittement. +Le manifeste Blue porte lui aussi l'adresse LSML, plus le revision_id signé. +Ces identités peuvent être différentes et ne doivent jamais être substituées. + +```json +{ + "lsml": "1.2", + "schema": "orion.scene-control.v1", + "scene_id": "orion-scene-control", + "layout": {"type": "frame", "children": []}, + "defaults": { + "desired": { + "program": {"scene_id": "scene-id", "scene_version": "sha256:version", "stream_id": "stream-id"}, + "preview": {"scene_id": "scene-id", "scene_version": "sha256:version", "stream_id": "stream-id"} + }, + "observed": {} + } +} +``` + +Préparer d'abord une capsule signée via +`POST /api/v1/runtime/scene-catalog`, avec le même corps et la même autorité que +scene-intent : `take-on-air` pour Program, `prepare-preview` pour Preview. +La préparation vérifie les octets sans activer ni exécuter Blue. Le catalogue +ne produit aucun bundle de rendu. Solar acquiert/cache séparément LSMLZ et assets. + +Pour changer de scène, appliquer une mutation native absolue à +`/scene_control/defaults/desired/program` ou `preview`, avec les trois identités +exactes du catalogue. Orion attribue un identifiant d'activation frais lorsque +la sélection change. Rejouer la même sélection ou modifier `observed` n'exécute +pas de nouveau on-start. A → B → A produit une nouvelle activation de A. +Retirer une entrée desired ne constitue pas une commande de libération ; la +scène courante reste occupante. Une sélection valide est nécessaire pour changer. + +Orion publie `preparing`, `active`, `failed` ou `superseded`, avec +`activation_id`, `scene_id`, `scene_version` et une raison en cas d'échec. +`active` suit l'acquittement Solar et le commit de l'instance Blue. Un +document invalide est refusé et journalisé, sans interprétation partielle. + +La coordination utilise `x-solar-transition` uniquement dans la ressource de +scène en RAM : request_id, phase prepare/commit/finalize/abort et source candidate. +Solar prépare un frame caché, conserve l'ancien pour compensation et écrit son +acquittement dans `/solar_presentation_program` ou `preview` de `orion/state`. +L'ancien frame est libéré lorsque la métadonnée de transition disparaît après +finalisation. Les Blue sont bloquées pendant cette fenêtre ; aucune nouvelle +Blue ne s'exécute lors d'une préparation refusée. Les affectations caméra sont +retenues puis projetées sur la scène finalement choisie. + +Chemins configurables : `ORION_SCENE_CONTROL_PATH`, `ORION_SCENE_CACHE_PATH`. +Par défaut, sous-dossier Orion séparé par owner/tenant/utilisateur, près du fichier +d'intention stream, sinon de l'état du service, sinon de l'asset root. Aucun secret +de handshake ni LSML live muté ne figure dans ces fichiers. La reprise depuis +le disque requiert toujours des attestations encore valides. Un arrêt total +reconstruit depuis les sources immuables et la sélection souhaitée ; il ne +restaure pas les derniers résultats dynamiques Blue. + +L'intégration d'un émetteur Prism reste hors de ce changement. Le contrat est +déjà consommable par un client LSDP local autorisé. Aucune modification Prism. + +## Editable Preview lifetime + +Preview owns one current authoring clone. A regular scene activation or an +external Blue Preview commit releases the prior authoring runtime and its wire +entry. Returning to that scene admits a fresh authoritative head; the legacy +activate endpoint only validates an already-current head and cannot restore an +inactive scene. Current leaf edits retain ordered LSDP delivery. + +An explicitly promoted on-air generation is a separate active consumer. At most +one such editable clone is retained; its replacement stops the former Program +runtime. Preview switches never stop that active Program generation. Shutdown +stops both owners once. Tests: internal/runtime/preview_editable_test.go. + +## Libérer le Program après arrêt de diffusion + +Le contrôleur desktop confirme l'arrêt réel des sorties avant cette commande. +Orion reçoit ce constat local, sans interroger lui-même Pulsar. Les deux moteurs +Solar physiques persistent ; seul le document et son auteur Program sont retirés. +Le Preview actif, ses écritures et son identité restent inchangés. + +Après règlement des écritures en cours, demander une identité coordonnée en +appliquant à `/scene_control/defaults/inspect_program` sur `orion/state` : + +```json +{ + "schema": "orion.program-inspect.v1", + "command_id": "fresh-inspection-id", + "runtime_instance_id": "current-pulsar-runtime", + "take_command_id": "last-confirmed-take", + "expected_role_map": {"on_air": "B", "preview": "A"}, + "expected_revisions": {"program": 1, "preview": 5, "role_map": 1} +} +``` + +`/scene_control/defaults/observed/inspect_program` recopie exactement la requête +et ajoute `status: active`, `target: solar/lane-b`, `scene_id`, `scene_version`, +`artifact_set`, ainsi que `writer_id` et `edit_seq` si l'auteur est éditable. +L'identité est lue sous le bail Program après drainage des inputs acceptés et +acquittement natif. Elle n'active ni ne compile une scène. Un refus renvoie +`status: refused` et `reason`, sans identité exploitable. La nouvelle inspection +utilise un nouveau command_id ; aucun état supplémentaire n'est publié à chaque edit. + +Puis appliquer à `/scene_control/defaults/release_program` : + +```json +{ + "schema": "orion.program-release.v1", + "command_id": "fresh-release-id", + "stop_command_id": "confirmed-output-stop-id", + "output_state": "stopped", + "runtime_instance_id": "current-pulsar-runtime", + "take_command_id": "last-confirmed-take", + "expected_role_map": {"on_air": "B", "preview": "A"}, + "expected_revisions": {"program": 1, "preview": 5, "role_map": 1}, + "scene_id": "source-scene", + "scene_version": "sha256:source-address", + "artifact_set": "sha256:admitted-artifacts", + "writer_id": "current-editable-writer", + "edit_seq": 12 +} +``` + +Les identités source/artifact/writer viennent de l'inspection ; writer/seq sont +omis pour une scène sans auteur éditable. Les révisions Program et role_map et +le Take doivent égaler le dernier transfert Orion. La révision Preview peut être +plus récente que ce transfert, car sa préparation est indépendante. Une révision +Preview antérieure est refusée. Un edit intervenu depuis l'inspection refuse +la libération : demander une nouvelle inspection après règlement des écritures. + +L'accusé `/scene_control/defaults/observed/release_program` recopie la requête et +ajoute `status`, `reason` éventuelle, `target`, `retired` et `replayed` éventuel. +`released` confirme le Drop et son ACK natif, le nettoyage desired/current/observed +Program et la persistance de la sélection sans Program. `pending` indique la +réconciliation en cours. `failed` distingue une erreur de livraison, d'arrêt ou +de persistance ; `retired: true` annonce que l'autorité a déjà été retirée. +Un refus périmé ne touche ni auteur ni document. Une release n'est pas un switch. + +Un `attempt` entier optionnel, initialement 0/omis, peut être augmenté pour +redélivrer le même command_id après une réception absente. Seul attempt peut +changer : les autres champs sont comparés pour l'idempotence. Une release déjà +retirée attend seulement son ACK restant ; aucun nouveau Drop et aucune +libération du prochain Program ne sont exécutés. Le cache de reçus RAM est borné +à 64 commandes et ne conserve aucun document de scène inactive. + +Après libération, les admissions Program démarrées avant l'arrêt sont invalidées +et les nouvelles admissions Program refusées jusqu'au prochain Take physique +confirmé. Celui-ci promeut le Preview existant vers Program sans Load/Start ni +réinstallation du document. Avec l'ancien Program vide, l'autre lane reste vide. +Les commandes runtime et les documents mutés ne sont pas persistés. + +Preuves : `internal/api/program_release_native_test.go` utilise un récepteur Rust +jetable. Les tests de publication tardive, runtime/epoch/identité périmés et +d'admission concurrente vivent auprès des propriétaires API, Host et réception. +Ce banc ne qualifie ni une vraie diffusion ni le rendu CEF de l'application. diff --git a/docs/development/scene-feature-map.md b/docs/development/scene-feature-map.md index c85ef7af..acf406f8 100644 --- a/docs/development/scene-feature-map.md +++ b/docs/development/scene-feature-map.md @@ -1,20 +1,65 @@ # Scene intent feature map -All files remain in `internal/api` and the same Go package. HTTP registration, exported types, locks and state ownership are unchanged. +The shared native reception dependency is owned by `internal/lsdpreception` +([contract](../../internal/lsdpreception/README.md)), wired by `cmd/orion/main.go` +and checked by `/ready` in `public.go`. Prism starts the native process; this +producer publishes the scene intent and Blue projection to that same node. + +HTTP admission belongs to `internal/api`; lane commit ownership belongs to the +shared Blue Host. Runtime and native publishers retain their existing owners. | Feature | File | | --- | --- | +| Desired scene LSML, lane supersession and owned restart selection | `scene_control.go`, `cmd/orion/scene_control.go`; [contract](scene-control.md) | +| Immutable admitted catalog and Canvas Blue closure retention | `scene_catalog.go`, `scene_blue_manifest.go`; `scene_catalog_test.go` | +| Renderer-confirmed staged replacement and exact-instance compensation | `scene_presentation.go`, `native_scene_presentation.go`, `internal/bluehost/replacement.go`; `scene_presentation_test.go` | +| Native control watch and bounded phase assignments | `internal/lsdpreception/control.go`, `third_party/lsdpnative/subscription.go` | +| Program identity read and coordinated release after output stop | `internal/api/program_identity.go`, `program_release.go`, `scene_control.go`; `internal/lsdpreception/program_identity.go`, `program_release.go`; `internal/runtime/program_release.go`; `internal/bluehost/scene_commit.go`; `program_release_native_test.go`, `program_admission_fence_test.go` | | Intent dependencies, request/response and admission orchestration | `scene_intent.go` | +| Shared per-lane cancellable admission commit lease | `internal/bluehost/scene_commit.go`; `scene_intent_concurrency_test.go` | | Bounded existing digest verification cache | `scene_intent_verification_cache.go` | | Existing scoped intent replay and TTL/capacity limits | `scene_intent_idempotency.go` | -| Local artifact loading and envelope/digest verification | `scene_intent_artifacts.go` | +| Local artifact loading and individual envelope/digest checks | `scene_intent_artifacts.go` | +| Separate program/source/optional compatibility-render verification | `scene_intent_source.go` | +| Optional signed compatibility-render handling; no LSML compilation on scene switch | `scene_intent_current_render.go` | | Projection bridge lifecycle and slot release | `scene_intent_bridge.go` | +| Initial Blue on-start transition, then periodic clock ticks | `scene_intent_bridge.go`, `internal/bluewire/bridge.go`; `cockpit_source_test.go`, `bridge_test.go` | +| Native Preview/Program cockpit contracts and source-only operator interface | `cockpit.go`, `scenes_get.go`, `internal/bluehost/scene_interface.go`; `cockpit_source_test.go`, `scene_interface_test.go` | +| Global rule topic fan-out and reentrant event routing | `internal/bluehost/rule_plane.go`, `event_router.go`, `cmd/orion/main.go`; `rule_topics_test.go` | +| Generic operator execution receipts and public runtime errors | `operator_execution.go`, `operator.go`; `operator_execution_test.go` | | Read-only slot/projection status | `scene_intent_status.go` | +| Ordered native full-state/leaf publication, retries and acknowledged hashes | `internal/lsdpreception/producer.go`, `tree.go` | +| Lost-receipt recovery without duplicated insertion; protocol/ambiguity refusal and immediate idle-socket recovery | `internal/lsdpreception/recovery_test.go`, `recovery_native_test.go`, `idle_recovery_test.go`, `idle_recovery_native_test.go`; `internal/api/editable_idle_native_test.go`; native delivery diagnostics | +| Program/Preview resources, exact generation writer leases and camera/overlay projection | `internal/lsdpreception/mirror.go` | +| Isolated native test sessions, lease renewal, explicit close and expiry | `internal/lsdpreception/session.go`, `internal/runtime/test_session.go`, `show.go` | +| Native ACK on editable inputs and camera projection | `native_delivery.go`, `editable_preview.go`, `editable_targets.go`, `camera_slots.go`; runtime scene inbox barrier | +| Active editable Preview/Program author and structural fencing | `internal/api/editable_targets.go`, `editable_preview.go`; `internal/runtime/editable_targets.go`, `preview.go`, `preview_roles.go`; `cmd/orion/main.go` program wire; `editable_targets_test.go`, `lane_commit_native_test.go` | +| Blue adapter discovery and configured availability | `host_surface.go`, `internal/providers/providers.go`; [Blue host](../../internal/bluehost/README.md) | +| Scene-local atomic structural edits and animation command leaves | `internal/lsdpreception/mutation.go`, `internal/bluehost/effect_animation.go`; `bluewire.Registry.Mutate` | +| Durable global rules, desired app intent and actual local process status | [stream control](../../internal/streamcontrol/README.md), `cmd/orion/stream_control.go`, `GET /api/v1/show/overlay-apps` | -No new cache, runtime reuse policy, endpoint, goroutine or timing setting is introduced. Existing `scene_intent*_test.go` tests continue exercising the same functions. +Solar's source-only scene path preserves the source LSML address in native +`scene_version`, separately from the admitted generation's `artifact_set_digest` +carried by `x-orion-artifact-set`. It does not call the compiler or populate the +legacy render-bundle slot. Blue program identity remains `scene_digest`; Orion's +Blue host execution is gated during staged presentation and retains its previous +instance for compensation. Existing `scene_intent*_test.go` +tests exercise this boundary and the optional compatibility artifact. The compiler now separates `compile_blueprint.go`, `compile_platform_bindings.go` and `compile_graph_helpers.go` from orchestration in `compile.go`. The runtime separates input/evaluation methods in `scene_evaluation.go` and emission/backpressure methods in `scene_emission.go`. All declarations stay in their original Go packages; the Scene object, single-writer loop, channel ownership and method call sequence are unchanged. + +Source/render contracts and checks: [source-render boundary](source-render-boundary.md). + +Source/Blue identity regression belongs to `scene_intent_identity_test.go`, +`scene_intent_source_test.go` and `internal/lsdpreception/producer_test.go`. +Retired compiler push-file scans are removed; current admission refusal coverage +is in scene_intent_test.go, scene_intent_source_test.go and scene_intent_noblue_test.go. + +Current proof owner: [maturity](maturity.md). The full race battery covers the +producer/control/host surface; the four real-native opt-ins run separately. +Canvas actual local admission, full cold CEF restart and real Meet peer proofs +are referenced in the per-repository certificate, with deployment boundaries. diff --git a/docs/development/source-render-boundary.md b/docs/development/source-render-boundary.md new file mode 100644 index 00000000..5372c357 --- /dev/null +++ b/docs/development/source-render-boundary.md @@ -0,0 +1,90 @@ +# Scene source and render boundary + +Owner: `internal/api`; active scene-switch entry: `postSceneIntent`. + +`Host.AcquireSceneCommit` gives each lane a commit lease shared by direct and +wrapper-created handlers. Identity, interface, mirror and the native delivery +barrier cannot interleave within that lane; the other lane progresses independently. +Concurrent replays recheck idempotency under the lease. Cancelled waiters do not +mutate Host. A failure after Host commit is not a transactional rollback. + +`verifySceneArtifacts` validates the Blue program, LSML source and optional signed +compatibility render as separate artifacts. The LSML source is copied unchanged +to the LSDP mirror. The native document preserves the source's `scene_version` +for Solar's exact Canvas request. `x-orion-artifact-set` carries the separate +`artifact_set_digest` used by catalog/control/generation keys. Blue program +lookup and host identity continue to use `scene_digest`. The Blue manifest +matches the LSML address and signed revision_id. Solar's presentation ACK also +uses the LSML address; a real Canvas reference can have all three digests distinct. + +## Solar source path + +Solar resolves a scene identifier through ZabCanvas, downloads the exact +published LSMLZ (or LSML and its verified assets), then gives it to Vision. +Orion does not compile that LSML during scene intent. With no explicit render +capsule in the signed envelope, the host render-bundle slot remains empty and +the legacy render-bundle read returns no artifact. This is the normal path for +Solar's Vision renderer. + +`prepareCurrentRender` only validates defaults from an explicitly attached, +signed compatibility capsule. It does not invoke `StaticBundleCompiler` or +create a render bundle from LSML. The compiler callback remains available to +separate validation and editable-preview integrations; it is not called by +scene switching. + +Orion continues to verify and prepare Blue programs through its existing Blue +host lifecycle. Vision renders LSML and camera textures; it does not load or +execute Blue. ZabCanvas's validated Blue declaration manifest remains paired +with the pinned scene source for Solar's declaration and future local-cache +handling. + +`Host.SetSceneInterface` attaches only the source's operator_inputs declaration +to the admitted slot. Cockpit Preview and Program contracts therefore remain +available without a render bundle. The exact-address operator-inputs route uses +scene_digest, preserving its existing addressing contract. Canonical LSML with +no inputs is authoritative and clears compatibility controls. Blue on-start is +executed through Bridge.StepOnce before periodic ticks; a tick cannot consume +that initial transition. + +## Scene-selection control + +The native Solar Program/Preview resources contain full LSML scene documents. +Replacing one with another full scene can switch Solar's rendering, but it +does not switch Orion's loaded Blue program, operator contracts or ingress. +The small `orion.scene-control.v1` LSML under `/scene_control` in `orion/state` +coordinates those responsibilities through desired/observed state. It names the +exact admitted catalog entry and lane. Orion subscribes, rechecks signed authority, +prepares the Blue/camera slot, stages the full native LSML and tracks Solar's +renderer ACK. Failure before finalization compensates the exact previous +host/bridge/frame; newer requests cancel and join stale preparations. Global +rules survive these switches. See [the wire contract](scene-control.md). + +Orion's persisted stream-control.lsml is a startup snapshot written by the +controller. Editing that file externally is not a live subscribed command. +Prism still has its own persisted stream-rule selections and app reconciler; +this local change does not transfer those responsibilities or wire the installed +app manifest. Solar/native ACK also does not certify physical Program display. + +## Validation + +`scene_intent_source_test.go`, `scene_intent_identity_test.go`, `scene_intent_test.go` and +`scene_intent_noblue_test.go` prove that source-only switches pass the exact +source bytes to the mirror, use `artifact_set_digest` for admission generations, retain +`scene_digest` for Blue, leave the legacy render slot empty and make zero +compiler calls. Other scene-intent tests preserve optional signed compatibility +capsules and refusal behavior. Native `producer_test.go` checks that the LSML +address is preserved. `TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet` +checks the source/manifest identity rather than substituting the artifact-set key. + +`cockpit_source_test.go` adds source-only admission through both actual intent +actions, initial on-start awaits, input/trigger contracts and exact-address +reads. `scene_interface_test.go` proves declaration copy/empty/switch lifetime; +`rule_topics_test.go` proves global fan-out, rejection isolation and reentrant +rule emission/demotion without a plane lock. + +`go test ./...` validates the complete local Go package suite. The change does +not alter Prism routes or deploy Orion. Physical Solar/CEF presentation is qualified separately in docs/development/maturity.md. +Solar's served-host startup synchronization and verified cache providers are +implemented. The installed Prism application's cache integration remains outside +this scope. Authenticated acquisition from deployed Canvas and local full-process +offline reconstruction have separate proof boundaries in maturity.md. diff --git a/docs/runbooks/native-recovery.md b/docs/runbooks/native-recovery.md new file mode 100644 index 00000000..23153a35 --- /dev/null +++ b/docs/runbooks/native-recovery.md @@ -0,0 +1,58 @@ +# Reprise des livraisons natives + +Propriétaire : internal/lsdpreception/Producer. Cycle de vie : hôte applicatif. + +Consulter /api/v1/ready et host-surface.native_delivery. pending exclut la livraison +en cours et inclut les barrières ; capacity vaut 256. recovering indique une +reconnexion transitoire ; terminal demande une reprise explicite. Les compteurs +portent sur les transactions natives, pas sur les images physiques ni les effets +externes Blue. + +Lors d'une coupure, Orion conserve la requête et la queue. Si une connexion établie +est perdue, il tente une seule reconnexion immédiate : une expiration d'inactivité +ne pénalise pas le premier delta de 250 ms. Si cette reprise échoue, les tentatives +suivantes sont espacées de 250 ms. Un échec de connexion initiale utilise également +ce délai. Chaque tentative est bornée à cinq secondes et rejoue exactement le +même payload/identifiant. Aucun keepalive applicatif ni message de scène artificiel +n'est ajouté. La readiness reste invalide pendant l'incident. Une +réponse vérifiée efface l'erreur transitoire et permet le drainage dans l'ordre. +L'arrêt annule la reprise. La déduplication Rust empêche une insertion déjà +committée d'être exécutée deux fois quand sa première réponse a été perdue. +Un Dial échoué ne remplace jamais le client actif : une valeur nil typée renvoyée +par le binding ne doit pas être fermée ni considérée comme une connexion établie. +Cela évite un panic lors de l'annulation ou de la reprise d'une connexion. + +Un BASE_MISMATCH après une issue de transport incertaine peut indiquer une perte +de l'historique de réponses du nœud. Orion refuse NATIVE_TRANSACTION_OUTCOME_UNKNOWN, +sans nouveau rebasing/identifiant qui pourrait dupliquer l'opération. Un rejet +BASE_MISMATCH prouvé sans issue incertaine permet encore de relire et rebaser les +feuilles. Queue pleine et erreurs de contrat/protocole restent terminales. + +Un timeout HTTP/barrière n'annule pas une livraison déjà admise. Observer son +état et la génération avant une nouvelle commande. Une erreur après le commit +Host n'est pas un rollback de l'ancienne instance Blue. + +Le récepteur est volatile. Tant que son parent Solar est vivant, celui-ci peut +relancer un enfant aux mêmes ports et reconstruire les ressources depuis les +derniers snapshots en RAM. La readiness signale la reprise ; les abonnements +reconnectent. Cette reprise ne restaure pas l'historique de déduplication Rust : +Orion conserve donc son refus des issues de transaction ambiguës. + +Après arrêt du parent et d'Orion, des processus neufs reconstruisent les scènes +depuis les sources/capsules immuables et la sélection désirée sur disque, sous +réserve d'attestations encore valides et d'un cache disponible à Solar. Les +résultats Blue et les mutations LSML live ne sont pas persistés. Il n'existe aucun +LSML de scène muté sauvegardé, outbox durable ou journal exactement-une-fois +transverse. Une reconnexion TCP ne certifie pas une reprise complète de l'app. + +Preuves : recovery_test.go, idle_recovery_test.go (reprise immédiate avec identité +inchangée, backoff après échec), TestIdleSocketRecoveryNative (socket privé fermé, +récepteur vivant, application réelle) et TestEditableIdleDeltaNative (WS/auteur/ACK +après une pause sur récepteur privé, document réel optionnel). +Ces probes utilisent ORION_TEST_PRIVATE_LANE_ADDRESS d'un récepteur jetable. +Le probe WS accepte ORION_TEST_IDLE_SCENE_PATH pour un snapshot natif local, +ORION_TEST_IDLE_LEAF pour la feuille et ORION_TEST_IDLE_PAUSE_MS (maximum 180000). +Il ne publie ni valeurs de scène ni credentials et ne doit jamais cibler le dev commun. +Autres preuves : TestRealNativeTransportRecovery, tests Solar de +packaging/cycle de vie et preuve CEF complète. Garder distincts le reçu serveur, +la soumission d'image Solar et la capture physique Pulsar. diff --git a/evidence/local-20261007-source-delivery/eleven/20261007T211800Z-local-clock.txt b/evidence/local-20261007-source-delivery/eleven/20261007T211800Z-local-clock.txt new file mode 100644 index 00000000..d90d87e0 --- /dev/null +++ b/evidence/local-20261007-source-delivery/eleven/20261007T211800Z-local-clock.txt @@ -0,0 +1,3 @@ +Observed: authenticated Canvas fresh ref issued_at 1791407535 against local Date.now epoch 1791407529 (six seconds ahead). +Embedded-only not-before tolerance changed from five to ten seconds. Production default remains zero; expiry/readiness deadlines remain strict. +Validation: go test ./internal/attestation ./cmd/orion passed. diff --git a/evidence/local-20261007-vision-integration/eleven/20261007T201000Z-authoring-report.json b/evidence/local-20261007-vision-integration/eleven/20261007T201000Z-authoring-report.json new file mode 100644 index 00000000..f8042896 --- /dev/null +++ b/evidence/local-20261007-vision-integration/eleven/20261007T201000Z-authoring-report.json @@ -0,0 +1,48 @@ +{ + "role": "Eleven", + "thread": "01a116c8-c342-7e62-b783-59953e085982", + "workUnit": "local-20261007-vision-integration", + "scope": "Source-only addressed editable Preview with embedded assets; exact authenticated source retrieval; complete native bound-leaf groups", + "validation": "go test ./..., go vet ./..., Windows and Linux golangci-lint PASS", + "integrationProof": { + "result": "PASS", + "scene": "local-authoring-proof", + "sceneVersion": "sha256:3acec2f28b594702bdd81f15d17a54c7ee9de08e08624f3bb16cd8f67d20eec1", + "source": "actual Prism sceneToEditableLsml; isolated authored shape/text fixture", + "orion": "actual rebuilt embedded Orion; source-only open and sequenced HTTP patch", + "native": "actual packaged Rust receiver", + "renderer": "actual Solar host and Vision WASM; headless Chromium SwiftShader", + "sourceReads": 1, + "programUntouched": true, + "immutableSourcePreserved": true, + "errors": [], + "limits": "Isolated authored fixture; no real saved Canvas scene, Blue admission, CEF, Live, recording or active Prism restart.", + "pixelOracle": { + "result": "PASS", + "beforeShapeBounds": [ + 160, + 160, + 360, + 260 + ], + "afterColourBounds": [ + 160, + 160, + 360, + 260 + ], + "afterMoveResizeBounds": [ + 220, + 160, + 480, + 260 + ], + "blackTextPixels": 334, + "textPositionUnchanged": true + } + }, + "aggregateProof": "Prism/evidence/local-20261007-vision-integration/eleven/20261007T200000Z-authoring.json", + "aggregateSha256": "5580a33431fde07e2ea480c70a067297efda3bf7b32b8ce82f28e4243d830a90", + "authority": "Push existing candidate branch; no merge, production activation or Live", + "rollback": "Revert this scoped candidate increment; Prism old running dev remains preserved" +} diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T084000Z-go-tests.jsonl b/evidence/local-20261009-capability-audit/eleven/20261009T084000Z-go-tests.jsonl new file mode 100644 index 00000000..e69de29b diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T084100Z-go-tests.jsonl b/evidence/local-20261009-capability-audit/eleven/20261009T084100Z-go-tests.jsonl new file mode 100644 index 00000000..4a523ba8 --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T084100Z-go-tests.jsonl @@ -0,0 +1,7976 @@ +{"Time":"2026-10-09T10:39:12.9486995+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/cmd/healthcheck"} +{"Time":"2026-10-09T10:39:12.9486995+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/healthcheck","Output":"? \tgithub.com/ZabLaboratory/Orion/cmd/healthcheck\t[no test files]\n"} +{"Time":"2026-10-09T10:39:12.9486995+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/cmd/healthcheck","Elapsed":0} +{"Time":"2026-10-09T10:39:35.2974555+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/cmd/orion"} +{"Time":"2026-10-09T10:39:36.4344576+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalUsesFrozenBundle"} +{"Time":"2026-10-09T10:39:36.4349751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalUsesFrozenBundle","Output":"=== RUN TestLoadEgressRoutes_EmbeddedLocalUsesFrozenBundle\n"} +{"Time":"2026-10-09T10:39:36.4424611+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalUsesFrozenBundle","Output":"--- PASS: TestLoadEgressRoutes_EmbeddedLocalUsesFrozenBundle (0.01s)\n"} +{"Time":"2026-10-09T10:39:36.4424611+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalUsesFrozenBundle","Elapsed":0.01} +{"Time":"2026-10-09T10:39:36.4429854+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalBundleMissFailsClosed"} +{"Time":"2026-10-09T10:39:36.4429854+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalBundleMissFailsClosed","Output":"=== RUN TestLoadEgressRoutes_EmbeddedLocalBundleMissFailsClosed\n"} +{"Time":"2026-10-09T10:39:36.4440478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalBundleMissFailsClosed","Output":"--- PASS: TestLoadEgressRoutes_EmbeddedLocalBundleMissFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestLoadEgressRoutes_EmbeddedLocalBundleMissFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverUsesPublishedRoute"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverUsesPublishedRoute","Output":"=== RUN TestBluehostRouteResolverUsesPublishedRoute\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverUsesPublishedRoute","Output":"--- PASS: TestBluehostRouteResolverUsesPublishedRoute (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverUsesPublishedRoute","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverFailsClosedForUnknownRoute"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverFailsClosedForUnknownRoute","Output":"=== RUN TestBluehostRouteResolverFailsClosedForUnknownRoute\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverFailsClosedForUnknownRoute","Output":"--- PASS: TestBluehostRouteResolverFailsClosedForUnknownRoute (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestBluehostRouteResolverFailsClosedForUnknownRoute","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_RoutesBySlot"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_RoutesBySlot","Output":"=== RUN TestSceneIntentMirrorFor_RoutesBySlot\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_RoutesBySlot","Output":"--- PASS: TestSceneIntentMirrorFor_RoutesBySlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_RoutesBySlot","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentEmitRoster_RoutesBySlot"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentEmitRoster_RoutesBySlot","Output":"=== RUN TestSceneIntentEmitRoster_RoutesBySlot\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentEmitRoster_RoutesBySlot","Output":"--- PASS: TestSceneIntentEmitRoster_RoutesBySlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentEmitRoster_RoutesBySlot","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_UnknownSlotFailsClosed"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_UnknownSlotFailsClosed","Output":"=== RUN TestSceneIntentMirrorFor_UnknownSlotFailsClosed\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_UnknownSlotFailsClosed","Output":"--- PASS: TestSceneIntentMirrorFor_UnknownSlotFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestSceneIntentMirrorFor_UnknownSlotFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkProjectsPreviewAndOnAir"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkProjectsPreviewAndOnAir","Output":"=== RUN TestStatelessPlatformEventSinkProjectsPreviewAndOnAir\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkProjectsPreviewAndOnAir","Output":"--- PASS: TestStatelessPlatformEventSinkProjectsPreviewAndOnAir (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkProjectsPreviewAndOnAir","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkKeepsSlotsIndependent"} +{"Time":"2026-10-09T10:39:36.4445764+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkKeepsSlotsIndependent","Output":"=== RUN TestStatelessPlatformEventSinkKeepsSlotsIndependent\n"} +{"Time":"2026-10-09T10:39:36.4858927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkKeepsSlotsIndependent","Output":"--- PASS: TestStatelessPlatformEventSinkKeepsSlotsIndependent (0.04s)\n"} +{"Time":"2026-10-09T10:39:36.4858927+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestStatelessPlatformEventSinkKeepsSlotsIndependent","Elapsed":0.04} +{"Time":"2026-10-09T10:39:36.4858927+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_EmbeddedLocalUsesSignedCapsulesWithoutWorkload"} +{"Time":"2026-10-09T10:39:36.4858927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_EmbeddedLocalUsesSignedCapsulesWithoutWorkload","Output":"=== RUN TestWireSceneIntent_EmbeddedLocalUsesSignedCapsulesWithoutWorkload\n"} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_EmbeddedLocalUsesSignedCapsulesWithoutWorkload","Output":"--- PASS: TestWireSceneIntent_EmbeddedLocalUsesSignedCapsulesWithoutWorkload (0.01s)\n"} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_EmbeddedLocalUsesSignedCapsulesWithoutWorkload","Elapsed":0.01} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_DarkByDefault"} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_DarkByDefault","Output":"=== RUN TestWireSceneIntent_DarkByDefault\n"} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_DarkByDefault","Output":"--- PASS: TestWireSceneIntent_DarkByDefault (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_DarkByDefault","Elapsed":0} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_FullyConfigured"} +{"Time":"2026-10-09T10:39:36.4947804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_FullyConfigured","Output":"=== RUN TestWireSceneIntent_FullyConfigured\n"} +{"Time":"2026-10-09T10:39:36.516401+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_FullyConfigured","Output":"--- PASS: TestWireSceneIntent_FullyConfigured (0.02s)\n"} +{"Time":"2026-10-09T10:39:36.516935+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_FullyConfigured","Elapsed":0.02} +{"Time":"2026-10-09T10:39:36.516935+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingSANFailsClosed"} +{"Time":"2026-10-09T10:39:36.516935+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingSANFailsClosed","Output":"=== RUN TestWireSceneIntent_MissingSANFailsClosed\n"} +{"Time":"2026-10-09T10:39:36.5195107+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingSANFailsClosed","Output":"--- PASS: TestWireSceneIntent_MissingSANFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.5195107+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingSANFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:36.5195107+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingOwnerTenantFailsClosed"} +{"Time":"2026-10-09T10:39:36.5195107+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingOwnerTenantFailsClosed","Output":"=== RUN TestWireSceneIntent_MissingOwnerTenantFailsClosed\n"} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingOwnerTenantFailsClosed","Output":"--- PASS: TestWireSceneIntent_MissingOwnerTenantFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_MissingOwnerTenantFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_SingleVarSetIsMisconfigurationNotDark"} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_SingleVarSetIsMisconfigurationNotDark","Output":"=== RUN TestWireSceneIntent_SingleVarSetIsMisconfigurationNotDark\n"} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_SingleVarSetIsMisconfigurationNotDark","Output":"--- PASS: TestWireSceneIntent_SingleVarSetIsMisconfigurationNotDark (0.00s)\n"} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Test":"TestWireSceneIntent_SingleVarSetIsMisconfigurationNotDark","Elapsed":0} +{"Time":"2026-10-09T10:39:36.522183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:36.5252714+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Output":"ok \tgithub.com/ZabLaboratory/Orion/cmd/orion\t1.227s\n"} +{"Time":"2026-10-09T10:39:36.5669946+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/cmd/orion","Elapsed":1.27} +{"Time":"2026-10-09T10:39:37.7016934+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/adapters"} +{"Time":"2026-10-09T10:39:38.636687+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestFinaleReactive_CompileFromPushDrivesChatDisplay"} +{"Time":"2026-10-09T10:39:38.636687+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestFinaleReactive_CompileFromPushDrivesChatDisplay","Output":"=== RUN TestFinaleReactive_CompileFromPushDrivesChatDisplay\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestFinaleReactive_CompileFromPushDrivesChatDisplay","Output":"--- PASS: TestFinaleReactive_CompileFromPushDrivesChatDisplay (0.00s)\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestFinaleReactive_CompileFromPushDrivesChatDisplay","Elapsed":0} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_KickForbidden"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_KickForbidden","Output":"=== RUN TestInbox_PlatformScope_KickForbidden\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_KickForbidden","Output":"--- PASS: TestInbox_PlatformScope_KickForbidden (0.00s)\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_KickForbidden","Elapsed":0} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_MultiPlatformToken"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_MultiPlatformToken","Output":"=== RUN TestInbox_PlatformScope_MultiPlatformToken\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_MultiPlatformToken","Output":"--- PASS: TestInbox_PlatformScope_MultiPlatformToken (0.00s)\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformScope_MultiPlatformToken","Elapsed":0} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_PlatformStreamBinding"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_PlatformStreamBinding","Output":"=== RUN TestSceneAcceptsPath_PlatformStreamBinding\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_PlatformStreamBinding","Output":"--- PASS: TestSceneAcceptsPath_PlatformStreamBinding (0.00s)\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_PlatformStreamBinding","Elapsed":0} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformServiceScope"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformServiceScope","Output":"=== RUN TestInbox_PlatformServiceScope\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformServiceScope","Output":"--- PASS: TestInbox_PlatformServiceScope (0.00s)\n"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_PlatformServiceScope","Elapsed":0} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DropMetricAndRateLimitedWarn"} +{"Time":"2026-10-09T10:39:38.6377491+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DropMetricAndRateLimitedWarn","Output":"=== RUN TestInbox_DropMetricAndRateLimitedWarn\n"} +{"Time":"2026-10-09T10:39:38.6382816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DropMetricAndRateLimitedWarn","Output":"--- PASS: TestInbox_DropMetricAndRateLimitedWarn (0.00s)\n"} +{"Time":"2026-10-09T10:39:38.6382816+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DropMetricAndRateLimitedWarn","Elapsed":0} +{"Time":"2026-10-09T10:39:38.6382816+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_ActiveOnlyNoCascade"} +{"Time":"2026-10-09T10:39:38.6382816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_ActiveOnlyNoCascade","Output":"=== RUN TestEmitToActive_ActiveOnlyNoCascade\n"} +{"Time":"2026-10-09T10:39:38.9396128+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_ActiveOnlyNoCascade","Output":"--- PASS: TestEmitToActive_ActiveOnlyNoCascade (0.30s)\n"} +{"Time":"2026-10-09T10:39:38.9396128+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_ActiveOnlyNoCascade","Elapsed":0.3} +{"Time":"2026-10-09T10:39:38.9396128+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_NoActiveSceneAbsorbed"} +{"Time":"2026-10-09T10:39:38.9396128+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_NoActiveSceneAbsorbed","Output":"=== RUN TestEmitToActive_NoActiveSceneAbsorbed\n"} +{"Time":"2026-10-09T10:39:39.2406737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_NoActiveSceneAbsorbed","Output":"--- PASS: TestEmitToActive_NoActiveSceneAbsorbed (0.30s)\n"} +{"Time":"2026-10-09T10:39:39.2406737+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestEmitToActive_NoActiveSceneAbsorbed","Elapsed":0.3} +{"Time":"2026-10-09T10:39:39.2406737+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_UnionRoutesToActiveAndRule"} +{"Time":"2026-10-09T10:39:39.2406737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_UnionRoutesToActiveAndRule","Output":"=== RUN TestInbox_UnionRoutesToActiveAndRule\n"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_UnionRoutesToActiveAndRule","Output":"--- PASS: TestInbox_UnionRoutesToActiveAndRule (0.30s)\n"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_UnionRoutesToActiveAndRule","Elapsed":0.3} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RuleReceivesWithoutActiveScene"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RuleReceivesWithoutActiveScene","Output":"=== RUN TestInbox_RuleReceivesWithoutActiveScene\n"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RuleReceivesWithoutActiveScene","Output":"--- PASS: TestInbox_RuleReceivesWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RuleReceivesWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RulePlaneReceivesPlatformWithoutActiveScene"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RulePlaneReceivesPlatformWithoutActiveScene","Output":"=== RUN TestInbox_RulePlaneReceivesPlatformWithoutActiveScene\n"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RulePlaneReceivesPlatformWithoutActiveScene","Output":"--- PASS: TestInbox_RulePlaneReceivesPlatformWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RulePlaneReceivesPlatformWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_BareSystemPathRefused"} +{"Time":"2026-10-09T10:39:39.5414283+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_BareSystemPathRefused","Output":"=== RUN TestInbox_BareSystemPathRefused\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_BareSystemPathRefused","Output":"--- PASS: TestInbox_BareSystemPathRefused (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_BareSystemPathRefused","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DeepSystemNamespaceRefused"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DeepSystemNamespaceRefused","Output":"=== RUN TestInbox_DeepSystemNamespaceRefused\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DeepSystemNamespaceRefused","Output":"--- PASS: TestInbox_DeepSystemNamespaceRefused (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_DeepSystemNamespaceRefused","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemWriteHelperSetsFlag"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemWriteHelperSetsFlag","Output":"=== RUN TestInbox_SystemWriteHelperSetsFlag\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemWriteHelperSetsFlag","Output":"--- PASS: TestInbox_SystemWriteHelperSetsFlag (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemWriteHelperSetsFlag","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_OperatorCannotFanOutSystemViaGrantedPath"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_OperatorCannotFanOutSystemViaGrantedPath","Output":"=== RUN TestInbox_OperatorCannotFanOutSystemViaGrantedPath\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_OperatorCannotFanOutSystemViaGrantedPath","Output":"--- PASS: TestInbox_OperatorCannotFanOutSystemViaGrantedPath (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_OperatorCannotFanOutSystemViaGrantedPath","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFanOut_DoesNotReachSceneForExternalWrite"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFanOut_DoesNotReachSceneForExternalWrite","Output":"=== RUN TestInbox_SystemFanOut_DoesNotReachSceneForExternalWrite\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFanOut_DoesNotReachSceneForExternalWrite","Output":"--- PASS: TestInbox_SystemFanOut_DoesNotReachSceneForExternalWrite (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFanOut_DoesNotReachSceneForExternalWrite","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFieldNotSettableFromWire"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFieldNotSettableFromWire","Output":"=== RUN TestInbox_SystemFieldNotSettableFromWire\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFieldNotSettableFromWire","Output":"--- PASS: TestInbox_SystemFieldNotSettableFromWire (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemFieldNotSettableFromWire","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemNamespaceNotWireWritable"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemNamespaceNotWireWritable","Output":"=== RUN TestInbox_SystemNamespaceNotWireWritable\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemNamespaceNotWireWritable","Output":"--- PASS: TestInbox_SystemNamespaceNotWireWritable (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_SystemNamespaceNotWireWritable","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_InternalSystemWriteKeepsTickFanOut"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_InternalSystemWriteKeepsTickFanOut","Output":"=== RUN TestInbox_InternalSystemWriteKeepsTickFanOut\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_InternalSystemWriteKeepsTickFanOut","Output":"--- PASS: TestInbox_InternalSystemWriteKeepsTickFanOut (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_InternalSystemWriteKeepsTickFanOut","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_SystemFanOutOnlyForSystemWrites"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_SystemFanOutOnlyForSystemWrites","Output":"=== RUN TestSceneAcceptsPath_SystemFanOutOnlyForSystemWrites\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_SystemFanOutOnlyForSystemWrites","Output":"--- PASS: TestSceneAcceptsPath_SystemFanOutOnlyForSystemWrites (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_SystemFanOutOnlyForSystemWrites","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_OperatorInput"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_OperatorInput","Output":"=== RUN TestSceneAcceptsPath_OperatorInput\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_OperatorInput","Output":"--- PASS: TestSceneAcceptsPath_OperatorInput (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5420681+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_OperatorInput","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_StaticSceneUnchanged"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_StaticSceneUnchanged","Output":"=== RUN TestSceneAcceptsPath_StaticSceneUnchanged\n"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_StaticSceneUnchanged","Output":"--- PASS: TestSceneAcceptsPath_StaticSceneUnchanged (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestSceneAcceptsPath_StaticSceneUnchanged","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RejectsTestNamespaceFromNonSystem"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RejectsTestNamespaceFromNonSystem","Output":"=== RUN TestInbox_RejectsTestNamespaceFromNonSystem\n"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RejectsTestNamespaceFromNonSystem","Output":"--- PASS: TestInbox_RejectsTestNamespaceFromNonSystem (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInbox_RejectsTestNamespaceFromNonSystem","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInboxPlatformEventSinkReceivesAuthorizedPlatformWrite"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInboxPlatformEventSinkReceivesAuthorizedPlatformWrite","Output":"=== RUN TestInboxPlatformEventSinkReceivesAuthorizedPlatformWrite\n"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInboxPlatformEventSinkReceivesAuthorizedPlatformWrite","Output":"--- PASS: TestInboxPlatformEventSinkReceivesAuthorizedPlatformWrite (0.00s)\n"} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Test":"TestInboxPlatformEventSinkReceivesAuthorizedPlatformWrite","Elapsed":0} +{"Time":"2026-10-09T10:39:39.5426584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:39.5501729+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/adapters\t1.848s\n"} +{"Time":"2026-10-09T10:39:39.5648545+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/adapters","Elapsed":1.863} +{"Time":"2026-10-09T10:39:42.9426203+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/api"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity","Output":"=== RUN TestOperatorGate_AntenneParity\n"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/operator"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/operator","Output":"=== RUN TestOperatorGate_AntenneParity/operator\n"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/operator","Output":"--- PASS: TestOperatorGate_AntenneParity/operator (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/operator","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/admin"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/admin","Output":"=== RUN TestOperatorGate_AntenneParity/admin\n"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/admin","Output":"--- PASS: TestOperatorGate_AntenneParity/admin (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/admin","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/viewer"} +{"Time":"2026-10-09T10:39:44.3334173+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/viewer","Output":"=== RUN TestOperatorGate_AntenneParity/viewer\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/viewer","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:7c7d597b-1812-49a7-88e8-f32b6b4c5b03] details:map[status:403] domain:service message:operator role required requestId:7c7d597b-1812-49a7-88e8-f32b6b4c5b03 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/viewer","Output":"--- PASS: TestOperatorGate_AntenneParity/viewer (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/viewer","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/anonymous"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/anonymous","Output":"=== RUN TestOperatorGate_AntenneParity/anonymous\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/anonymous","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:f325bcca-e215-48ae-afcc-d11fc51083a4] details:map[status:403] domain:service message:operator role required requestId:f325bcca-e215-48ae-afcc-d11fc51083a4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/anonymous","Output":"--- PASS: TestOperatorGate_AntenneParity/anonymous (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/anonymous","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/handshake-header-ignored-on-antenne"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/handshake-header-ignored-on-antenne","Output":"=== RUN TestOperatorGate_AntenneParity/handshake-header-ignored-on-antenne\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/handshake-header-ignored-on-antenne","Output":"--- PASS: TestOperatorGate_AntenneParity/handshake-header-ignored-on-antenne (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity/handshake-header-ignored-on-antenne","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity","Output":"--- PASS: TestOperatorGate_AntenneParity (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_AntenneParity","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam","Output":"=== RUN TestOperatorGate_EmbeddedLocalSeam\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/valid-handshake"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/valid-handshake","Output":"=== RUN TestOperatorGate_EmbeddedLocalSeam/valid-handshake\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/valid-handshake","Output":"--- PASS: TestOperatorGate_EmbeddedLocalSeam/valid-handshake (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/valid-handshake","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/no-handshake"} +{"Time":"2026-10-09T10:39:44.3823262+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/no-handshake","Output":"=== RUN TestOperatorGate_EmbeddedLocalSeam/no-handshake\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/no-handshake","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:e58f8a32-5993-4648-97f3-ed4fcfbf3cd4] details:map[status:403] domain:service message:operator role required requestId:e58f8a32-5993-4648-97f3-ed4fcfbf3cd4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/no-handshake","Output":"--- PASS: TestOperatorGate_EmbeddedLocalSeam/no-handshake (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/no-handshake","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/wrong-handshake"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/wrong-handshake","Output":"=== RUN TestOperatorGate_EmbeddedLocalSeam/wrong-handshake\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/wrong-handshake","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:264bf90a-b3a6-418e-ac98-9ca78cdffde1] details:map[status:403] domain:service message:operator role required requestId:264bf90a-b3a6-418e-ac98-9ca78cdffde1 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/wrong-handshake","Output":"--- PASS: TestOperatorGate_EmbeddedLocalSeam/wrong-handshake (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/wrong-handshake","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake","Output":"=== RUN TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:a49cb8ad-9d46-4662-bfec-e0825117ba9d] details:map[status:403] domain:service message:operator role required requestId:a49cb8ad-9d46-4662-bfec-e0825117ba9d schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake","Output":"--- PASS: TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam/spoofed-role-no-handshake","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam","Output":"--- PASS: TestOperatorGate_EmbeddedLocalSeam (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorGate_EmbeddedLocalSeam","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsProjectsThreeBoundedAssignments"} +{"Time":"2026-10-09T10:39:44.3832777+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsProjectsThreeBoundedAssignments","Output":"=== RUN TestPostCameraSlotsProjectsThreeBoundedAssignments\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsProjectsThreeBoundedAssignments","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:d466f02a-bdf6-4ef7-a318-918740934a97] details:map[status:200] domain:service message:HTTP action completed requestId:d466f02a-bdf6-4ef7-a318-918740934a97 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsProjectsThreeBoundedAssignments","Output":"--- PASS: TestPostCameraSlotsProjectsThreeBoundedAssignments (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsProjectsThreeBoundedAssignments","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit","Output":"=== RUN TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer","Output":"=== RUN TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:472f71af-8600-4d15-96af-983b069c3e68] details:map[status:403] domain:service message:operator role required requestId:472f71af-8600-4d15-96af-983b069c3e68 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer","Output":"--- PASS: TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/viewer","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots","Output":"=== RUN TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:741263de-d3a9-4ac6-9f96-97fbfb42fa52] details:map[status:400] domain:service message:Request failed requestId:741263de-d3a9-4ac6-9f96-97fbfb42fa52 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots","Output":"--- PASS: TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit/four_slots","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit","Output":"--- PASS: TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRequiresOperatorAndThreeSlotLimit","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting"} +{"Time":"2026-10-09T10:39:44.3838097+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting","Output":"=== RUN TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:4477154e-424a-4c35-8f84-000afd0da9be] details:map[status:200] domain:service message:HTTP action completed requestId:4477154e-424a-4c35-8f84-000afd0da9be schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting","Output":"--- PASS: TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsReleasesStaleBindingsBeforeProjecting","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing","Output":"=== RUN TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:dc81acf0-a485-48df-8d7c-cfc5a1b3226c] details:map[status:200] domain:service message:HTTP action completed requestId:dc81acf0-a485-48df-8d7c-cfc5a1b3226c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing","Output":"--- PASS: TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsKeepsCurrentAssignmentsWhenReleaseRouteIsMissing","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRejectsClearWithoutReleaser"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRejectsClearWithoutReleaser","Output":"=== RUN TestPostCameraSlotsRejectsClearWithoutReleaser\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRejectsClearWithoutReleaser","Output":"2026/10/09 10:39:44 ERROR Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:26f626db-1bf2-4e86-a8dc-337a30d2cbcc] details:map[status:503] domain:service message:Request failed requestId:26f626db-1bf2-4e86-a8dc-337a30d2cbcc schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRejectsClearWithoutReleaser","Output":"--- PASS: TestPostCameraSlotsRejectsClearWithoutReleaser (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostCameraSlotsRejectsClearWithoutReleaser","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram"} +{"Time":"2026-10-09T10:39:44.3843994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"=== RUN TestCockpit_SourceOnlyIntentPreviewAndProgram\n"} +{"Time":"2026-10-09T10:39:44.3891057+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:97aa39af-d018-4a65-9035-b4ac141468e7] details:map[status:200] domain:service message:HTTP action completed requestId:97aa39af-d018-4a65-9035-b4ac141468e7 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3901561+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:914de822-7455-42ff-9d71-f81d5b3b753c] details:map[status:200] domain:service message:HTTP action completed requestId:914de822-7455-42ff-9d71-f81d5b3b753c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:6c93935e-a3d0-4cbb-99a5-e20a9d938ead] details:map[status:200] domain:service message:HTTP action completed requestId:6c93935e-a3d0-4cbb-99a5-e20a9d938ead schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0e635942-2523-453f-98ad-d8568ecb86fe] details:map[status:200] domain:service message:HTTP action completed requestId:0e635942-2523-453f-98ad-d8568ecb86fe schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:ea2bac0b-8223-434a-a801-67c5dcbefc4e] details:map[status:404] domain:service message:Request failed requestId:ea2bac0b-8223-434a-a801-67c5dcbefc4e schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:f0639c30-fde2-4a4b-8dbc-ed7e25427d26] details:map[status:404] domain:service message:Request failed requestId:f0639c30-fde2-4a4b-8dbc-ed7e25427d26 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:2e35677c-62f8-423e-ad16-050694d50f96] details:map[status:404] domain:service message:Request failed requestId:2e35677c-62f8-423e-ad16-050694d50f96 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:c54d8d10-ada2-4354-b407-c931c22681c8] details:map[status:404] domain:service message:Request failed requestId:c54d8d10-ada2-4354-b407-c931c22681c8 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Output":"--- PASS: TestCockpit_SourceOnlyIntentPreviewAndProgram (0.01s)\n"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SourceOnlyIntentPreviewAndProgram","Elapsed":0.01} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty"} +{"Time":"2026-10-09T10:39:44.3906968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty","Output":"=== RUN TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty\n"} +{"Time":"2026-10-09T10:39:44.39333+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ae88bebc-ac2e-403f-b412-c903f2d9dcff] details:map[status:200] domain:service message:HTTP action completed requestId:ae88bebc-ac2e-403f-b412-c903f2d9dcff schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.39333+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:26074ea3-b80b-433e-95a9-4b2cd2b7aa35] details:map[status:200] domain:service message:HTTP action completed requestId:26074ea3-b80b-433e-95a9-4b2cd2b7aa35 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.39333+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty","Output":"--- PASS: TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.39333+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty","Elapsed":0} +{"Time":"2026-10-09T10:39:44.39333+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_RequiresOperatorRole"} +{"Time":"2026-10-09T10:39:44.39333+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_RequiresOperatorRole","Output":"=== RUN TestCockpit_RequiresOperatorRole\n"} +{"Time":"2026-10-09T10:39:44.3948476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_RequiresOperatorRole","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:7d76e765-a153-4de7-904a-559cb63f0b18] details:map[status:403] domain:service message:operator role required requestId:7d76e765-a153-4de7-904a-559cb63f0b18 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3948476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_RequiresOperatorRole","Output":"--- PASS: TestCockpit_RequiresOperatorRole (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3948476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_RequiresOperatorRole","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3948476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamIDRequired"} +{"Time":"2026-10-09T10:39:44.3948476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamIDRequired","Output":"=== RUN TestCockpit_StreamIDRequired\n"} +{"Time":"2026-10-09T10:39:44.3958966+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamIDRequired","Output":"2026/10/09 10:39:44 WARN stream_id query parameter is required prism=\"map[code:STREAM_ID_REQUIRED context:map[requestId:e74ea50e-4bf7-453f-943a-c2241c0c9142] details:map[status:400] domain:service message:stream_id query parameter is required requestId:e74ea50e-4bf7-453f-943a-c2241c0c9142 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3958966+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamIDRequired","Output":"--- PASS: TestCockpit_StreamIDRequired (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3958966+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamIDRequired","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3958966+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AggregatesParamsAndTriggers"} +{"Time":"2026-10-09T10:39:44.3958966+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AggregatesParamsAndTriggers","Output":"=== RUN TestCockpit_AggregatesParamsAndTriggers\n"} +{"Time":"2026-10-09T10:39:44.3969505+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AggregatesParamsAndTriggers","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2c770148-e1d0-4605-9b06-d7dd99092ca8] details:map[status:200] domain:service message:HTTP action completed requestId:2c770148-e1d0-4605-9b06-d7dd99092ca8 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3969505+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AggregatesParamsAndTriggers","Output":"--- PASS: TestCockpit_AggregatesParamsAndTriggers (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3969505+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AggregatesParamsAndTriggers","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3969505+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamItemsCarryRuleID"} +{"Time":"2026-10-09T10:39:44.3969505+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamItemsCarryRuleID","Output":"=== RUN TestCockpit_StreamItemsCarryRuleID\n"} +{"Time":"2026-10-09T10:39:44.3980146+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamItemsCarryRuleID","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:4ea83b32-01b2-493e-80f7-29cb4aef6701] details:map[status:200] domain:service message:HTTP action completed requestId:4ea83b32-01b2-493e-80f7-29cb4aef6701 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3980146+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamItemsCarryRuleID","Output":"--- PASS: TestCockpit_StreamItemsCarryRuleID (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3980146+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_StreamItemsCarryRuleID","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3980146+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_MultiRuleDistinctRuleIDs"} +{"Time":"2026-10-09T10:39:44.3980146+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_MultiRuleDistinctRuleIDs","Output":"=== RUN TestCockpit_MultiRuleDistinctRuleIDs\n"} +{"Time":"2026-10-09T10:39:44.3996974+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_MultiRuleDistinctRuleIDs","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0d740c51-a2dd-4429-964b-ed3b5cefc7c0] details:map[status:200] domain:service message:HTTP action completed requestId:0d740c51-a2dd-4429-964b-ed3b5cefc7c0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.3996974+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_MultiRuleDistinctRuleIDs","Output":"--- PASS: TestCockpit_MultiRuleDistinctRuleIDs (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.3996974+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_MultiRuleDistinctRuleIDs","Elapsed":0} +{"Time":"2026-10-09T10:39:44.3996974+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SceneItemShapeByteStable"} +{"Time":"2026-10-09T10:39:44.3996974+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SceneItemShapeByteStable","Output":"=== RUN TestCockpit_SceneItemShapeByteStable\n"} +{"Time":"2026-10-09T10:39:44.4014126+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SceneItemShapeByteStable","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:529bb4f5-3019-4fa4-990a-7adbeb5b8216] details:map[status:200] domain:service message:HTTP action completed requestId:529bb4f5-3019-4fa4-990a-7adbeb5b8216 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4014126+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SceneItemShapeByteStable","Output":"--- PASS: TestCockpit_SceneItemShapeByteStable (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4014126+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_SceneItemShapeByteStable","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4014126+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PendingAwaitPresentAndScoped"} +{"Time":"2026-10-09T10:39:44.4014126+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PendingAwaitPresentAndScoped","Output":"=== RUN TestCockpit_PendingAwaitPresentAndScoped\n"} +{"Time":"2026-10-09T10:39:44.4024669+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PendingAwaitPresentAndScoped","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:8edf678d-83c0-4a92-897e-7fc7405c2e44] details:map[status:200] domain:service message:HTTP action completed requestId:8edf678d-83c0-4a92-897e-7fc7405c2e44 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4024669+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PendingAwaitPresentAndScoped","Output":"--- PASS: TestCockpit_PendingAwaitPresentAndScoped (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4024669+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_PendingAwaitPresentAndScoped","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4024669+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve"} +{"Time":"2026-10-09T10:39:44.4024669+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve","Output":"=== RUN TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve\n"} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:5ca1ad8d-ead5-4a76-b378-866d563f8cd0] details:map[status:200] domain:service message:HTTP action completed requestId:5ca1ad8d-ead5-4a76-b378-866d563f8cd0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e96adef2-8fcb-4483-b8fc-88b6925ae457] details:map[status:200] domain:service message:HTTP action completed requestId:e96adef2-8fcb-4483-b8fc-88b6925ae457 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e88bd513-8138-4532-87b0-b7471e916686] details:map[status:200] domain:service message:HTTP action completed requestId:e88bd513-8138-4532-87b0-b7471e916686 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve","Output":"--- PASS: TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBArmedAwaitJoinsDeclaredMetadataAndClearsOnResolve","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded"} +{"Time":"2026-10-09T10:39:44.4035294+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded","Output":"=== RUN TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded\n"} +{"Time":"2026-10-09T10:39:44.4051548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7348a061-0ed0-4377-af12-2587aa3a4221] details:map[status:200] domain:service message:HTTP action completed requestId:7348a061-0ed0-4377-af12-2587aa3a4221 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4051548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded","Output":"--- PASS: TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4051548+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4051548+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna"} +{"Time":"2026-10-09T10:39:44.4051548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna","Output":"=== RUN TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna\n"} +{"Time":"2026-10-09T10:39:44.4067873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:011abf9f-2966-483b-8e16-44a9e36c207b] details:map[status:200] domain:service message:HTTP action completed requestId:011abf9f-2966-483b-8e16-44a9e36c207b schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4067873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna","Output":"--- PASS: TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4067873+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4067873+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot"} +{"Time":"2026-10-09T10:39:44.4067873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot","Output":"=== RUN TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot\n"} +{"Time":"2026-10-09T10:39:44.408925+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:53a5e250-62c3-4728-9184-05110ac1311e] details:map[status:200] domain:service message:HTTP action completed requestId:53a5e250-62c3-4728-9184-05110ac1311e schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.408925+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot","Output":"--- PASS: TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.408925+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot","Elapsed":0} +{"Time":"2026-10-09T10:39:44.408925+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_UnknownTargetRejected"} +{"Time":"2026-10-09T10:39:44.408925+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_UnknownTargetRejected","Output":"=== RUN TestCockpit_UnknownTargetRejected\n"} +{"Time":"2026-10-09T10:39:44.4099867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_UnknownTargetRejected","Output":"2026/10/09 10:39:44 WARN target must be absent or \"preview\" prism=\"map[code:UNKNOWN_TARGET context:map[requestId:99340a40-5233-4bd7-8642-9b83dda186c7] details:map[status:400] domain:service message:target must be absent or \\\"preview\\\" requestId:99340a40-5233-4bd7-8642-9b83dda186c7 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4099867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_UnknownTargetRejected","Output":"--- PASS: TestCockpit_UnknownTargetRejected (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4099867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_UnknownTargetRejected","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4099867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_OverlayAppTriggerStreamScoped"} +{"Time":"2026-10-09T10:39:44.4099867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_OverlayAppTriggerStreamScoped","Output":"=== RUN TestCockpit_OverlayAppTriggerStreamScoped\n"} +{"Time":"2026-10-09T10:39:44.4105279+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_OverlayAppTriggerStreamScoped","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:45b52311-b67f-4d2f-b8bb-a48f8b824460] details:map[status:200] domain:service message:HTTP action completed requestId:45b52311-b67f-4d2f-b8bb-a48f8b824460 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4105279+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_OverlayAppTriggerStreamScoped","Output":"--- PASS: TestCockpit_OverlayAppTriggerStreamScoped (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4105279+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCockpit_OverlayAppTriggerStreamScoped","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4105279+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_TruthAndRanking"} +{"Time":"2026-10-09T10:39:44.4105279+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_TruthAndRanking","Output":"=== RUN TestDBSchema_TruthAndRanking\n"} +{"Time":"2026-10-09T10:39:44.4131696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_TruthAndRanking","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ea4bb515-1040-4882-a1b4-955c717f6fcf] details:map[status:200] domain:service message:HTTP action completed requestId:ea4bb515-1040-4882-a1b4-955c717f6fcf schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4131696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_TruthAndRanking","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0cd55d46-d03c-4cd9-b79c-48d86eda4d2b] details:map[status:200] domain:service message:HTTP action completed requestId:0cd55d46-d03c-4cd9-b79c-48d86eda4d2b schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4131696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_TruthAndRanking","Output":"--- PASS: TestDBSchema_TruthAndRanking (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4131696+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_TruthAndRanking","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4131696+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_SearchableExcludesPKAndNonText"} +{"Time":"2026-10-09T10:39:44.4131696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_SearchableExcludesPKAndNonText","Output":"=== RUN TestDBSchema_SearchableExcludesPKAndNonText\n"} +{"Time":"2026-10-09T10:39:44.4142298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_SearchableExcludesPKAndNonText","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:448b7df9-14c2-4c73-8341-b6d7665ee024] details:map[status:200] domain:service message:HTTP action completed requestId:448b7df9-14c2-4c73-8341-b6d7665ee024 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4142298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_SearchableExcludesPKAndNonText","Output":"--- PASS: TestDBSchema_SearchableExcludesPKAndNonText (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4142298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_SearchableExcludesPKAndNonText","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4142298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_UndeclaredDatasource"} +{"Time":"2026-10-09T10:39:44.4142298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_UndeclaredDatasource","Output":"=== RUN TestDBSchema_UndeclaredDatasource\n"} +{"Time":"2026-10-09T10:39:44.4153198+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_UndeclaredDatasource","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:DATASOURCE_NOT_DECLARED context:map[requestId:efe9d490-3817-4885-8d7f-eba9a1a0730e] details:map[status:404] domain:service message:Request failed requestId:efe9d490-3817-4885-8d7f-eba9a1a0730e schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4153198+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_UndeclaredDatasource","Output":"--- PASS: TestDBSchema_UndeclaredDatasource (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4153198+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDBSchema_UndeclaredDatasource","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4153198+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_DBTableEntries"} +{"Time":"2026-10-09T10:39:44.4153198+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_DBTableEntries","Output":"=== RUN TestListDatasources_DBTableEntries\n"} +{"Time":"2026-10-09T10:39:44.4163582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_DBTableEntries","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:256670d5-bf0a-4f29-9077-495f71492818] details:map[status:200] domain:service message:HTTP action completed requestId:256670d5-bf0a-4f29-9077-495f71492818 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4168746+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_DBTableEntries","Output":"--- PASS: TestListDatasources_DBTableEntries (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4168746+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_DBTableEntries","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4168746+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_SkipsUnreachable"} +{"Time":"2026-10-09T10:39:44.4168746+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_SkipsUnreachable","Output":"=== RUN TestListDatasources_SkipsUnreachable\n"} +{"Time":"2026-10-09T10:39:44.4173923+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_SkipsUnreachable","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:259604a7-aa68-4187-b783-0ee37a3aa3a8] details:map[status:200] domain:service message:HTTP action completed requestId:259604a7-aa68-4187-b783-0ee37a3aa3a8 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4173923+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_SkipsUnreachable","Output":"--- PASS: TestListDatasources_SkipsUnreachable (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4173923+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestListDatasources_SkipsUnreachable","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4173923+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealEditableAuthoringNative"} +{"Time":"2026-10-09T10:39:44.4173923+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealEditableAuthoringNative","Output":"=== RUN TestRealEditableAuthoringNative\n"} +{"Time":"2026-10-09T10:39:44.4173923+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealEditableAuthoringNative","Output":" editable_native_delivery_test.go:24: requires disposable native receiver\n"} +{"Time":"2026-10-09T10:39:44.4183996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealEditableAuthoringNative","Output":"--- SKIP: TestRealEditableAuthoringNative (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4183996+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealEditableAuthoringNative","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4183996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts"} +{"Time":"2026-10-09T10:39:44.4183996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts","Output":"=== RUN TestEditablePreviewTypedCompilerContracts\n"} +{"Time":"2026-10-09T10:39:44.4183996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes"} +{"Time":"2026-10-09T10:39:44.4183996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"=== RUN TestEditablePreviewTypedCompilerContracts/bytes\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:16406857-5d82-4e59-bf96-6930ee0f491e] details:map[status:200] domain:service message:HTTP action completed requestId:16406857-5d82-4e59-bf96-6930ee0f491e schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"2026/10/09 10:39:44 WARN decode static LSML layout: layout is not an object prism=\"map[code:STATIC_BUNDLE_COMPILE_FAILED context:map[requestId:33525689-297b-4536-9c60-61e11a6e56a4] details:map[status:422] domain:service message:decode static LSML layout: layout is not an object requestId:33525689-297b-4536-9c60-61e11a6e56a4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"2026/10/09 10:39:44 ERROR Request failed prism=\"map[code:STATIC_BUNDLE_INVALID context:map[requestId:aa8cc703-2277-43a3-9eb6-5385e829ce5c] details:map[status:500] domain:service message:Request failed requestId:aa8cc703-2277-43a3-9eb6-5385e829ce5c schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:34f92e11-e1bc-4f17-ad92-31315f6f0e3c] details:map[status:202] domain:service message:HTTP action completed requestId:34f92e11-e1bc-4f17-ad92-31315f6f0e3c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"2026/10/09 10:39:44 WARN editable preview sequence conflict prism=\"map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:3aab3f9f-b57e-4e11-b51e-67e847beefda] details:map[status:409] domain:service message:editable preview sequence conflict requestId:3aab3f9f-b57e-4e11-b51e-67e847beefda schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Output":"--- PASS: TestEditablePreviewTypedCompilerContracts/bytes (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/bytes","Elapsed":0} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"=== RUN TestEditablePreviewTypedCompilerContracts/typed\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:8460b3ec-915c-47c8-bb0d-97611bd6818e] details:map[status:200] domain:service message:HTTP action completed requestId:8460b3ec-915c-47c8-bb0d-97611bd6818e schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"2026/10/09 10:39:44 WARN decode static LSML layout: layout is not an object prism=\"map[code:STATIC_BUNDLE_COMPILE_FAILED context:map[requestId:9c55e4aa-c9c2-46ef-9a80-9c862fb1e309] details:map[status:422] domain:service message:decode static LSML layout: layout is not an object requestId:9c55e4aa-c9c2-46ef-9a80-9c862fb1e309 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"2026/10/09 10:39:44 ERROR Request failed prism=\"map[code:STATIC_BUNDLE_INVALID context:map[requestId:ece23360-9c91-4731-8ff0-f584777f6b54] details:map[status:500] domain:service message:Request failed requestId:ece23360-9c91-4731-8ff0-f584777f6b54 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.418906+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:6bc2a0a0-7a06-4623-ac3f-3a0f287188ff] details:map[status:202] domain:service message:HTTP action completed requestId:6bc2a0a0-7a06-4623-ac3f-3a0f287188ff schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"2026/10/09 10:39:44 WARN editable preview sequence conflict prism=\"map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:a1bb5330-6c90-4644-b2c5-91f159b59879] details:map[status:409] domain:service message:editable preview sequence conflict requestId:a1bb5330-6c90-4644-b2c5-91f159b59879 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Output":"--- PASS: TestEditablePreviewTypedCompilerContracts/typed (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts/typed","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts","Output":"--- PASS: TestEditablePreviewTypedCompilerContracts (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedCompilerContracts","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedOnlyAndNilBundle"} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedOnlyAndNilBundle","Output":"=== RUN TestEditablePreviewTypedOnlyAndNilBundle\n"} +{"Time":"2026-10-09T10:39:44.4199133+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedOnlyAndNilBundle","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:3d927fb7-ea1e-43ac-a1d8-68654827ab22] details:map[status:200] domain:service message:HTTP action completed requestId:3d927fb7-ea1e-43ac-a1d8-68654827ab22 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedOnlyAndNilBundle","Output":"2026/10/09 10:39:44 ERROR Request failed prism=\"map[code:STATIC_BUNDLE_INVALID context:map[requestId:801986e1-efb0-4a5b-abbf-869c5b23d757] details:map[status:500] domain:service message:Request failed requestId:801986e1-efb0-4a5b-abbf-869c5b23d757 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedOnlyAndNilBundle","Output":"--- PASS: TestEditablePreviewTypedOnlyAndNilBundle (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewTypedOnlyAndNilBundle","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase","Output":"=== RUN TestEditableSourceOnlyAddressAndImmutableBase\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:06a02534-b8b1-4014-9513-945f7ccd2e9c] details:map[status:200] domain:service message:HTTP action completed requestId:06a02534-b8b1-4014-9513-945f7ccd2e9c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:77fd26ea-1072-402b-b588-24011997e135] details:map[status:202] domain:service message:HTTP action completed requestId:77fd26ea-1072-402b-b588-24011997e135 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase","Output":"2026/10/09 10:39:44 WARN editable LSML content address mismatch prism=\"map[code:STATIC_BUNDLE_COMPILE_FAILED context:map[requestId:8dc9806c-35fb-4dce-9418-0303e0c8f676] details:map[status:422] domain:service message:editable LSML content address mismatch requestId:8dc9806c-35fb-4dce-9418-0303e0c8f676 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase","Output":"--- PASS: TestEditableSourceOnlyAddressAndImmutableBase (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditableSourceOnlyAddressAndImmutableBase","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewServiceSocketTargetsOnlyEditablePreview"} +{"Time":"2026-10-09T10:39:44.4204176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewServiceSocketTargetsOnlyEditablePreview","Output":"=== RUN TestEditablePreviewServiceSocketTargetsOnlyEditablePreview\n"} +{"Time":"2026-10-09T10:39:44.4214232+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewServiceSocketTargetsOnlyEditablePreview","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e0b405af-6e6a-4079-a4b7-d74826bf2c7a] details:map[status:200] domain:service message:HTTP action completed requestId:e0b405af-6e6a-4079-a4b7-d74826bf2c7a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4234303+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewServiceSocketTargetsOnlyEditablePreview","Output":"--- PASS: TestEditablePreviewServiceSocketTargetsOnlyEditablePreview (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4234303+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewServiceSocketTargetsOnlyEditablePreview","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4234303+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence"} +{"Time":"2026-10-09T10:39:44.4234303+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence","Output":"=== RUN TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence\n"} +{"Time":"2026-10-09T10:39:44.4234303+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:525ba0f1-ff34-4ec7-901c-21b48d7b4b85] details:map[status:200] domain:service message:HTTP action completed requestId:525ba0f1-ff34-4ec7-901c-21b48d7b4b85 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4244289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:58083f66-2890-4a0d-af1c-63dbd71a7a7f] details:map[status:403] domain:service message:Request failed requestId:58083f66-2890-4a0d-af1c-63dbd71a7a7f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence","Output":"--- PASS: TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewSocketUsesDistinctCapabilityAndOrderedSequence","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"=== RUN TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"2026/10/09 10:39:44 WARN Request failed prism=\"map[code:NOT_FOUND context:map[requestId:425b277d-6ea3-4b55-9b9e-bc95df7c12a6] details:map[status:404] domain:service message:Request failed requestId:425b277d-6ea3-4b55-9b9e-bc95df7c12a6 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"2026/10/09 10:39:44 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:433e9fa1-2dc4-4097-b6ad-bc0b0f31ce5b] details:map[status:403] domain:service message:operator role required requestId:433e9fa1-2dc4-4097-b6ad-bc0b0f31ce5b schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:621e7ee4-fae5-478e-81d9-7f8d120b08b1] details:map[status:200] domain:service message:HTTP action completed requestId:621e7ee4-fae5-478e-81d9-7f8d120b08b1 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:36134bcf-e345-4039-b289-1677e9d0727c] details:map[status:200] domain:service message:HTTP action completed requestId:36134bcf-e345-4039-b289-1677e9d0727c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a6eaf733-c3e4-4c4e-b8f6-2f507d78819a] details:map[status:202] domain:service message:HTTP action completed requestId:a6eaf733-c3e4-4c4e-b8f6-2f507d78819a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"2026/10/09 10:39:44 WARN editable preview sequence conflict prism=\"map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:8aa5d054-6b1a-4dd9-bbe2-6ad0bc0f6124] details:map[status:409] domain:service message:editable preview sequence conflict requestId:8aa5d054-6b1a-4dd9-bbe2-6ad0bc0f6124 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Output":"--- PASS: TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.4254522+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestEditablePreviewAPIIsEmbeddedOperatorOnlyAndSequenceChecked","Elapsed":0} +{"Time":"2026-10-09T10:39:44.4264605+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect"} +{"Time":"2026-10-09T10:39:44.4264605+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect","Output":"=== RUN TestCompletion_Gate1_ScopeParentIsDefect\n"} +{"Time":"2026-10-09T10:39:44.4264605+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.anim"} +{"Time":"2026-10-09T10:39:44.4264605+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.anim","Output":"=== RUN TestCompletion_Gate1_ScopeParentIsDefect/__system.anim\n"} +{"Time":"2026-10-09T10:39:44.4293157+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.anim","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b8040010-134f-4590-8191-67439128dfb9] details:map[status:202] domain:service message:HTTP action completed requestId:b8040010-134f-4590-8191-67439128dfb9 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.4799268+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.anim","Output":"--- PASS: TestCompletion_Gate1_ScopeParentIsDefect/__system.anim (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.4799268+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.anim","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.4799268+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.*"} +{"Time":"2026-10-09T10:39:44.4799268+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.*","Output":"=== RUN TestCompletion_Gate1_ScopeParentIsDefect/__system.*\n"} +{"Time":"2026-10-09T10:39:44.4827475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.*","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c4c05efb-6ff0-4b51-9f56-951c6c0bff20] details:map[status:202] domain:service message:HTTP action completed requestId:c4c05efb-6ff0-4b51-9f56-951c6c0bff20 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.5331208+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.*","Output":"--- PASS: TestCompletion_Gate1_ScopeParentIsDefect/__system.* (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.5331208+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system.*","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.5331208+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system"} +{"Time":"2026-10-09T10:39:44.5331208+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system","Output":"=== RUN TestCompletion_Gate1_ScopeParentIsDefect/__system\n"} +{"Time":"2026-10-09T10:39:44.5358666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:de54ebc2-5117-4cca-96c0-a1246448131f] details:map[status:202] domain:service message:HTTP action completed requestId:de54ebc2-5117-4cca-96c0-a1246448131f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.5860618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system","Output":"--- PASS: TestCompletion_Gate1_ScopeParentIsDefect/__system (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.5860618+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect/__system","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.5860618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect","Output":"--- PASS: TestCompletion_Gate1_ScopeParentIsDefect (0.16s)\n"} +{"Time":"2026-10-09T10:39:44.5860618+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeParentIsDefect","Elapsed":0.16} +{"Time":"2026-10-09T10:39:44.5860618+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeExtension_Rejected"} +{"Time":"2026-10-09T10:39:44.5860618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeExtension_Rejected","Output":"=== RUN TestCompletion_Gate1_ScopeExtension_Rejected\n"} +{"Time":"2026-10-09T10:39:44.5888055+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeExtension_Rejected","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:687a9ed4-0abb-483c-ab97-5a118c076cb3] details:map[status:202] domain:service message:HTTP action completed requestId:687a9ed4-0abb-483c-ab97-5a118c076cb3 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.6391999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeExtension_Rejected","Output":"--- PASS: TestCompletion_Gate1_ScopeExtension_Rejected (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.6391999+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeExtension_Rejected","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.6391999+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeSubstring_Rejected"} +{"Time":"2026-10-09T10:39:44.6391999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeSubstring_Rejected","Output":"=== RUN TestCompletion_Gate1_ScopeSubstring_Rejected\n"} +{"Time":"2026-10-09T10:39:44.6418198+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeSubstring_Rejected","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ce0db71b-3807-460d-9cfd-0f2115f613c4] details:map[status:202] domain:service message:HTTP action completed requestId:ce0db71b-3807-460d-9cfd-0f2115f613c4 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.6949831+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeSubstring_Rejected","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:aea7446d-1da0-4586-a063-f18d4a795fa9] details:map[status:202] domain:service message:HTTP action completed requestId:aea7446d-1da0-4586-a063-f18d4a795fa9 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.6949831+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeSubstring_Rejected","Output":"--- PASS: TestCompletion_Gate1_ScopeSubstring_Rejected (0.06s)\n"} +{"Time":"2026-10-09T10:39:44.6949831+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_ScopeSubstring_Rejected","Elapsed":0.06} +{"Time":"2026-10-09T10:39:44.6949831+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_DoubleReport_SecondIsUnknownDrop"} +{"Time":"2026-10-09T10:39:44.6949831+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_DoubleReport_SecondIsUnknownDrop","Output":"=== RUN TestCompletion_DoubleReport_SecondIsUnknownDrop\n"} +{"Time":"2026-10-09T10:39:44.6975911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_DoubleReport_SecondIsUnknownDrop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:6bf9444c-8f64-4b34-b989-3f92f6c31ad3] details:map[status:202] domain:service message:HTTP action completed requestId:6bf9444c-8f64-4b34-b989-3f92f6c31ad3 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.6975911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_DoubleReport_SecondIsUnknownDrop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:3b22b63e-a537-4f89-a63d-7c66be69e2df] details:map[status:202] domain:service message:HTTP action completed requestId:3b22b63e-a537-4f89-a63d-7c66be69e2df schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.6975911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_DoubleReport_SecondIsUnknownDrop","Output":"--- PASS: TestCompletion_DoubleReport_SecondIsUnknownDrop (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.6975911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_DoubleReport_SecondIsUnknownDrop","Elapsed":0} +{"Time":"2026-10-09T10:39:44.6975911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical"} +{"Time":"2026-10-09T10:39:44.6975911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical","Output":"=== RUN TestCompletion_NoLeak_AllReasons_BodyIdentical\n"} +{"Time":"2026-10-09T10:39:44.700754+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:62b785ce-b8a3-4db3-b959-5bef2dfda471] details:map[status:202] domain:service message:HTTP action completed requestId:62b785ce-b8a3-4db3-b959-5bef2dfda471 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop","Output":"=== RUN TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b2ee41f0-eda1-4465-a541-871bb6d6104c] details:map[status:202] domain:service message:HTTP action completed requestId:b2ee41f0-eda1-4465-a541-871bb6d6104c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop","Output":"--- PASS: TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/role-drop","Elapsed":0} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop","Output":"=== RUN TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0d6f1355-5593-4ca3-8d8d-5a752993dfc0] details:map[status:202] domain:service message:HTTP action completed requestId:0d6f1355-5593-4ca3-8d8d-5a752993dfc0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop","Output":"--- PASS: TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/scene-drop","Elapsed":0} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop","Output":"=== RUN TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:654b2895-2b91-4d91-8934-4b6a39233681] details:map[status:202] domain:service message:HTTP action completed requestId:654b2895-2b91-4d91-8934-4b6a39233681 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop","Output":"--- PASS: TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/malformed-drop","Elapsed":0} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop","Output":"=== RUN TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:1154e2bf-4103-4968-9282-59294f24bec2] details:map[status:202] domain:service message:HTTP action completed requestId:1154e2bf-4103-4968-9282-59294f24bec2 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop","Output":"--- PASS: TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/kind-drop","Elapsed":0} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop"} +{"Time":"2026-10-09T10:39:44.7129977+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop","Output":"=== RUN TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop\n"} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:90ed9508-1bd5-4c69-a6a8-95427cac0c9d] details:map[status:202] domain:service message:HTTP action completed requestId:90ed9508-1bd5-4c69-a6a8-95427cac0c9d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop","Output":"--- PASS: TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical/unknown-drop","Elapsed":0} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical","Output":"--- PASS: TestCompletion_NoLeak_AllReasons_BodyIdentical (0.02s)\n"} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_NoLeak_AllReasons_BodyIdentical","Elapsed":0.02} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace"} +{"Time":"2026-10-09T10:39:44.7135027+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"=== RUN TestCompletion_Concurrent_EndpointRace\n"} +{"Time":"2026-10-09T10:39:44.7161223+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:dd76f9e3-fd97-4c5d-9730-e79c61dae19b] details:map[status:202] domain:service message:HTTP action completed requestId:dd76f9e3-fd97-4c5d-9730-e79c61dae19b schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:29264164-22c5-4c55-a15d-eafe05057ca1] details:map[status:202] domain:service message:HTTP action completed requestId:29264164-22c5-4c55-a15d-eafe05057ca1 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:12a49c52-4ca3-453f-b2e2-170f7cfab9e0] details:map[status:202] domain:service message:HTTP action completed requestId:12a49c52-4ca3-453f-b2e2-170f7cfab9e0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:eeee011a-7e5f-425a-9958-9349158a278a] details:map[status:202] domain:service message:HTTP action completed requestId:eeee011a-7e5f-425a-9958-9349158a278a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7acaca4e-5a5e-4772-a6f7-28d58ef7d811] details:map[status:202] domain:service message:HTTP action completed requestId:7acaca4e-5a5e-4772-a6f7-28d58ef7d811 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e6a6e710-6cef-4146-9e03-06eaace504e3] details:map[status:202] domain:service message:HTTP action completed requestId:e6a6e710-6cef-4146-9e03-06eaace504e3 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:f1478465-6d32-48ee-8d7b-429825b7dcd8] details:map[status:202] domain:service message:HTTP action completed requestId:f1478465-6d32-48ee-8d7b-429825b7dcd8 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:3d2a43b1-307a-4b65-98c5-576b37fc2b23] details:map[status:202] domain:service message:HTTP action completed requestId:3d2a43b1-307a-4b65-98c5-576b37fc2b23 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:5c3c812c-175f-4d0a-a3f4-0521f8f40868] details:map[status:202] domain:service message:HTTP action completed requestId:5c3c812c-175f-4d0a-a3f4-0521f8f40868 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b211e474-7e8f-4627-a381-96ba9fe05673] details:map[status:202] domain:service message:HTTP action completed requestId:b211e474-7e8f-4627-a381-96ba9fe05673 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:14cdbc28-e038-4e7e-96f2-b005e2162712] details:map[status:202] domain:service message:HTTP action completed requestId:14cdbc28-e038-4e7e-96f2-b005e2162712 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b998f0ff-5302-4a2a-819c-587c26f6a400] details:map[status:202] domain:service message:HTTP action completed requestId:b998f0ff-5302-4a2a-819c-587c26f6a400 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:539192c0-96fc-436c-ad95-b5999bafc45e] details:map[status:202] domain:service message:HTTP action completed requestId:539192c0-96fc-436c-ad95-b5999bafc45e schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:50b65bc9-8d22-4e4c-a417-90325fe6df13] details:map[status:202] domain:service message:HTTP action completed requestId:50b65bc9-8d22-4e4c-a417-90325fe6df13 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a98409ec-9906-4d25-9592-d6517ddf7312] details:map[status:202] domain:service message:HTTP action completed requestId:a98409ec-9906-4d25-9592-d6517ddf7312 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b7fec701-a906-4441-81c7-0d6a6833ec80] details:map[status:202] domain:service message:HTTP action completed requestId:b7fec701-a906-4441-81c7-0d6a6833ec80 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b571c7fd-8d3f-45f5-be04-f224a833dc6f] details:map[status:202] domain:service message:HTTP action completed requestId:b571c7fd-8d3f-45f5-be04-f224a833dc6f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:56c9bdac-6a03-4ce0-b671-f50c0577c10d] details:map[status:202] domain:service message:HTTP action completed requestId:56c9bdac-6a03-4ce0-b671-f50c0577c10d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:df2ca095-1dc6-43af-97bc-9429dbb9c68b] details:map[status:202] domain:service message:HTTP action completed requestId:df2ca095-1dc6-43af-97bc-9429dbb9c68b schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:07c6ff89-9289-4381-aab0-9c8f8a84c597] details:map[status:202] domain:service message:HTTP action completed requestId:07c6ff89-9289-4381-aab0-9c8f8a84c597 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Output":"--- PASS: TestCompletion_Concurrent_EndpointRace (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Concurrent_EndpointRace","Elapsed":0} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_HappyPathResumes"} +{"Time":"2026-10-09T10:39:44.7166458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_HappyPathResumes","Output":"=== RUN TestCompletion_HappyPathResumes\n"} +{"Time":"2026-10-09T10:39:44.718734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_HappyPathResumes","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:dbd43bd0-2844-4b9f-b51d-025161f1b724] details:map[status:202] domain:service message:HTTP action completed requestId:dbd43bd0-2844-4b9f-b51d-025161f1b724 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.718734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_HappyPathResumes","Output":"--- PASS: TestCompletion_HappyPathResumes (0.00s)\n"} +{"Time":"2026-10-09T10:39:44.718734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_HappyPathResumes","Elapsed":0} +{"Time":"2026-10-09T10:39:44.718734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope"} +{"Time":"2026-10-09T10:39:44.718734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"=== RUN TestCompletion_Gate1_RoleScope\n"} +{"Time":"2026-10-09T10:39:44.721365+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:6e76282d-3b3d-4312-bcf3-9662d72b06f9] details:map[status:202] domain:service message:HTTP action completed requestId:6e76282d-3b3d-4312-bcf3-9662d72b06f9 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.721365+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7ddc958e-1dbe-4467-a2eb-f004c50ec77c] details:map[status:202] domain:service message:HTTP action completed requestId:7ddc958e-1dbe-4467-a2eb-f004c50ec77c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.721365+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:770da6da-dc75-487a-bfee-42ac3c4cae1c] details:map[status:202] domain:service message:HTTP action completed requestId:770da6da-dc75-487a-bfee-42ac3c4cae1c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.721365+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:624bb6c0-d770-4a58-a9ee-720b6ea8c913] details:map[status:202] domain:service message:HTTP action completed requestId:624bb6c0-d770-4a58-a9ee-720b6ea8c913 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.721365+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b99e140d-22fa-4b99-a720-fc63ae206350] details:map[status:202] domain:service message:HTTP action completed requestId:b99e140d-22fa-4b99-a720-fc63ae206350 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7716918+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:82ec6abb-e56a-49af-a766-be1fd3f57dba] details:map[status:202] domain:service message:HTTP action completed requestId:82ec6abb-e56a-49af-a766-be1fd3f57dba schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.7716918+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Output":"--- PASS: TestCompletion_Gate1_RoleScope (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.7716918+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate1_RoleScope","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.7716918+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate2_SceneMatch"} +{"Time":"2026-10-09T10:39:44.7716918+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate2_SceneMatch","Output":"=== RUN TestCompletion_Gate2_SceneMatch\n"} +{"Time":"2026-10-09T10:39:44.7744534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate2_SceneMatch","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2cf5fd3b-d16c-4af0-8477-e323539b9646] details:map[status:202] domain:service message:HTTP action completed requestId:2cf5fd3b-d16c-4af0-8477-e323539b9646 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.8249773+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate2_SceneMatch","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:5728143c-13ac-4d31-bd0b-293fd00a4d40] details:map[status:202] domain:service message:HTTP action completed requestId:5728143c-13ac-4d31-bd0b-293fd00a4d40 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.8249773+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate2_SceneMatch","Output":"--- PASS: TestCompletion_Gate2_SceneMatch (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.8249773+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate2_SceneMatch","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.8249773+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate3_StaleEpoch"} +{"Time":"2026-10-09T10:39:44.8249773+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate3_StaleEpoch","Output":"=== RUN TestCompletion_Gate3_StaleEpoch\n"} +{"Time":"2026-10-09T10:39:44.8489174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate3_StaleEpoch","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2d0572ab-d8bf-4f4f-825c-41f643f40e11] details:map[status:202] domain:service message:HTTP action completed requestId:2d0572ab-d8bf-4f4f-825c-41f643f40e11 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.899548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate3_StaleEpoch","Output":"--- PASS: TestCompletion_Gate3_StaleEpoch (0.07s)\n"} +{"Time":"2026-10-09T10:39:44.899548+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate3_StaleEpoch","Elapsed":0.07} +{"Time":"2026-10-09T10:39:44.899548+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate4_ForgedKey"} +{"Time":"2026-10-09T10:39:44.899548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate4_ForgedKey","Output":"=== RUN TestCompletion_Gate4_ForgedKey\n"} +{"Time":"2026-10-09T10:39:44.9023028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate4_ForgedKey","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a17be88c-7352-4861-bbe1-1a0b47ea716d] details:map[status:202] domain:service message:HTTP action completed requestId:a17be88c-7352-4861-bbe1-1a0b47ea716d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.9525409+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate4_ForgedKey","Output":"--- PASS: TestCompletion_Gate4_ForgedKey (0.05s)\n"} +{"Time":"2026-10-09T10:39:44.9525409+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_Gate4_ForgedKey","Elapsed":0.05} +{"Time":"2026-10-09T10:39:44.9525409+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind"} +{"Time":"2026-10-09T10:39:44.9525409+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Output":"=== RUN TestCompletion_MalformedAndWrongKind\n"} +{"Time":"2026-10-09T10:39:44.9551265+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:aaa3da3e-2f61-4e95-a26d-0944d3fdf005] details:map[status:202] domain:service message:HTTP action completed requestId:aaa3da3e-2f61-4e95-a26d-0944d3fdf005 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.9551265+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:f70630cf-932d-435a-bd6a-b8c0a58055d0] details:map[status:202] domain:service message:HTTP action completed requestId:f70630cf-932d-435a-bd6a-b8c0a58055d0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.9551265+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:832c4290-7447-40be-8627-1f0316fb3a46] details:map[status:202] domain:service message:HTTP action completed requestId:832c4290-7447-40be-8627-1f0316fb3a46 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:44.9551265+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Output":"2026/10/09 10:39:44 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7a822171-da97-47aa-9c77-edd5cf6ef378] details:map[status:202] domain:service message:HTTP action completed requestId:7a822171-da97-47aa-9c77-edd5cf6ef378 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Output":"--- PASS: TestCompletion_MalformedAndWrongKind (0.05s)\n"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_MalformedAndWrongKind","Elapsed":0.05} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_R9_InertWithoutExec"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_R9_InertWithoutExec","Output":"=== RUN TestCompletion_R9_InertWithoutExec\n"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_R9_InertWithoutExec","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:4d640229-cade-4d1e-9d2f-3ff354726149] details:map[status:202] domain:service message:HTTP action completed requestId:4d640229-cade-4d1e-9d2f-3ff354726149 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_R9_InertWithoutExec","Output":"--- PASS: TestCompletion_R9_InertWithoutExec (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCompletion_R9_InertWithoutExec","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestHostSurfaceReportsUnwiredEffectsAndHostExtensions"} +{"Time":"2026-10-09T10:39:45.0059353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestHostSurfaceReportsUnwiredEffectsAndHostExtensions","Output":"=== RUN TestHostSurfaceReportsUnwiredEffectsAndHostExtensions\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestHostSurfaceReportsUnwiredEffectsAndHostExtensions","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a51c96bd-24f7-4cbd-9e50-f2fe84c1af04] details:map[status:200] domain:service message:HTTP action completed requestId:a51c96bd-24f7-4cbd-9e50-f2fe84c1af04 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestHostSurfaceReportsUnwiredEffectsAndHostExtensions","Output":"--- PASS: TestHostSurfaceReportsUnwiredEffectsAndHostExtensions (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestHostSurfaceReportsUnwiredEffectsAndHostExtensions","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_NoHostWiredIs404"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_NoHostWiredIs404","Output":"=== RUN TestLSMLBundle_NoHostWiredIs404\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_NoHostWiredIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:c121a091-e6c0-483a-9e3c-947ca96ee7a6] details:map[status:404] domain:service message:Request failed requestId:c121a091-e6c0-483a-9e3c-947ca96ee7a6 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_NoHostWiredIs404","Output":"--- PASS: TestLSMLBundle_NoHostWiredIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_NoHostWiredIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_UnknownVersionIs404"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_UnknownVersionIs404","Output":"=== RUN TestLSMLBundle_UnknownVersionIs404\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_UnknownVersionIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:4c6952a8-c405-4527-b025-f6c9aacf4110] details:map[status:404] domain:service message:Request failed requestId:4c6952a8-c405-4527-b025-f6c9aacf4110 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_UnknownVersionIs404","Output":"--- PASS: TestLSMLBundle_UnknownVersionIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_UnknownVersionIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_MissingVersionIs404"} +{"Time":"2026-10-09T10:39:45.0065456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_MissingVersionIs404","Output":"=== RUN TestLSMLBundle_MissingVersionIs404\n"} +{"Time":"2026-10-09T10:39:45.0139838+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_MissingVersionIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:5db8aac9-ff3b-446e-8056-4377bf2c0b2e] details:map[status:404] domain:service message:Request failed requestId:5db8aac9-ff3b-446e-8056-4377bf2c0b2e schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0139838+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_MissingVersionIs404","Output":"--- PASS: TestLSMLBundle_MissingVersionIs404 (0.01s)\n"} +{"Time":"2026-10-09T10:39:45.0139838+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_MissingVersionIs404","Elapsed":0.01} +{"Time":"2026-10-09T10:39:45.0139838+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_ServesMatchingSceneAndVersion"} +{"Time":"2026-10-09T10:39:45.0139838+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_ServesMatchingSceneAndVersion","Output":"=== RUN TestLSMLBundle_ServesMatchingSceneAndVersion\n"} +{"Time":"2026-10-09T10:39:45.0139838+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_ServesMatchingSceneAndVersion","Output":"--- PASS: TestLSMLBundle_ServesMatchingSceneAndVersion (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_ServesMatchingSceneAndVersion","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_SceneIDMismatchIs404"} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_SceneIDMismatchIs404","Output":"=== RUN TestLSMLBundle_SceneIDMismatchIs404\n"} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_SceneIDMismatchIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:5bab7614-f4a7-4404-a127-f08b22e929aa] details:map[status:404] domain:service message:Request failed requestId:5bab7614-f4a7-4404-a127-f08b22e929aa schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_SceneIDMismatchIs404","Output":"--- PASS: TestLSMLBundle_SceneIDMismatchIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLSMLBundle_SceneIDMismatchIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure"} +{"Time":"2026-10-09T10:39:45.0145135+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure","Output":"=== RUN TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure\n"} +{"Time":"2026-10-09T10:39:45.0155766+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=LEC status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0155766+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure","Output":"2026/10/09 10:39:45 ERROR receiver unavailable prism=\"map[code:NATIVE_LSDP_DELIVERY_FAILED context:map[requestId:8b1be044-a76c-46d9-85f6-e19793d8eff2] details:map[status:503] domain:service message:receiver unavailable requestId:8b1be044-a76c-46d9-85f6-e19793d8eff2 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0155766+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure","Output":"--- PASS: TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0155766+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0155766+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeEditableACKWaitsForScenePublication"} +{"Time":"2026-10-09T10:39:45.0155766+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeEditableACKWaitsForScenePublication","Output":"=== RUN TestNativeEditableACKWaitsForScenePublication\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeEditableACKWaitsForScenePublication","Output":"--- PASS: TestNativeEditableACKWaitsForScenePublication (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeEditableACKWaitsForScenePublication","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeCameraACKFailureIsVisible"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeCameraACKFailureIsVisible","Output":"=== RUN TestNativeCameraACKFailureIsVisible\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeCameraACKFailureIsVisible","Output":"2026/10/09 10:39:45 ERROR Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:98910563-6be6-4a7a-9a26-6a035355057b] details:map[status:503] domain:service message:Request failed requestId:98910563-6be6-4a7a-9a26-6a035355057b schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeCameraACKFailureIsVisible","Output":"--- PASS: TestNativeCameraACKFailureIsVisible (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeCameraACKFailureIsVisible","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeOperatorVisual"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeOperatorVisual","Output":"=== RUN TestRealNativeOperatorVisual\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeOperatorVisual","Output":" native_operator_visual_test.go:31: requires the native CEF operator proof\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeOperatorVisual","Output":"--- SKIP: TestRealNativeOperatorVisual (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeOperatorVisual","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyReportsExactSharedNative"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyReportsExactSharedNative","Output":"=== RUN TestReadyReportsExactSharedNative\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyReportsExactSharedNative","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c3684c45-c0c6-4e48-a4f4-1289f6a1b850] details:map[status:200] domain:service message:HTTP action completed requestId:c3684c45-c0c6-4e48-a4f4-1289f6a1b850 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyReportsExactSharedNative","Output":"--- PASS: TestReadyReportsExactSharedNative (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyReportsExactSharedNative","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyRejectsLostNativeReception"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyRejectsLostNativeReception","Output":"=== RUN TestReadyRejectsLostNativeReception\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyRejectsLostNativeReception","Output":"2026/10/09 10:39:45 ERROR Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:3576f7f2-05b8-4fcb-a992-1f0b976b69b2] details:map[status:503] domain:service message:Request failed requestId:3576f7f2-05b8-4fcb-a992-1f0b976b69b2 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyRejectsLostNativeReception","Output":"--- PASS: TestReadyRejectsLostNativeReception (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestReadyRejectsLostNativeReception","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment","Output":"=== RUN TestNativePresentationAcknowledgment\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/matching"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/matching","Output":"=== RUN TestNativePresentationAcknowledgment/matching\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/matching","Output":"--- PASS: TestNativePresentationAcknowledgment/matching (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/matching","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_request"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_request","Output":"=== RUN TestNativePresentationAcknowledgment/other_request\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_request","Output":"--- PASS: TestNativePresentationAcknowledgment/other_request (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_request","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_scene"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_scene","Output":"=== RUN TestNativePresentationAcknowledgment/other_scene\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_scene","Output":"--- PASS: TestNativePresentationAcknowledgment/other_scene (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_scene","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_version"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_version","Output":"=== RUN TestNativePresentationAcknowledgment/other_version\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_version","Output":"--- PASS: TestNativePresentationAcknowledgment/other_version (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_version","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_phase"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_phase","Output":"=== RUN TestNativePresentationAcknowledgment/other_phase\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_phase","Output":"--- PASS: TestNativePresentationAcknowledgment/other_phase (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_phase","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_lane"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_lane","Output":"=== RUN TestNativePresentationAcknowledgment/other_lane\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_lane","Output":"--- PASS: TestNativePresentationAcknowledgment/other_lane (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment/other_lane","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment","Output":"--- PASS: TestNativePresentationAcknowledgment (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativePresentationAcknowledgment","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated"} +{"Time":"2026-10-09T10:39:45.0161169+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Output":"=== RUN TestNativeSessionLeaseAndCloseAreOperatorGated\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:0a6ba857-d9ea-4a60-ba95-496fa030e2b2] details:map[status:403] domain:service message:operator role required requestId:0a6ba857-d9ea-4a60-ba95-496fa030e2b2 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a8d01e65-6cfb-4ece-96f2-ba6f870c9705] details:map[status:200] domain:service message:HTTP action completed requestId:a8d01e65-6cfb-4ece-96f2-ba6f870c9705 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:523bf4a1-ce9c-4a31-9189-6f6f610fe443] details:map[status:403] domain:service message:operator role required requestId:523bf4a1-ce9c-4a31-9189-6f6f610fe443 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:TEST_SESSION_EXPIRED context:map[requestId:b9e6b244-c75c-451b-a1ab-8e8a358f7920] details:map[status:410] domain:service message:Request failed requestId:b9e6b244-c75c-451b-a1ab-8e8a358f7920 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Output":"--- PASS: TestNativeSessionLeaseAndCloseAreOperatorGated (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestNativeSessionLeaseAndCloseAreOperatorGated","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresOperatorRole"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresOperatorRole","Output":"=== RUN TestOperator_PendingRequiresOperatorRole\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresOperatorRole","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:f88a02b3-fc34-4a13-bd16-cb5355cb7358] details:map[status:403] domain:service message:operator role required requestId:f88a02b3-fc34-4a13-bd16-cb5355cb7358 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresOperatorRole","Output":"--- PASS: TestOperator_PendingRequiresOperatorRole (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresOperatorRole","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0166383+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresAuthentication"} +{"Time":"2026-10-09T10:39:45.0171718+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresAuthentication","Output":"=== RUN TestOperator_PendingRequiresAuthentication\n"} +{"Time":"2026-10-09T10:39:45.0171718+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresAuthentication","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:acc86199-6bc2-41b4-a6ea-67a6f9052568] details:map[status:403] domain:service message:operator role required requestId:acc86199-6bc2-41b4-a6ea-67a6f9052568 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0171718+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresAuthentication","Output":"--- PASS: TestOperator_PendingRequiresAuthentication (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0171718+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRequiresAuthentication","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0171718+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresOperatorRole"} +{"Time":"2026-10-09T10:39:45.0171718+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresOperatorRole","Output":"=== RUN TestOperator_ResolveRequiresOperatorRole\n"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresOperatorRole","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:ab13e756-e22d-49e7-ac6e-e90ae862c6b4] details:map[status:403] domain:service message:operator role required requestId:ab13e756-e22d-49e7-ac6e-e90ae862c6b4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresOperatorRole","Output":"--- PASS: TestOperator_ResolveRequiresOperatorRole (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresOperatorRole","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresAuthentication"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresAuthentication","Output":"=== RUN TestOperator_ResolveRequiresAuthentication\n"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresAuthentication","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:136f925e-867e-4770-baef-cc11478e3e7c] details:map[status:403] domain:service message:operator role required requestId:136f925e-867e-4770-baef-cc11478e3e7c schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresAuthentication","Output":"--- PASS: TestOperator_ResolveRequiresAuthentication (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveRequiresAuthentication","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingIsolatesArmedAwaitsPerSlot"} +{"Time":"2026-10-09T10:39:45.0176963+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingIsolatesArmedAwaitsPerSlot","Output":"=== RUN TestOperator_PendingIsolatesArmedAwaitsPerSlot\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingIsolatesArmedAwaitsPerSlot","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a39a12ee-65df-4e45-b55b-8feb9891eb1f] details:map[status:200] domain:service message:HTTP action completed requestId:a39a12ee-65df-4e45-b55b-8feb9891eb1f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingIsolatesArmedAwaitsPerSlot","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:479c6217-2f50-44c3-bf24-64f418b51b27] details:map[status:200] domain:service message:HTTP action completed requestId:479c6217-2f50-44c3-bf24-64f418b51b27 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingIsolatesArmedAwaitsPerSlot","Output":"--- PASS: TestOperator_PendingIsolatesArmedAwaitsPerSlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingIsolatesArmedAwaitsPerSlot","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads","Output":"=== RUN TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b3c984ee-b661-4ecd-94ae-fdeefc341ecc] details:map[status:202] domain:service message:HTTP action completed requestId:b3c984ee-b661-4ecd-94ae-fdeefc341ecc schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads","Output":"--- PASS: TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes","Output":"=== RUN TestOperatorExecutionDiscoversEveryCommandAcrossScopes\n"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program"} +{"Time":"2026-10-09T10:39:45.0198342+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"=== RUN TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program\n"} +{"Time":"2026-10-09T10:39:45.0209627+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a83b839e-8896-4393-8f25-8ca4d07f5290] details:map[status:200] domain:service message:HTTP action completed requestId:a83b839e-8896-4393-8f25-8ca4d07f5290 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=another-command status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:41162d9f-9bc3-4321-8959-15e8a08f6bd3] details:map[status:202] domain:service message:HTTP action completed requestId:41162d9f-9bc3-4321-8959-15e8a08f6bd3 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=custom_action_2026 status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7e537a5f-2bbd-4542-a2fe-152074365cf8] details:map[status:202] domain:service message:HTTP action completed requestId:7e537a5f-2bbd-4542-a2fe-152074365cf8 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=first status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:d742e788-8a22-4309-a840-c4d083b5e5a7] details:map[status:202] domain:service message:HTTP action completed requestId:d742e788-8a22-4309-a840-c4d083b5e5a7 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=new.command status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0bc1e22c-be43-4c0a-83b1-b62befeceaf4] details:map[status:202] domain:service message:HTTP action completed requestId:0bc1e22c-be43-4c0a-83b1-b62befeceaf4 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:bd910966-0153-4966-b8f0-60fc740d44c4] details:map[status:200] domain:service message:HTTP action completed requestId:bd910966-0153-4966-b8f0-60fc740d44c4 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"2026/10/09 10:39:45 WARN no live await by that name (already resolved or invalidated) prism=\"map[code:AWAIT_GONE context:map[requestId:e316714e-6595-4471-89f0-6db1ff4863ba] details:map[status:410] domain:service message:no live await by that name (already resolved or invalidated) requestId:e316714e-6595-4471-89f0-6db1ff4863ba schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Output":"--- PASS: TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/program","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview"} +{"Time":"2026-10-09T10:39:45.0214937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"=== RUN TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview\n"} +{"Time":"2026-10-09T10:39:45.0225546+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:386e1181-c1fb-4990-8595-0539bfaeb0cb] details:map[status:200] domain:service message:HTTP action completed requestId:386e1181-c1fb-4990-8595-0539bfaeb0cb schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0225546+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=another-command status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0225546+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b3d8f3b0-a953-466e-8391-bdf7bbf2b65c] details:map[status:202] domain:service message:HTTP action completed requestId:b3d8f3b0-a953-466e-8391-bdf7bbf2b65c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=custom_action_2026 status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:cdd289fc-827d-4721-8931-a21f22e418f7] details:map[status:202] domain:service message:HTTP action completed requestId:cdd289fc-827d-4721-8931-a21f22e418f7 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=first status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:990667a0-4c86-4a8e-9dfe-9a58f6691c02] details:map[status:202] domain:service message:HTTP action completed requestId:990667a0-4c86-4a8e-9dfe-9a58f6691c02 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=new.command status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:66ae6c99-8711-48e8-be55-e4db015e2340] details:map[status:202] domain:service message:HTTP action completed requestId:66ae6c99-8711-48e8-be55-e4db015e2340 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:fb593254-cdd9-4a7d-95ab-bdb621655188] details:map[status:200] domain:service message:HTTP action completed requestId:fb593254-cdd9-4a7d-95ab-bdb621655188 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"2026/10/09 10:39:45 WARN no live await by that name (already resolved or invalidated) prism=\"map[code:AWAIT_GONE context:map[requestId:6f6602b2-2f1f-426a-a0da-96406a2689c7] details:map[status:410] domain:service message:no live await by that name (already resolved or invalidated) requestId:6f6602b2-2f1f-426a-a0da-96406a2689c7 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Output":"--- PASS: TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/preview","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule"} +{"Time":"2026-10-09T10:39:45.0230691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"=== RUN TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule\n"} +{"Time":"2026-10-09T10:39:45.0241438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a22acd97-70cb-40b8-8e69-d8d01c0a5117] details:map[status:200] domain:service message:HTTP action completed requestId:a22acd97-70cb-40b8-8e69-d8d01c0a5117 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0241438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:936d38a4-a33e-42f0-a6d3-451ffa75f627] details:map[status:202] domain:service message:HTTP action completed requestId:936d38a4-a33e-42f0-a6d3-451ffa75f627 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0241438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:9017d463-b8b2-4c4b-a54d-fb5679b88f2e] details:map[status:202] domain:service message:HTTP action completed requestId:9017d463-b8b2-4c4b-a54d-fb5679b88f2e schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0241438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a86ce9e2-0bd0-43b4-9d3e-8704fbb21e39] details:map[status:202] domain:service message:HTTP action completed requestId:a86ce9e2-0bd0-43b4-9d3e-8704fbb21e39 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0241438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:70aa4aa1-baa0-4832-a15d-3a79060c155f] details:map[status:202] domain:service message:HTTP action completed requestId:70aa4aa1-baa0-4832-a15d-3a79060c155f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:20a01417-039b-4205-b790-eb4e3fd83a37] details:map[status:200] domain:service message:HTTP action completed requestId:20a01417-039b-4205-b790-eb4e3fd83a37 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"2026/10/09 10:39:45 WARN no live await by that name (already resolved or invalidated) prism=\"map[code:AWAIT_GONE context:map[requestId:967a2733-d3c2-42d4-b40f-0c170a178b07] details:map[status:410] domain:service message:no live await by that name (already resolved or invalidated) requestId:967a2733-d3c2-42d4-b40f-0c170a178b07 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Output":"--- PASS: TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes/stream-rule","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes","Output":"--- PASS: TestOperatorExecutionDiscoversEveryCommandAcrossScopes (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionDiscoversEveryCommandAcrossScopes","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure","Output":"=== RUN TestOperatorExecutionPreservesRuntimeFailure\n"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/on-air"} +{"Time":"2026-10-09T10:39:45.0246606+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/on-air","Output":"=== RUN TestOperatorExecutionPreservesRuntimeFailure/on-air\n"} +{"Time":"2026-10-09T10:39:45.0262468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/on-air","Output":"2026/10/09 10:39:45 ERROR call failed prism=\"map[code:BLUE_EXECUTION_FAILED context:map[requestId:ad8dffa0-921c-4a51-920b-1c03b2f548a7] details:map[status:500] domain:service message:call failed requestId:ad8dffa0-921c-4a51-920b-1c03b2f548a7 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0262468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/on-air","Output":"--- PASS: TestOperatorExecutionPreservesRuntimeFailure/on-air (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0262468+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/on-air","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0262468+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/preview"} +{"Time":"2026-10-09T10:39:45.0262468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/preview","Output":"=== RUN TestOperatorExecutionPreservesRuntimeFailure/preview\n"} +{"Time":"2026-10-09T10:39:45.0273035+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/preview","Output":"2026/10/09 10:39:45 ERROR call failed prism=\"map[code:BLUE_EXECUTION_FAILED context:map[requestId:03d0d568-c2c4-4f15-81d9-b630b8d20476] details:map[status:500] domain:service message:call failed requestId:03d0d568-c2c4-4f15-81d9-b630b8d20476 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0273035+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/preview","Output":"--- PASS: TestOperatorExecutionPreservesRuntimeFailure/preview (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0273035+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/preview","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0273035+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/stream-rule"} +{"Time":"2026-10-09T10:39:45.0273035+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/stream-rule","Output":"=== RUN TestOperatorExecutionPreservesRuntimeFailure/stream-rule\n"} +{"Time":"2026-10-09T10:39:45.0278314+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/stream-rule","Output":"2026/10/09 10:39:45 ERROR stream rule call failed prism=\"map[code:BLUE_EXECUTION_FAILED context:map[requestId:f63ed0d1-b28f-4eb8-ad6f-f399c104e64a] details:map[status:500] domain:service message:stream rule call failed requestId:f63ed0d1-b28f-4eb8-ad6f-f399c104e64a schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0283588+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/stream-rule","Output":"--- PASS: TestOperatorExecutionPreservesRuntimeFailure/stream-rule (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0283588+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure/stream-rule","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0283588+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure","Output":"--- PASS: TestOperatorExecutionPreservesRuntimeFailure (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0283588+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperatorExecutionPreservesRuntimeFailure","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0283588+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewFiresWhenSlotPreviewHosted"} +{"Time":"2026-10-09T10:39:45.0283588+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewFiresWhenSlotPreviewHosted","Output":"=== RUN TestOperator_CallPreviewFiresWhenSlotPreviewHosted\n"} +{"Time":"2026-10-09T10:39:45.0288805+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewFiresWhenSlotPreviewHosted","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=call status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0288805+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewFiresWhenSlotPreviewHosted","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:5e880f27-680e-46e4-97ef-2ff0f2848c39] details:map[status:202] domain:service message:HTTP action completed requestId:5e880f27-680e-46e4-97ef-2ff0f2848c39 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0288805+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewFiresWhenSlotPreviewHosted","Output":"--- PASS: TestOperator_CallPreviewFiresWhenSlotPreviewHosted (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0288805+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewFiresWhenSlotPreviewHosted","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0288805+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewProjectsResultImmediately"} +{"Time":"2026-10-09T10:39:45.0288805+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewProjectsResultImmediately","Output":"=== RUN TestOperator_CallPreviewProjectsResultImmediately\n"} +{"Time":"2026-10-09T10:39:45.0293979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewProjectsResultImmediately","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=call status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0293979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewProjectsResultImmediately","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:161c1b9a-3224-487d-9840-b180cfa7c990] details:map[status:202] domain:service message:HTTP action completed requestId:161c1b9a-3224-487d-9840-b180cfa7c990 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0293979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewProjectsResultImmediately","Output":"--- PASS: TestOperator_CallPreviewProjectsResultImmediately (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0293979+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewProjectsResultImmediately","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0293979+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewEmptySlotIs409"} +{"Time":"2026-10-09T10:39:45.0293979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewEmptySlotIs409","Output":"=== RUN TestOperator_CallPreviewEmptySlotIs409\n"} +{"Time":"2026-10-09T10:39:45.0299124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewEmptySlotIs409","Output":"2026/10/09 10:39:45 WARN blueprint is not part of the active scene prism=\"map[code:BLUEPRINT_NOT_ACTIVE context:map[requestId:342ade56-9384-4cab-ad8c-97ba1ea07a1f] details:map[status:409] domain:service message:blueprint is not part of the active scene requestId:342ade56-9384-4cab-ad8c-97ba1ea07a1f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0299124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewEmptySlotIs409","Output":"--- PASS: TestOperator_CallPreviewEmptySlotIs409 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0299124+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewEmptySlotIs409","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0299124+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewUnknownEntrypointIs409"} +{"Time":"2026-10-09T10:39:45.0299124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewUnknownEntrypointIs409","Output":"=== RUN TestOperator_CallPreviewUnknownEntrypointIs409\n"} +{"Time":"2026-10-09T10:39:45.0304318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewUnknownEntrypointIs409","Output":"2026/10/09 10:39:45 WARN no on-call entrypoint by that id on the active blueprint prism=\"map[code:ENTRYPOINT_UNKNOWN context:map[requestId:1b1897ef-e822-4b42-a41b-6e0ee2bb7d7e] details:map[status:409] domain:service message:no on-call entrypoint by that id on the active blueprint requestId:1b1897ef-e822-4b42-a41b-6e0ee2bb7d7e schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0304318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewUnknownEntrypointIs409","Output":"--- PASS: TestOperator_CallPreviewUnknownEntrypointIs409 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0304318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallPreviewUnknownEntrypointIs409","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0304318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallAntennaUnaffectedByPreviewMigration"} +{"Time":"2026-10-09T10:39:45.0304318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallAntennaUnaffectedByPreviewMigration","Output":"=== RUN TestOperator_CallAntennaUnaffectedByPreviewMigration\n"} +{"Time":"2026-10-09T10:39:45.0320225+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallAntennaUnaffectedByPreviewMigration","Output":"2026/10/09 10:39:45 WARN blueprint is not part of the active scene prism=\"map[code:BLUEPRINT_NOT_ACTIVE context:map[requestId:33e40834-1939-4a8d-a8d7-e790ccb24ebe] details:map[status:409] domain:service message:blueprint is not part of the active scene requestId:33e40834-1939-4a8d-a8d7-e790ccb24ebe schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0320225+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallAntennaUnaffectedByPreviewMigration","Output":"--- PASS: TestOperator_CallAntennaUnaffectedByPreviewMigration (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0320225+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallAntennaUnaffectedByPreviewMigration","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0320225+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays"} +{"Time":"2026-10-09T10:39:45.0320225+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"=== RUN TestOperator_CallSlotIsolationBothWays\n"} +{"Time":"2026-10-09T10:39:45.0330757+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"2026/10/09 10:39:45 WARN no on-call entrypoint by that id on the active blueprint prism=\"map[code:ENTRYPOINT_UNKNOWN context:map[requestId:6f9ec729-7bde-43d5-bed8-3a34f21e41b0] details:map[status:409] domain:service message:no on-call entrypoint by that id on the active blueprint requestId:6f9ec729-7bde-43d5-bed8-3a34f21e41b0 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"2026/10/09 10:39:45 WARN no on-call entrypoint by that id on the active blueprint prism=\"map[code:ENTRYPOINT_UNKNOWN context:map[requestId:c923b135-16d4-4dfe-8010-d3ee7e24d371] details:map[status:409] domain:service message:no on-call entrypoint by that id on the active blueprint requestId:c923b135-16d4-4dfe-8010-d3ee7e24d371 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=call-antenna status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:556d10dc-d517-4008-aa53-c8e351677ebc] details:map[status:202] domain:service message:HTTP action completed requestId:556d10dc-d517-4008-aa53-c8e351677ebc schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=preview call_id=call-preview status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:29478c32-cfe2-4b4a-9ad3-5c8d1de0d085] details:map[status:202] domain:service message:HTTP action completed requestId:29478c32-cfe2-4b4a-9ad3-5c8d1de0d085 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Output":"--- PASS: TestOperator_CallSlotIsolationBothWays (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallSlotIsolationBothWays","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted"} +{"Time":"2026-10-09T10:39:45.0336109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted","Output":"=== RUN TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted\n"} +{"Time":"2026-10-09T10:39:45.0341531+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:da49b1fa-5974-464c-ac79-a4df93c0e222] details:map[status:200] domain:service message:HTTP action completed requestId:da49b1fa-5974-464c-ac79-a4df93c0e222 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0341531+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted","Output":"--- PASS: TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0341531+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewResumesWhenSlotPreviewHosted","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0341531+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewEmptySlotIs410"} +{"Time":"2026-10-09T10:39:45.0341531+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewEmptySlotIs410","Output":"=== RUN TestOperator_ResolvePreviewEmptySlotIs410\n"} +{"Time":"2026-10-09T10:39:45.0346696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewEmptySlotIs410","Output":"2026/10/09 10:39:45 WARN no live await for this blueprint (inactive or invalidated) prism=\"map[code:AWAIT_GONE context:map[requestId:1fb6ffd3-e8f0-424e-aeda-6abe043c4f6f] details:map[status:410] domain:service message:no live await for this blueprint (inactive or invalidated) requestId:1fb6ffd3-e8f0-424e-aeda-6abe043c4f6f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0346696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewEmptySlotIs410","Output":"--- PASS: TestOperator_ResolvePreviewEmptySlotIs410 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0346696+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewEmptySlotIs410","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0346696+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewTypeMismatchIs422"} +{"Time":"2026-10-09T10:39:45.0346696+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewTypeMismatchIs422","Output":"=== RUN TestOperator_ResolvePreviewTypeMismatchIs422\n"} +{"Time":"2026-10-09T10:39:45.0357844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewTypeMismatchIs422","Output":"2026/10/09 10:39:45 WARN value does not match the await's value_type prism=\"map[code:VALUE_TYPE_MISMATCH context:map[requestId:04983f17-2e14-4336-a32c-af10eeb0d95e] details:map[status:422] domain:service message:value does not match the await's value_type requestId:04983f17-2e14-4336-a32c-af10eeb0d95e schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0357844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewTypeMismatchIs422","Output":"--- PASS: TestOperator_ResolvePreviewTypeMismatchIs422 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0357844+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolvePreviewTypeMismatchIs422","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0357844+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveAntennaUnaffectedByPreviewMigration"} +{"Time":"2026-10-09T10:39:45.0357844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveAntennaUnaffectedByPreviewMigration","Output":"=== RUN TestOperator_ResolveAntennaUnaffectedByPreviewMigration\n"} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveAntennaUnaffectedByPreviewMigration","Output":"2026/10/09 10:39:45 WARN no live await for this blueprint (inactive or invalidated) prism=\"map[code:AWAIT_GONE context:map[requestId:e18ec2bb-c35b-48a6-ae64-4bffe429fbae] details:map[status:410] domain:service message:no live await for this blueprint (inactive or invalidated) requestId:e18ec2bb-c35b-48a6-ae64-4bffe429fbae schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveAntennaUnaffectedByPreviewMigration","Output":"--- PASS: TestOperator_ResolveAntennaUnaffectedByPreviewMigration (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveAntennaUnaffectedByPreviewMigration","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve"} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve","Output":"=== RUN TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve\n"} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna"} +{"Time":"2026-10-09T10:39:45.0363113+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna","Output":"=== RUN TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna\n"} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a00841e0-df02-4599-8a83-dcbd3315fdf9] details:map[status:200] domain:service message:HTTP action completed requestId:a00841e0-df02-4599-8a83-dcbd3315fdf9 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e58f93c0-5a22-4607-b38d-a72347984fdb] details:map[status:200] domain:service message:HTTP action completed requestId:e58f93c0-5a22-4607-b38d-a72347984fdb schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:af76cd0f-bca0-4849-a453-426ac14a8d8a] details:map[status:200] domain:service message:HTTP action completed requestId:af76cd0f-bca0-4849-a453-426ac14a8d8a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna","Output":"--- PASS: TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/antenna","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview"} +{"Time":"2026-10-09T10:39:45.0373513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview","Output":"=== RUN TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview\n"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:00efc208-8635-480f-863e-28ea62564881] details:map[status:200] domain:service message:HTTP action completed requestId:00efc208-8635-480f-863e-28ea62564881 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0d650d8e-a8c9-429a-8cb5-5696288e2b80] details:map[status:200] domain:service message:HTTP action completed requestId:0d650d8e-a8c9-429a-8cb5-5696288e2b80 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e1f3221f-3355-439e-8a7f-96eb8dc74aaa] details:map[status:200] domain:service message:HTTP action completed requestId:e1f3221f-3355-439e-8a7f-96eb8dc74aaa schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview","Output":"--- PASS: TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve/preview","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve","Output":"--- PASS: TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBJoinsDeclaredMetadataAndClearsOnResolve","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded"} +{"Time":"2026-10-09T10:39:45.0383835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded","Output":"=== RUN TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:06549405-f937-4926-8a14-8ec971552f3f] details:map[status:200] domain:service message:HTTP action completed requestId:06549405-f937-4926-8a14-8ec971552f3f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded","Output":"--- PASS: TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBDeclaredAwaitNeverArmedIsExcluded","Elapsed":0} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBEmptyWhenUnhosted"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBEmptyWhenUnhosted","Output":"=== RUN TestOperator_PendingEngineBEmptyWhenUnhosted\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBEmptyWhenUnhosted","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b6819fa8-cb78-4ab0-b0bf-e82f68cde364] details:map[status:200] domain:service message:HTTP action completed requestId:b6819fa8-cb78-4ab0-b0bf-e82f68cde364 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBEmptyWhenUnhosted","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:1d7680b8-bb7c-44b4-80c0-7defd91180f6] details:map[status:200] domain:service message:HTTP action completed requestId:1d7680b8-bb7c-44b4-80c0-7defd91180f6 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBEmptyWhenUnhosted","Output":"--- PASS: TestOperator_PendingEngineBEmptyWhenUnhosted (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingEngineBEmptyWhenUnhosted","Elapsed":0} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_EmptyKeyPathDoesNotFire"} +{"Time":"2026-10-09T10:39:45.039426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_EmptyKeyPathDoesNotFire","Output":"=== RUN TestLegacy_EmptyKeyPathDoesNotFire\n"} +{"Time":"2026-10-09T10:39:45.0404311+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_EmptyKeyPathDoesNotFire","Output":"--- PASS: TestLegacy_EmptyKeyPathDoesNotFire (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0404311+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_EmptyKeyPathDoesNotFire","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0404311+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenFiresOnCall"} +{"Time":"2026-10-09T10:39:45.0404311+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenFiresOnCall","Output":"=== RUN TestLegacy_DefaultTokenFiresOnCall\n"} +{"Time":"2026-10-09T10:39:45.0409375+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenFiresOnCall","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=on_lck status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0409375+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenFiresOnCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0b6ddacb-f50c-4a8e-b49c-1fda8779a6b0] details:map[status:202] domain:service message:HTTP action completed requestId:0b6ddacb-f50c-4a8e-b49c-1fda8779a6b0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0409375+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenFiresOnCall","Output":"--- PASS: TestLegacy_DefaultTokenFiresOnCall (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0409375+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenFiresOnCall","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0409375+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenUnknownEntrypointIs409"} +{"Time":"2026-10-09T10:39:45.0409375+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenUnknownEntrypointIs409","Output":"=== RUN TestLegacy_DefaultTokenUnknownEntrypointIs409\n"} +{"Time":"2026-10-09T10:39:45.0414605+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenUnknownEntrypointIs409","Output":"2026/10/09 10:39:45 WARN blueprint is not part of the active scene prism=\"map[code:BLUEPRINT_NOT_ACTIVE context:map[requestId:1f48a2b4-6471-46ab-9006-a71c7e00f39c] details:map[status:409] domain:service message:blueprint is not part of the active scene requestId:1f48a2b4-6471-46ab-9006-a71c7e00f39c schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0414605+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenUnknownEntrypointIs409","Output":"--- PASS: TestLegacy_DefaultTokenUnknownEntrypointIs409 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0414605+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_DefaultTokenUnknownEntrypointIs409","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0414605+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken"} +{"Time":"2026-10-09T10:39:45.0414605+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken","Output":"=== RUN TestLegacy_CockpitAnnouncesDefaultToken\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a56075d6-dd2e-4acd-bcb7-618913061b3a] details:map[status:200] domain:service message:HTTP action completed requestId:a56075d6-dd2e-4acd-bcb7-618913061b3a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=on_lck status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:928c7fe8-e79e-4e75-a327-c5743d412063] details:map[status:202] domain:service message:HTTP action completed requestId:928c7fe8-e79e-4e75-a327-c5743d412063 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken","Output":"--- PASS: TestLegacy_CockpitAnnouncesDefaultToken (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLegacy_CockpitAnnouncesDefaultToken","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestBlueprintKey_RoundTrip"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestBlueprintKey_RoundTrip","Output":"=== RUN TestBlueprintKey_RoundTrip\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestBlueprintKey_RoundTrip","Output":"--- PASS: TestBlueprintKey_RoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestBlueprintKey_RoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected"} +{"Time":"2026-10-09T10:39:45.0419939+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected","Output":"=== RUN TestOperator_UnknownTargetRejected\n"} +{"Time":"2026-10-09T10:39:45.043045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected","Output":"2026/10/09 10:39:45 WARN target must be absent or \"preview\" prism=\"map[code:UNKNOWN_TARGET context:map[requestId:c346d6c6-e271-485d-b7bb-5576bf0df28b] details:map[status:400] domain:service message:target must be absent or \\\"preview\\\" requestId:c346d6c6-e271-485d-b7bb-5576bf0df28b schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.043045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected","Output":"--- PASS: TestOperator_UnknownTargetRejected (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.043045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected","Elapsed":0} +{"Time":"2026-10-09T10:39:45.043045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected_ResolveAndPending"} +{"Time":"2026-10-09T10:39:45.043045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected_ResolveAndPending","Output":"=== RUN TestOperator_UnknownTargetRejected_ResolveAndPending\n"} +{"Time":"2026-10-09T10:39:45.0440881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected_ResolveAndPending","Output":"2026/10/09 10:39:45 WARN target must be absent or \"preview\" prism=\"map[code:UNKNOWN_TARGET context:map[requestId:c0abe491-8371-4c9b-bb3c-c22e4947b207] details:map[status:400] domain:service message:target must be absent or \\\"preview\\\" requestId:c0abe491-8371-4c9b-bb3c-c22e4947b207 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0440881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected_ResolveAndPending","Output":"2026/10/09 10:39:45 WARN target must be absent or \"preview\" prism=\"map[code:UNKNOWN_TARGET context:map[requestId:ca37cd45-8fa5-4061-9da9-4dba0c72b288] details:map[status:400] domain:service message:target must be absent or \\\"preview\\\" requestId:ca37cd45-8fa5-4061-9da9-4dba0c72b288 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0440881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected_ResolveAndPending","Output":"--- PASS: TestOperator_UnknownTargetRejected_ResolveAndPending (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0440881+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_UnknownTargetRejected_ResolveAndPending","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0440881+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRequiresOperatorRole"} +{"Time":"2026-10-09T10:39:45.0440881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRequiresOperatorRole","Output":"=== RUN TestOperator_CallRequiresOperatorRole\n"} +{"Time":"2026-10-09T10:39:45.0446015+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRequiresOperatorRole","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:d378f562-9bab-4210-8448-f47e1c3a7d13] details:map[status:403] domain:service message:operator role required requestId:d378f562-9bab-4210-8448-f47e1c3a7d13 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0446015+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRequiresOperatorRole","Output":"--- PASS: TestOperator_CallRequiresOperatorRole (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0446015+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRequiresOperatorRole","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0446015+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallDormantBlueprintIs409"} +{"Time":"2026-10-09T10:39:45.0446015+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallDormantBlueprintIs409","Output":"=== RUN TestOperator_CallDormantBlueprintIs409\n"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallDormantBlueprintIs409","Output":"2026/10/09 10:39:45 WARN blueprint is not part of the active scene prism=\"map[code:BLUEPRINT_NOT_ACTIVE context:map[requestId:11094a7d-495b-41e3-95ae-caf2e8387aab] details:map[status:409] domain:service message:blueprint is not part of the active scene requestId:11094a7d-495b-41e3-95ae-caf2e8387aab schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallDormantBlueprintIs409","Output":"--- PASS: TestOperator_CallDormantBlueprintIs409 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallDormantBlueprintIs409","Elapsed":0} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallUnknownEntrypointIs409"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallUnknownEntrypointIs409","Output":"=== RUN TestOperator_CallUnknownEntrypointIs409\n"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallUnknownEntrypointIs409","Output":"2026/10/09 10:39:45 WARN blueprint is not part of the active scene prism=\"map[code:BLUEPRINT_NOT_ACTIVE context:map[requestId:2ae4d23d-fc61-470b-824c-22f3efc88c02] details:map[status:409] domain:service message:blueprint is not part of the active scene requestId:2ae4d23d-fc61-470b-824c-22f3efc88c02 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallUnknownEntrypointIs409","Output":"--- PASS: TestOperator_CallUnknownEntrypointIs409 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallUnknownEntrypointIs409","Elapsed":0} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallFiresWithPayload"} +{"Time":"2026-10-09T10:39:45.045121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallFiresWithPayload","Output":"=== RUN TestOperator_CallFiresWithPayload\n"} +{"Time":"2026-10-09T10:39:45.0461447+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallFiresWithPayload","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=call status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0461447+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallFiresWithPayload","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2507a61c-6a45-4f57-9c73-544cd6c5c44e] details:map[status:202] domain:service message:HTTP action completed requestId:2507a61c-6a45-4f57-9c73-544cd6c5c44e schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0461447+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallFiresWithPayload","Output":"--- PASS: TestOperator_CallFiresWithPayload (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0461447+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallFiresWithPayload","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0461447+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored"} +{"Time":"2026-10-09T10:39:45.0461447+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored","Output":"=== RUN TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored\n"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored","Output":"2026/10/09 10:39:45 INFO blue runtime operator call completed slot=on-air call_id=on_lck_arm status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:af361f99-e9a8-4d10-bc88-bb76ad8ec2f6] details:map[status:202] domain:service message:HTTP action completed requestId:af361f99-e9a8-4d10-bc88-bb76ad8ec2f6 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored","Output":"2026/10/09 10:39:45 WARN no on-call entrypoint by that id on the active blueprint prism=\"map[code:ENTRYPOINT_UNKNOWN context:map[requestId:4ede6518-d170-456f-926a-0c41c58bb8c4] details:map[status:409] domain:service message:no on-call entrypoint by that id on the active blueprint requestId:4ede6518-d170-456f-926a-0c41c58bb8c4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored","Output":"--- PASS: TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallEngineB_RealBlueprintIDIsAcceptedButIgnored","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRuleSelectorListsArmedAwait"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRuleSelectorListsArmedAwait","Output":"=== RUN TestOperator_PendingRuleSelectorListsArmedAwait\n"} +{"Time":"2026-10-09T10:39:45.0466737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRuleSelectorListsArmedAwait","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:dbbf9457-196d-41b3-8404-979e0a5f2780] details:map[status:200] domain:service message:HTTP action completed requestId:dbbf9457-196d-41b3-8404-979e0a5f2780 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0471911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRuleSelectorListsArmedAwait","Output":"--- PASS: TestOperator_PendingRuleSelectorListsArmedAwait (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0471911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_PendingRuleSelectorListsArmedAwait","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0471911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveTypeMismatchIs422"} +{"Time":"2026-10-09T10:39:45.0471911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveTypeMismatchIs422","Output":"=== RUN TestOperator_ResolveTypeMismatchIs422\n"} +{"Time":"2026-10-09T10:39:45.0477151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveTypeMismatchIs422","Output":"2026/10/09 10:39:45 WARN value does not match the await's value_type prism=\"map[code:VALUE_TYPE_MISMATCH context:map[requestId:33e67030-3acb-404b-8650-b364e8de6fdd] details:map[status:422] domain:service message:value does not match the await's value_type requestId:33e67030-3acb-404b-8650-b364e8de6fdd schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0477151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveTypeMismatchIs422","Output":"--- PASS: TestOperator_ResolveTypeMismatchIs422 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0477151+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveTypeMismatchIs422","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0477151+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveValidResumes"} +{"Time":"2026-10-09T10:39:45.0477151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveValidResumes","Output":"=== RUN TestOperator_ResolveValidResumes\n"} +{"Time":"2026-10-09T10:39:45.0487549+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveValidResumes","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:386e02d2-3177-49a4-9ef9-da32e20d7c51] details:map[status:200] domain:service message:HTTP action completed requestId:386e02d2-3177-49a4-9ef9-da32e20d7c51 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0487549+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveValidResumes","Output":"--- PASS: TestOperator_ResolveValidResumes (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0487549+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_ResolveValidResumes","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0487549+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_LateResolveAfterSwitchAwayIs410"} +{"Time":"2026-10-09T10:39:45.0487549+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_LateResolveAfterSwitchAwayIs410","Output":"=== RUN TestOperator_LateResolveAfterSwitchAwayIs410\n"} +{"Time":"2026-10-09T10:39:45.0492928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_LateResolveAfterSwitchAwayIs410","Output":"2026/10/09 10:39:45 WARN no live await for this blueprint (inactive or invalidated) prism=\"map[code:AWAIT_GONE context:map[requestId:e1007648-6737-44b8-be98-594189299d7f] details:map[status:410] domain:service message:no live await for this blueprint (inactive or invalidated) requestId:e1007648-6737-44b8-be98-594189299d7f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0492928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_LateResolveAfterSwitchAwayIs410","Output":"--- PASS: TestOperator_LateResolveAfterSwitchAwayIs410 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0492928+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_LateResolveAfterSwitchAwayIs410","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0492928+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRuleSelectorFires"} +{"Time":"2026-10-09T10:39:45.0492928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRuleSelectorFires","Output":"=== RUN TestOperator_CallRuleSelectorFires\n"} +{"Time":"2026-10-09T10:39:45.0498082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRuleSelectorFires","Output":"2026/10/09 10:39:45 WARN blueprint is not part of the active scene prism=\"map[code:BLUEPRINT_NOT_ACTIVE context:map[requestId:87134a36-65c0-4bc1-bcb4-45d8f44fb42b] details:map[status:409] domain:service message:blueprint is not part of the active scene requestId:87134a36-65c0-4bc1-bcb4-45d8f44fb42b schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0498082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRuleSelectorFires","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:6fba4251-0821-4678-a758-14ae9de88ccb] details:map[status:202] domain:service message:HTTP action completed requestId:6fba4251-0821-4678-a758-14ae9de88ccb schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0498082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRuleSelectorFires","Output":"--- PASS: TestOperator_CallRuleSelectorFires (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0498082+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_CallRuleSelectorFires","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0498082+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400"} +{"Time":"2026-10-09T10:39:45.0498082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400","Output":"=== RUN TestOperator_RuleAndPreviewSelectorsConflictIs400\n"} +{"Time":"2026-10-09T10:39:45.0503345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400","Output":"2026/10/09 10:39:45 WARN ?rule and ?target=preview are mutually exclusive prism=\"map[code:SELECTOR_CONFLICT context:map[requestId:41461d69-ba30-471d-ae08-e685ea394ab4] details:map[status:400] domain:service message:?rule and ?target=preview are mutually exclusive requestId:41461d69-ba30-471d-ae08-e685ea394ab4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0503345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400","Output":"2026/10/09 10:39:45 WARN ?rule and ?target=preview are mutually exclusive prism=\"map[code:SELECTOR_CONFLICT context:map[requestId:29e0697f-7b10-4548-b7b9-0eb4d5200cf0] details:map[status:400] domain:service message:?rule and ?target=preview are mutually exclusive requestId:29e0697f-7b10-4548-b7b9-0eb4d5200cf0 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0503345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400","Output":"2026/10/09 10:39:45 WARN ?rule and ?target=preview are mutually exclusive prism=\"map[code:SELECTOR_CONFLICT context:map[requestId:96a4842e-64e3-44b6-9afe-a3ed8b2080ac] details:map[status:400] domain:service message:?rule and ?target=preview are mutually exclusive requestId:96a4842e-64e3-44b6-9afe-a3ed8b2080ac schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0503345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400","Output":"--- PASS: TestOperator_RuleAndPreviewSelectorsConflictIs400 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0509664+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_RuleAndPreviewSelectorsConflictIs400","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0509664+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive"} +{"Time":"2026-10-09T10:39:45.0509664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Output":"=== RUN TestOperator_DemotedRuleSelectorIs409RuleNotActive\n"} +{"Time":"2026-10-09T10:39:45.0509664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Output":"2026/10/09 10:39:45 WARN no promoted stream-level rule by that id prism=\"map[code:RULE_NOT_ACTIVE context:map[requestId:554877eb-28e2-4f31-aca7-3139e0086713] details:map[status:409] domain:service message:no promoted stream-level rule by that id requestId:554877eb-28e2-4f31-aca7-3139e0086713 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0509664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Output":"2026/10/09 10:39:45 WARN no promoted stream-level rule by that id prism=\"map[code:RULE_NOT_ACTIVE context:map[requestId:404628a9-0fee-468d-8dbb-be7585da6466] details:map[status:409] domain:service message:no promoted stream-level rule by that id requestId:404628a9-0fee-468d-8dbb-be7585da6466 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0509664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Output":"2026/10/09 10:39:45 WARN no promoted stream-level rule by that id prism=\"map[code:RULE_NOT_ACTIVE context:map[requestId:02c9a915-074d-4ad6-aec2-07b304b3628f] details:map[status:409] domain:service message:no promoted stream-level rule by that id requestId:02c9a915-074d-4ad6-aec2-07b304b3628f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Output":"2026/10/09 10:39:45 WARN no promoted stream-level rule by that id prism=\"map[code:RULE_NOT_ACTIVE context:map[requestId:57cb6d1e-4568-4892-90ba-2ead3056abe2] details:map[status:409] domain:service message:no promoted stream-level rule by that id requestId:57cb6d1e-4568-4892-90ba-2ead3056abe2 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Output":"--- PASS: TestOperator_DemotedRuleSelectorIs409RuleNotActive (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestOperator_DemotedRuleSelectorIs409RuleNotActive","Elapsed":0} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRuntimeDescriptorPublishesEmbeddedBlueRuntime"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRuntimeDescriptorPublishesEmbeddedBlueRuntime","Output":"=== RUN TestRuntimeDescriptorPublishesEmbeddedBlueRuntime\n"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRuntimeDescriptorPublishesEmbeddedBlueRuntime","Output":"--- PASS: TestRuntimeDescriptorPublishesEmbeddedBlueRuntime (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRuntimeDescriptorPublishesEmbeddedBlueRuntime","Elapsed":0} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLocalSceneIndexPreservesCanvasBlueManifest"} +{"Time":"2026-10-09T10:39:45.051496+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLocalSceneIndexPreservesCanvasBlueManifest","Output":"=== RUN TestLocalSceneIndexPreservesCanvasBlueManifest\n"} +{"Time":"2026-10-09T10:39:45.0598891+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLocalSceneIndexPreservesCanvasBlueManifest","Output":"--- PASS: TestLocalSceneIndexPreservesCanvasBlueManifest (0.01s)\n"} +{"Time":"2026-10-09T10:39:45.0598891+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLocalSceneIndexPreservesCanvasBlueManifest","Elapsed":0.01} +{"Time":"2026-10-09T10:39:45.0598891+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen"} +{"Time":"2026-10-09T10:39:45.0598891+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen","Output":"=== RUN TestSceneCatalogPreservesClosureAndReverifiesAfterReopen\n"} +{"Time":"2026-10-09T10:39:45.0630114+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e3a8511b-3780-4e47-a327-ce4ddc335e9b] details:map[status:200] domain:service message:HTTP action completed requestId:e3a8511b-3780-4e47-a327-ce4ddc335e9b schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0709947+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen","Output":"2026/10/09 10:39:45 WARN BLUE_MANIFEST_DIGEST_MISMATCH prism=\"map[code:CANVAS_ARTIFACT_DIGEST_MISMATCH context:map[requestId:2e585ffd-8fae-4227-9552-5e6d90956317] details:map[status:400] domain:service message:BLUE_MANIFEST_DIGEST_MISMATCH requestId:2e585ffd-8fae-4227-9552-5e6d90956317 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0709947+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen","Output":"2026/10/09 10:39:45 WARN attestation: expired or not yet valid prism=\"map[code:ATTESTATION_REJECTED context:map[requestId:2186a778-9dbb-48f6-9b4e-4d8db477c63c] details:map[status:403] domain:service message:attestation: expired or not yet valid requestId:2186a778-9dbb-48f6-9b4e-4d8db477c63c schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0725873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen","Output":"--- PASS: TestSceneCatalogPreservesClosureAndReverifiesAfterReopen (0.01s)\n"} +{"Time":"2026-10-09T10:39:45.0725873+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneCatalogPreservesClosureAndReverifiesAfterReopen","Elapsed":0.01} +{"Time":"2026-10-09T10:39:45.0725873+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneControlFileValidationAndDesiredOnlyPersistence"} +{"Time":"2026-10-09T10:39:45.0725873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneControlFileValidationAndDesiredOnlyPersistence","Output":"=== RUN TestSceneControlFileValidationAndDesiredOnlyPersistence\n"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneControlFileValidationAndDesiredOnlyPersistence","Output":"--- PASS: TestSceneControlFileValidationAndDesiredOnlyPersistence (0.02s)\n"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneControlFileValidationAndDesiredOnlyPersistence","Elapsed":0.02} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeSceneControlVisual"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeSceneControlVisual","Output":"=== RUN TestRealNativeSceneControlVisual\n"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeSceneControlVisual","Output":" scene_control_native_test.go:30: requires actual CEF scene-control observer\n"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeSceneControlVisual","Output":"--- SKIP: TestRealNativeSceneControlVisual (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestRealNativeSceneControlVisual","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor"} +{"Time":"2026-10-09T10:39:45.0894969+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor","Output":"=== RUN TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor\n"} +{"Time":"2026-10-09T10:39:45.0910049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c70737cf-70b0-4f8a-bb72-00e3c25cf64d] details:map[status:200] domain:service message:HTTP action completed requestId:c70737cf-70b0-4f8a-bb72-00e3c25cf64d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0910049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor","Output":"--- PASS: TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0910049+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0910049+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_ThreadsOnAirSlotIntoMirrorFor"} +{"Time":"2026-10-09T10:39:45.0910049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_ThreadsOnAirSlotIntoMirrorFor","Output":"=== RUN TestStartBridge_ThreadsOnAirSlotIntoMirrorFor\n"} +{"Time":"2026-10-09T10:39:45.0920472+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_ThreadsOnAirSlotIntoMirrorFor","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:3e64fe3f-13cd-4878-8429-5ab922942cd1] details:map[status:200] domain:service message:HTTP action completed requestId:3e64fe3f-13cd-4878-8429-5ab922942cd1 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0920472+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_ThreadsOnAirSlotIntoMirrorFor","Output":"--- PASS: TestStartBridge_ThreadsOnAirSlotIntoMirrorFor (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.0920472+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_ThreadsOnAirSlotIntoMirrorFor","Elapsed":0} +{"Time":"2026-10-09T10:39:45.0920472+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane"} +{"Time":"2026-10-09T10:39:45.0920472+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Output":"=== RUN TestSceneIntentLaneCommitSerializesReplayButNotOtherLane\n"} +{"Time":"2026-10-09T10:39:45.0929948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:f66767bf-7177-4f17-adcf-fcbd6a4a1b96] details:map[status:200] domain:service message:HTTP action completed requestId:f66767bf-7177-4f17-adcf-fcbd6a4a1b96 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.0935353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:8768499f-3bef-4f96-8741-5f92663ea571] details:map[status:408] domain:service message:Request failed requestId:8768499f-3bef-4f96-8741-5f92663ea571 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1138468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:3af27701-94d4-489a-9c5e-e4141a9e4226] details:map[status:200] domain:service message:HTTP action completed requestId:3af27701-94d4-489a-9c5e-e4141a9e4226 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1138468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:25b412d9-c33c-4d49-a35b-87319910ba0d] details:map[status:200] domain:service message:HTTP action completed requestId:25b412d9-c33c-4d49-a35b-87319910ba0d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1138468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Output":"--- PASS: TestSceneIntentLaneCommitSerializesReplayButNotOtherLane (0.02s)\n"} +{"Time":"2026-10-09T10:39:45.1138468+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentLaneCommitSerializesReplayButNotOtherLane","Elapsed":0.02} +{"Time":"2026-10-09T10:39:45.1138468+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestChatDrivenScene_InjectionOrderingIdempotenceProjection"} +{"Time":"2026-10-09T10:39:45.1138468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestChatDrivenScene_InjectionOrderingIdempotenceProjection","Output":"=== RUN TestChatDrivenScene_InjectionOrderingIdempotenceProjection\n"} +{"Time":"2026-10-09T10:39:45.1224438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestChatDrivenScene_InjectionOrderingIdempotenceProjection","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:aa6efbff-ecb2-4adf-bdd4-75d550f0251a] details:map[status:200] domain:service message:HTTP action completed requestId:aa6efbff-ecb2-4adf-bdd4-75d550f0251a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1229657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestChatDrivenScene_InjectionOrderingIdempotenceProjection","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:963e4e08-d01f-46c0-8a4a-b335b4268d84] details:map[status:200] domain:service message:HTTP action completed requestId:963e4e08-d01f-46c0-8a4a-b335b4268d84 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1229657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestChatDrivenScene_InjectionOrderingIdempotenceProjection","Output":"--- PASS: TestChatDrivenScene_InjectionOrderingIdempotenceProjection (0.01s)\n"} +{"Time":"2026-10-09T10:39:45.1229657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestChatDrivenScene_InjectionOrderingIdempotenceProjection","Elapsed":0.01} +{"Time":"2026-10-09T10:39:45.1229657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue"} +{"Time":"2026-10-09T10:39:45.1229657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue","Output":"=== RUN TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue\n"} +{"Time":"2026-10-09T10:39:45.1240189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:9588a511-ff12-440c-a9ab-ef72e5d7fe05] details:map[status:200] domain:service message:HTTP action completed requestId:9588a511-ff12-440c-a9ab-ef72e5d7fe05 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1240189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue","Output":"--- PASS: TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1240189+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1240189+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket"} +{"Time":"2026-10-09T10:39:45.1240189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket","Output":"=== RUN TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket\n"} +{"Time":"2026-10-09T10:39:45.1240189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c85998b0-757c-4dc0-b4a2-ab7faef66542] details:map[status:200] domain:service message:HTTP action completed requestId:c85998b0-757c-4dc0-b4a2-ab7faef66542 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1250289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket","Output":"--- PASS: TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1250289+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_UsesCachedCapsuleWithoutWorkloadTicket","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1250289+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts"} +{"Time":"2026-10-09T10:39:45.1250289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts","Output":"=== RUN TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts\n"} +{"Time":"2026-10-09T10:39:45.1340293+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:1c0b4597-f99f-4ffd-bb97-c856cf84878d] details:map[status:200] domain:service message:HTTP action completed requestId:1c0b4597-f99f-4ffd-bb97-c856cf84878d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.135607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts","Output":"2026/10/09 10:39:45 WARN read local Blue program: open C:\\Users\\Mathias\\AppData\\Local\\Temp\\TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts896809199\\001\\artifacts\\0ea4a3677108a79a55147a551eaadd1d23f71ff2a88f2300cb9ea1e0905dd042.bin: Le fichier spécifié est introuvable. prism=\"map[code:ACTION_REFUSED context:map[requestId:52f3553b-4c4a-45a8-986c-169e9a61c5b4] details:map[status:409] domain:service message:read local Blue program: open C:\\\\Users\\\\Mathias\\\\AppData\\\\Local\\\\Temp\\\\TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts896809199\\\\001\\\\artifacts\\\\0ea4a3677108a79a55147a551eaadd1d23f71ff2a88f2300cb9ea1e0905dd042.bin: Le fichier spécifié est introuvable. requestId:52f3553b-4c4a-45a8-986c-169e9a61c5b4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1371908+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:d2c6e15d-d35d-44fd-81d8-4e71f0c941db] details:map[status:200] domain:service message:HTTP action completed requestId:d2c6e15d-d35d-44fd-81d8-4e71f0c941db schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1387524+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts","Output":"--- PASS: TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts (0.01s)\n"} +{"Time":"2026-10-09T10:39:45.1387524+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostLocalAtomicSceneIntent_ReadsContentAddressedArtifacts","Elapsed":0.01} +{"Time":"2026-10-09T10:39:45.1387524+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLoadLocalSceneEnvelopeKeepsArtifactBytes"} +{"Time":"2026-10-09T10:39:45.1387524+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLoadLocalSceneEnvelopeKeepsArtifactBytes","Output":"=== RUN TestLoadLocalSceneEnvelopeKeepsArtifactBytes\n"} +{"Time":"2026-10-09T10:39:45.159999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLoadLocalSceneEnvelopeKeepsArtifactBytes","Output":"--- PASS: TestLoadLocalSceneEnvelopeKeepsArtifactBytes (0.02s)\n"} +{"Time":"2026-10-09T10:39:45.159999+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestLoadLocalSceneEnvelopeKeepsArtifactBytes","Elapsed":0.02} +{"Time":"2026-10-09T10:39:45.159999+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance"} +{"Time":"2026-10-09T10:39:45.159999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance","Output":"=== RUN TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance\n"} +{"Time":"2026-10-09T10:39:45.1605271+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:f7aaec63-ff18-46e2-9337-16c3c6b55723] details:map[status:200] domain:service message:HTTP action completed requestId:f7aaec63-ff18-46e2-9337-16c3c6b55723 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1605271+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:6368b5fd-e18d-4952-8cfd-5b2592f38fb4] details:map[status:404] domain:service message:Request failed requestId:6368b5fd-e18d-4952-8cfd-5b2592f38fb4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1605271+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance","Output":"--- PASS: TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1605271+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1605271+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance"} +{"Time":"2026-10-09T10:39:45.1605271+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance","Output":"=== RUN TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance\n"} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:867c1831-f250-4210-a0f6-e5845f7e7674] details:map[status:200] domain:service message:HTTP action completed requestId:867c1831-f250-4210-a0f6-e5845f7e7674 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7b4346d0-7e62-4012-97cc-c323efc2a472] details:map[status:200] domain:service message:HTTP action completed requestId:7b4346d0-7e62-4012-97cc-c323efc2a472 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:790b6d71-5334-407b-a459-0edf52fb1d21] details:map[status:404] domain:service message:Request failed requestId:790b6d71-5334-407b-a459-0edf52fb1d21 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance","Output":"--- PASS: TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram"} +{"Time":"2026-10-09T10:39:45.1615688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram","Output":"=== RUN TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram\n"} +{"Time":"2026-10-09T10:39:45.1620892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram","Output":"2026/10/09 10:39:45 ERROR Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:150d2741-9ed5-41ae-9f45-0a27e82b0c49] details:map[status:502] domain:service message:Request failed requestId:150d2741-9ed5-41ae-9f45-0a27e82b0c49 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1620892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram","Output":"--- PASS: TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1620892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1620892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion"} +{"Time":"2026-10-09T10:39:45.1620892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion","Output":"=== RUN TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion\n"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:414ee29a-7ac2-49a4-b179-ce0cdcfb9be8] details:map[status:200] domain:service message:HTTP action completed requestId:414ee29a-7ac2-49a4-b179-ce0cdcfb9be8 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:ed630222-e20d-4a3f-9409-0b1af43cc213] details:map[status:404] domain:service message:Request failed requestId:ed630222-e20d-4a3f-9409-0b1af43cc213 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:45fb7d29-22d4-4451-8323-186051208f83] details:map[status:404] domain:service message:Request failed requestId:45fb7d29-22d4-4451-8323-186051208f83 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion","Output":"--- PASS: TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry","Output":"=== RUN TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry\n"} +{"Time":"2026-10-09T10:39:45.1626174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2ceb6ebb-64ff-46ee-94f3-be16522deb43] details:map[status:200] domain:service message:HTTP action completed requestId:2ceb6ebb-64ff-46ee-94f3-be16522deb43 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1631316+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a2ffc398-e0d9-48dd-b9ba-f0c415698e86] details:map[status:200] domain:service message:HTTP action completed requestId:a2ffc398-e0d9-48dd-b9ba-f0c415698e86 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1631316+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:a0b2a162-83b8-4135-951e-8752854e06a1] details:map[status:404] domain:service message:Request failed requestId:a0b2a162-83b8-4135-951e-8752854e06a1 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1631316+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry","Output":"--- PASS: TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1631316+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1631316+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders"} +{"Time":"2026-10-09T10:39:45.1631316+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders","Output":"=== RUN TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders\n"} +{"Time":"2026-10-09T10:39:45.173666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders","Output":"2026/10/09 10:39:45 ERROR HOST_PREPARE_FAILED: CAPABILITY_UNAVAILABLE: required capability is unavailable prism=\"map[code:ACTION_REFUSED context:map[requestId:dd295f51-4b3a-4c32-b2d0-1955dd15eab3] details:map[status:500] domain:service message:HOST_PREPARE_FAILED: CAPABILITY_UNAVAILABLE: required capability is unavailable requestId:dd295f51-4b3a-4c32-b2d0-1955dd15eab3 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.173666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders","Output":"--- PASS: TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders (0.01s)\n"} +{"Time":"2026-10-09T10:39:45.173666+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_CapabilityUnavailableWithoutProviders","Elapsed":0.01} +{"Time":"2026-10-09T10:39:45.173666+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SucceedsWithProviders"} +{"Time":"2026-10-09T10:39:45.173666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SucceedsWithProviders","Output":"=== RUN TestPostSceneIntent_PreparePreview_SucceedsWithProviders\n"} +{"Time":"2026-10-09T10:39:45.1747118+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SucceedsWithProviders","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a14a7585-8301-477d-9461-f04b46ffca43] details:map[status:200] domain:service message:HTTP action completed requestId:a14a7585-8301-477d-9461-f04b46ffca43 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1747118+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SucceedsWithProviders","Output":"--- PASS: TestPostSceneIntent_PreparePreview_SucceedsWithProviders (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1747118+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SucceedsWithProviders","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1747118+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed"} +{"Time":"2026-10-09T10:39:45.1747118+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed","Output":"=== RUN TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed","Output":"2026/10/09 10:39:45 ERROR HOST_PREPARE_FAILED: CAPABILITY_NOT_ALLOWED: capability policy denied provider prism=\"map[code:ACTION_REFUSED context:map[requestId:833178d0-acb4-4986-bb50-1b3b7f3ada88] details:map[status:500] domain:service message:HOST_PREPARE_FAILED: CAPABILITY_NOT_ALLOWED: capability policy denied provider requestId:833178d0-acb4-4986-bb50-1b3b7f3ada88 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed","Output":"--- PASS: TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DeniedWhenHTTPEgressPolicyClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet","Output":"=== RUN TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_id"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_id","Output":"=== RUN TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_id\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_id","Output":"--- PASS: TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_id (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_id","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_version"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_version","Output":"=== RUN TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_version\n"} +{"Time":"2026-10-09T10:39:45.1763008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_version","Output":"--- PASS: TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_version (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/scene_version","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/revision_id"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/revision_id","Output":"=== RUN TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/revision_id\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/revision_id","Output":"--- PASS: TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/revision_id (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet/revision_id","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet","Output":"--- PASS: TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate","Output":"=== RUN TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate","Output":"--- PASS: TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule","Output":"=== RUN TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule","Output":"--- PASS: TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures","Output":"=== RUN TestVerifySceneArtifacts_RetainsAdmissionFailures\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unattested_program"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unattested_program","Output":"=== RUN TestVerifySceneArtifacts_RetainsAdmissionFailures/unattested_program\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unattested_program","Output":"--- PASS: TestVerifySceneArtifacts_RetainsAdmissionFailures/unattested_program (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unattested_program","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/missing_source_digest"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/missing_source_digest","Output":"=== RUN TestVerifySceneArtifacts_RetainsAdmissionFailures/missing_source_digest\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/missing_source_digest","Output":"--- PASS: TestVerifySceneArtifacts_RetainsAdmissionFailures/missing_source_digest (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/missing_source_digest","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/bad_source_digest"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/bad_source_digest","Output":"=== RUN TestVerifySceneArtifacts_RetainsAdmissionFailures/bad_source_digest\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/bad_source_digest","Output":"--- PASS: TestVerifySceneArtifacts_RetainsAdmissionFailures/bad_source_digest (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/bad_source_digest","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unsigned_render"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unsigned_render","Output":"=== RUN TestVerifySceneArtifacts_RetainsAdmissionFailures/unsigned_render\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unsigned_render","Output":"--- PASS: TestVerifySceneArtifacts_RetainsAdmissionFailures/unsigned_render (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures/unsigned_render","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures","Output":"--- PASS: TestVerifySceneArtifacts_RetainsAdmissionFailures (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestVerifySceneArtifacts_RetainsAdmissionFailures","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch","Output":"=== RUN TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch","Output":"--- PASS: TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults","Output":"=== RUN TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults","Output":"--- PASS: TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_StaticSceneSeedsInitialSnapshot"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_StaticSceneSeedsInitialSnapshot","Output":"=== RUN TestStartBridge_StaticSceneSeedsInitialSnapshot\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_StaticSceneSeedsInitialSnapshot","Output":"--- PASS: TestStartBridge_StaticSceneSeedsInitialSnapshot (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStartBridge_StaticSceneSeedsInitialSnapshot","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_TTLWindowExpiresAndIsCounted"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_TTLWindowExpiresAndIsCounted","Output":"=== RUN TestIdempotencyCache_TTLWindowExpiresAndIsCounted\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_TTLWindowExpiresAndIsCounted","Output":"--- PASS: TestIdempotencyCache_TTLWindowExpiresAndIsCounted (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_TTLWindowExpiresAndIsCounted","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted","Output":"=== RUN TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted","Output":"--- PASS: TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_Success"} +{"Time":"2026-10-09T10:39:45.1768296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_Success","Output":"=== RUN TestPostSceneIntent_PreparePreview_Success\n"} +{"Time":"2026-10-09T10:39:45.1776804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_Success","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:aae9e4ca-b3e0-48f7-906f-c42b0d0572f9] details:map[status:200] domain:service message:HTTP action completed requestId:aae9e4ca-b3e0-48f7-906f-c42b0d0572f9 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1776804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_Success","Output":"--- PASS: TestPostSceneIntent_PreparePreview_Success (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1776804+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_Success","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1776804+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent"} +{"Time":"2026-10-09T10:39:45.1776804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent","Output":"=== RUN TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent\n"} +{"Time":"2026-10-09T10:39:45.1787355+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2c03a662-91fc-480e-9f65-7c9dbbfbf3b2] details:map[status:200] domain:service message:HTTP action completed requestId:2c03a662-91fc-480e-9f65-7c9dbbfbf3b2 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1787355+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:02a82771-c2c5-4f64-9ce6-b668fa0829fe] details:map[status:200] domain:service message:HTTP action completed requestId:02a82771-c2c5-4f64-9ce6-b668fa0829fe schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1787355+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent","Output":"--- PASS: TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1787355+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1787355+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces"} +{"Time":"2026-10-09T10:39:45.1787355+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces","Output":"=== RUN TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces\n"} +{"Time":"2026-10-09T10:39:45.1797927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a1b7cfa7-dd45-40cc-b1b0-4a38564ec710] details:map[status:200] domain:service message:HTTP action completed requestId:a1b7cfa7-dd45-40cc-b1b0-4a38564ec710 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1797927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:eb2fbf10-46d9-457e-8de8-d85517a2322d] details:map[status:200] domain:service message:HTTP action completed requestId:eb2fbf10-46d9-457e-8de8-d85517a2322d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1803361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces","Output":"--- PASS: TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1803361+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1803361+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir"} +{"Time":"2026-10-09T10:39:45.1803361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir","Output":"=== RUN TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir\n"} +{"Time":"2026-10-09T10:39:45.1808708+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c5f29a28-955e-4fb4-b0fa-b520e77f2d19] details:map[status:200] domain:service message:HTTP action completed requestId:c5f29a28-955e-4fb4-b0fa-b520e77f2d19 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1819303+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:1c41414b-9c61-4ddd-861f-461d74affaf5] details:map[status:200] domain:service message:HTTP action completed requestId:1c41414b-9c61-4ddd-861f-461d74affaf5 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1819303+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir","Output":"--- PASS: TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1819303+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1819303+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration"} +{"Time":"2026-10-09T10:39:45.1819303+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration","Output":"=== RUN TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration\n"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration","Output":"2026/10/09 10:39:45 ERROR HOST_PREPARE_FAILED: PROGRAM_MALFORMED: /program has invalid fields prism=\"map[code:ACTION_REFUSED context:map[requestId:55cfe417-1cbf-41dd-8c9e-0fec88630c62] details:map[status:500] domain:service message:HOST_PREPARE_FAILED: PROGRAM_MALFORMED: /program has invalid fields requestId:55cfe417-1cbf-41dd-8c9e-0fec88630c62 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration","Output":"--- PASS: TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_TakeOnAirFailurePreservesCommittedGeneration","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsMissingTicket"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsMissingTicket","Output":"=== RUN TestPostSceneIntent_RejectsMissingTicket\n"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsMissingTicket","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:4dad7ce9-7294-44d1-a777-0266fa0fd898] details:map[status:401] domain:service message:Request failed requestId:4dad7ce9-7294-44d1-a777-0266fa0fd898 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsMissingTicket","Output":"--- PASS: TestPostSceneIntent_RejectsMissingTicket (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsMissingTicket","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsBadAttestation"} +{"Time":"2026-10-09T10:39:45.1824473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsBadAttestation","Output":"=== RUN TestPostSceneIntent_RejectsBadAttestation\n"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsBadAttestation","Output":"2026/10/09 10:39:45 WARN attestation: signature verification failed prism=\"map[code:ACTION_REFUSED context:map[requestId:98c2091c-3805-4e3f-baf1-88cfdd022534] details:map[status:403] domain:service message:attestation: signature verification failed requestId:98c2091c-3805-4e3f-baf1-88cfdd022534 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsBadAttestation","Output":"--- PASS: TestPostSceneIntent_RejectsBadAttestation (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsBadAttestation","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_WorkloadRefusalPropagates"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_WorkloadRefusalPropagates","Output":"=== RUN TestPostSceneIntent_WorkloadRefusalPropagates\n"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_WorkloadRefusalPropagates","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:75da5400-7d81-4433-b82b-b23f75914d27] details:map[status:403] domain:service message:Request failed requestId:75da5400-7d81-4433-b82b-b23f75914d27 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_WorkloadRefusalPropagates","Output":"--- PASS: TestPostSceneIntent_WorkloadRefusalPropagates (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_WorkloadRefusalPropagates","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim"} +{"Time":"2026-10-09T10:39:45.1829737+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim","Output":"=== RUN TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim\n"} +{"Time":"2026-10-09T10:39:45.1840451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:87e0b178-9a50-4660-930f-e7f760e18ef3] details:map[status:200] domain:service message:HTTP action completed requestId:87e0b178-9a50-4660-930f-e7f760e18ef3 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1840451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim","Output":"--- PASS: TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1840451+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1840451+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsArtifactDigestMismatch"} +{"Time":"2026-10-09T10:39:45.1840451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsArtifactDigestMismatch","Output":"=== RUN TestPostSceneIntent_RejectsArtifactDigestMismatch\n"} +{"Time":"2026-10-09T10:39:45.1851145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsArtifactDigestMismatch","Output":"2026/10/09 10:39:45 ERROR Request failed prism=\"map[code:ACTION_REFUSED context:map[requestId:54de6aec-7318-450a-aba1-d9e324e19f3b] details:map[status:502] domain:service message:Request failed requestId:54de6aec-7318-450a-aba1-d9e324e19f3b schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1851145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsArtifactDigestMismatch","Output":"--- PASS: TestPostSceneIntent_RejectsArtifactDigestMismatch (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1851145+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RejectsArtifactDigestMismatch","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1851145+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch"} +{"Time":"2026-10-09T10:39:45.1851145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch","Output":"=== RUN TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch\n"} +{"Time":"2026-10-09T10:39:45.1856503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c90aa94a-ec40-4b87-8ad0-2fd32da9f796] details:map[status:200] domain:service message:HTTP action completed requestId:c90aa94a-ec40-4b87-8ad0-2fd32da9f796 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.1856503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch","Output":"--- PASS: TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.1856503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch","Elapsed":0} +{"Time":"2026-10-09T10:39:45.1856503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_BridgeFullLifecycle"} +{"Time":"2026-10-09T10:39:45.1856503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_BridgeFullLifecycle","Output":"=== RUN TestPostSceneIntent_BridgeFullLifecycle\n"} +{"Time":"2026-10-09T10:39:45.1866934+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_BridgeFullLifecycle","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0bdf2d8f-835e-4088-824d-cf365b76e54a] details:map[status:200] domain:service message:HTTP action completed requestId:0bdf2d8f-835e-4088-824d-cf365b76e54a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2472274+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_BridgeFullLifecycle","Output":"--- PASS: TestPostSceneIntent_BridgeFullLifecycle (0.06s)\n"} +{"Time":"2026-10-09T10:39:45.2472274+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_BridgeFullLifecycle","Elapsed":0.06} +{"Time":"2026-10-09T10:39:45.2472274+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_IdempotentReplaySkipsReExecution"} +{"Time":"2026-10-09T10:39:45.2472274+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_IdempotentReplaySkipsReExecution","Output":"=== RUN TestPostSceneIntent_IdempotentReplaySkipsReExecution\n"} +{"Time":"2026-10-09T10:39:45.2483367+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_IdempotentReplaySkipsReExecution","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c2c0b450-4ddf-4b86-9348-6afb58655c07] details:map[status:200] domain:service message:HTTP action completed requestId:c2c0b450-4ddf-4b86-9348-6afb58655c07 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2483367+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_IdempotentReplaySkipsReExecution","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:003dd5dd-b066-4465-b040-34e6b3c97a34] details:map[status:200] domain:service message:HTTP action completed requestId:003dd5dd-b066-4465-b040-34e6b3c97a34 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2483367+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_IdempotentReplaySkipsReExecution","Output":"--- PASS: TestPostSceneIntent_IdempotentReplaySkipsReExecution (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2483367+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_IdempotentReplaySkipsReExecution","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2483367+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoIdempotencyKeyNeverDedupes"} +{"Time":"2026-10-09T10:39:45.2483367+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoIdempotencyKeyNeverDedupes","Output":"=== RUN TestPostSceneIntent_NoIdempotencyKeyNeverDedupes\n"} +{"Time":"2026-10-09T10:39:45.2494172+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoIdempotencyKeyNeverDedupes","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:9498b14d-4a8c-4b96-ab35-598d8856bc40] details:map[status:200] domain:service message:HTTP action completed requestId:9498b14d-4a8c-4b96-ab35-598d8856bc40 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoIdempotencyKeyNeverDedupes","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:142c4aef-00f4-4bdb-8364-4063dc69421f] details:map[status:200] domain:service message:HTTP action completed requestId:142c4aef-00f4-4bdb-8364-4063dc69421f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoIdempotencyKeyNeverDedupes","Output":"--- PASS: TestPostSceneIntent_NoIdempotencyKeyNeverDedupes (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_NoIdempotencyKeyNeverDedupes","Elapsed":0} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RequiresOperatorRole"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RequiresOperatorRole","Output":"=== RUN TestPostSceneIntent_RequiresOperatorRole\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RequiresOperatorRole","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:06bc2f18-b672-4182-8acc-2586b9e2e41f] details:map[status:403] domain:service message:operator role required requestId:06bc2f18-b672-4182-8acc-2586b9e2e41f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RequiresOperatorRole","Output":"--- PASS: TestPostSceneIntent_RequiresOperatorRole (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostSceneIntent_RequiresOperatorRole","Elapsed":0} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_EmptyHost"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_EmptyHost","Output":"=== RUN TestGetHostStatus_EmptyHost\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_EmptyHost","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2649b7ea-9a18-4f0b-9039-7ffaf4837a23] details:map[status:200] domain:service message:HTTP action completed requestId:2649b7ea-9a18-4f0b-9039-7ffaf4837a23 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_EmptyHost","Output":"--- PASS: TestGetHostStatus_EmptyHost (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_EmptyHost","Elapsed":0} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsPreparedSlot"} +{"Time":"2026-10-09T10:39:45.249931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsPreparedSlot","Output":"=== RUN TestGetHostStatus_ReflectsPreparedSlot\n"} +{"Time":"2026-10-09T10:39:45.2505151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsPreparedSlot","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ea32df1b-4f23-4b0c-a8a9-2f76046c2279] details:map[status:200] domain:service message:HTTP action completed requestId:ea32df1b-4f23-4b0c-a8a9-2f76046c2279 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2505151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsPreparedSlot","Output":"--- PASS: TestGetHostStatus_ReflectsPreparedSlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2505151+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsPreparedSlot","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2505151+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsLastForwardedProjection"} +{"Time":"2026-10-09T10:39:45.2505151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsLastForwardedProjection","Output":"=== RUN TestGetHostStatus_ReflectsLastForwardedProjection\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsLastForwardedProjection","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c97408c7-a47a-4c18-96a2-8d5efea8a115] details:map[status:200] domain:service message:HTTP action completed requestId:c97408c7-a47a-4c18-96a2-8d5efea8a115 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsLastForwardedProjection","Output":"--- PASS: TestGetHostStatus_ReflectsLastForwardedProjection (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_ReflectsLastForwardedProjection","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_NilBridgesOmitsProjection"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_NilBridgesOmitsProjection","Output":"=== RUN TestGetHostStatus_NilBridgesOmitsProjection\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_NilBridgesOmitsProjection","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ce2396fb-d44d-4b57-b16d-93bd0bf8f035] details:map[status:200] domain:service message:HTTP action completed requestId:ce2396fb-d44d-4b57-b16d-93bd0bf8f035 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_NilBridgesOmitsProjection","Output":"--- PASS: TestGetHostStatus_NilBridgesOmitsProjection (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_NilBridgesOmitsProjection","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_RequiresOperatorRole"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_RequiresOperatorRole","Output":"=== RUN TestGetHostStatus_RequiresOperatorRole\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_RequiresOperatorRole","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:13f98f72-6f51-4b60-90d5-8b323a33a7c4] details:map[status:403] domain:service message:operator role required requestId:13f98f72-6f51-4b60-90d5-8b323a33a7c4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_RequiresOperatorRole","Output":"--- PASS: TestGetHostStatus_RequiresOperatorRole (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostStatus_RequiresOperatorRole","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_ValidBundle"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_ValidBundle","Output":"=== RUN TestDecodeAndVerifyBundle_ValidBundle\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_ValidBundle","Output":"--- PASS: TestDecodeAndVerifyBundle_ValidBundle (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_ValidBundle","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_NoBundleIsNilNil"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_NoBundleIsNilNil","Output":"=== RUN TestDecodeAndVerifyBundle_NoBundleIsNilNil\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_NoBundleIsNilNil","Output":"--- PASS: TestDecodeAndVerifyBundle_NoBundleIsNilNil (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_NoBundleIsNilNil","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_DigestMismatchRejected"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_DigestMismatchRejected","Output":"=== RUN TestDecodeAndVerifyBundle_DigestMismatchRejected\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_DigestMismatchRejected","Output":"--- PASS: TestDecodeAndVerifyBundle_DigestMismatchRejected (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_DigestMismatchRejected","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_MissingDigestRejected"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_MissingDigestRejected","Output":"=== RUN TestDecodeAndVerifyBundle_MissingDigestRejected\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_MissingDigestRejected","Output":"--- PASS: TestDecodeAndVerifyBundle_MissingDigestRejected (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestDecodeAndVerifyBundle_MissingDigestRejected","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_ServesPreparedBundle"} +{"Time":"2026-10-09T10:39:45.2515657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_ServesPreparedBundle","Output":"=== RUN TestGetHostRenderBundle_ServesPreparedBundle\n"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_ServesPreparedBundle","Output":"--- PASS: TestGetHostRenderBundle_ServesPreparedBundle (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_ServesPreparedBundle","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_MissingSlotIs404"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_MissingSlotIs404","Output":"=== RUN TestGetHostRenderBundle_MissingSlotIs404\n"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_MissingSlotIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:RENDER_BUNDLE_NOT_FOUND context:map[requestId:d720eaba-acba-41aa-a2bd-9b030cba1ab6] details:map[status:404] domain:service message:Request failed requestId:d720eaba-acba-41aa-a2bd-9b030cba1ab6 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_MissingSlotIs404","Output":"--- PASS: TestGetHostRenderBundle_MissingSlotIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetHostRenderBundle_MissingSlotIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure","Output":"=== RUN TestSceneIntentCompensatesEachPreFinalizationFailure\n"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/prepare"} +{"Time":"2026-10-09T10:39:45.2521009+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/prepare","Output":"=== RUN TestSceneIntentCompensatesEachPreFinalizationFailure/prepare\n"} +{"Time":"2026-10-09T10:39:45.2531471+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/prepare","Output":"2026/10/09 10:39:45 ERROR SOLAR_PREPARATION_FAILED: invalid source prism=\"map[code:ACTION_REFUSED context:map[requestId:503f700f-0bb3-4e39-8a6d-771f8213fe70] details:map[status:503] domain:service message:SOLAR_PREPARATION_FAILED: invalid source requestId:503f700f-0bb3-4e39-8a6d-771f8213fe70 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2531471+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/prepare","Output":"--- PASS: TestSceneIntentCompensatesEachPreFinalizationFailure/prepare (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2531471+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/prepare","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2536699+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/commit"} +{"Time":"2026-10-09T10:39:45.2536699+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/commit","Output":"=== RUN TestSceneIntentCompensatesEachPreFinalizationFailure/commit\n"} +{"Time":"2026-10-09T10:39:45.2552377+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/commit","Output":"2026/10/09 10:39:45 ERROR SOLAR_COMMIT_FAILED: no renderer ACK prism=\"map[code:ACTION_REFUSED context:map[requestId:4d3eac36-6a35-4dc7-b719-053aa6352a3b] details:map[status:503] domain:service message:SOLAR_COMMIT_FAILED: no renderer ACK requestId:4d3eac36-6a35-4dc7-b719-053aa6352a3b schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2552377+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/commit","Output":"--- PASS: TestSceneIntentCompensatesEachPreFinalizationFailure/commit (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2552377+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/commit","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2552377+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/wire"} +{"Time":"2026-10-09T10:39:45.2552377+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/wire","Output":"=== RUN TestSceneIntentCompensatesEachPreFinalizationFailure/wire\n"} +{"Time":"2026-10-09T10:39:45.2557622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/wire","Output":"2026/10/09 10:39:45 ERROR NATIVE_LSDP_DELIVERY_FAILED: native timeout prism=\"map[code:ACTION_REFUSED context:map[requestId:7695f468-a0f4-4334-860a-868c552e8a64] details:map[status:503] domain:service message:NATIVE_LSDP_DELIVERY_FAILED: native timeout requestId:7695f468-a0f4-4334-860a-868c552e8a64 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2557622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/wire","Output":"--- PASS: TestSceneIntentCompensatesEachPreFinalizationFailure/wire (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2557622+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/wire","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2557622+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/finalize"} +{"Time":"2026-10-09T10:39:45.2557622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/finalize","Output":"=== RUN TestSceneIntentCompensatesEachPreFinalizationFailure/finalize\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/finalize","Output":"2026/10/09 10:39:45 ERROR SOLAR_FINALIZATION_FAILED: finalization failed prism=\"map[code:ACTION_REFUSED context:map[requestId:03bb7123-a593-4253-882a-f10a2197873d] details:map[status:503] domain:service message:SOLAR_FINALIZATION_FAILED: finalization failed requestId:03bb7123-a593-4253-882a-f10a2197873d schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/finalize","Output":"--- PASS: TestSceneIntentCompensatesEachPreFinalizationFailure/finalize (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure/finalize","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure","Output":"--- PASS: TestSceneIntentCompensatesEachPreFinalizationFailure (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSceneIntentCompensatesEachPreFinalizationFailure","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration","Output":"=== RUN TestGetRenderBundle_EditablePreviewExactGeneration\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:4a98a650-b917-4638-9fc2-0d257bb35971] details:map[status:404] domain:service message:Request failed requestId:4a98a650-b917-4638-9fc2-0d257bb35971 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:12a025a1-b11b-4718-9ef0-ddaf5d3f2026] details:map[status:404] domain:service message:Request failed requestId:12a025a1-b11b-4718-9ef0-ddaf5d3f2026 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:8e4656a4-6a78-43b8-82cd-a57186dac58e] details:map[status:404] domain:service message:Request failed requestId:8e4656a4-6a78-43b8-82cd-a57186dac58e schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration","Output":"--- PASS: TestGetRenderBundle_EditablePreviewExactGeneration (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_EditablePreviewExactGeneration","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_NoHostWiredIs404"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_NoHostWiredIs404","Output":"=== RUN TestGetRenderBundle_NoHostWiredIs404\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_NoHostWiredIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:d3474ec3-cf95-4da8-b35a-bb441c1ab14c] details:map[status:404] domain:service message:Request failed requestId:d3474ec3-cf95-4da8-b35a-bb441c1ab14c schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_NoHostWiredIs404","Output":"--- PASS: TestGetRenderBundle_NoHostWiredIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_NoHostWiredIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_MissingVersionIs404"} +{"Time":"2026-10-09T10:39:45.2568031+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_MissingVersionIs404","Output":"=== RUN TestGetRenderBundle_MissingVersionIs404\n"} +{"Time":"2026-10-09T10:39:45.2573257+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_MissingVersionIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:ff1ad34e-b843-4481-b1ac-bac300a4e37d] details:map[status:404] domain:service message:Request failed requestId:ff1ad34e-b843-4481-b1ac-bac300a4e37d schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2573257+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_MissingVersionIs404","Output":"--- PASS: TestGetRenderBundle_MissingVersionIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2573257+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_MissingVersionIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2573257+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_SceneIDMismatchIs404"} +{"Time":"2026-10-09T10:39:45.2573257+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_SceneIDMismatchIs404","Output":"=== RUN TestGetRenderBundle_SceneIDMismatchIs404\n"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_SceneIDMismatchIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:44732dbb-ab66-4c86-aa88-b1f38bec178b] details:map[status:404] domain:service message:Request failed requestId:44732dbb-ab66-4c86-aa88-b1f38bec178b schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_SceneIDMismatchIs404","Output":"--- PASS: TestGetRenderBundle_SceneIDMismatchIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_SceneIDMismatchIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneResolvesThroughThisRoute"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneResolvesThroughThisRoute","Output":"=== RUN TestGetRenderBundle_TakenSceneResolvesThroughThisRoute\n"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneResolvesThroughThisRoute","Output":"--- PASS: TestGetRenderBundle_TakenSceneResolvesThroughThisRoute (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneResolvesThroughThisRoute","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneWrongIDStillRejected"} +{"Time":"2026-10-09T10:39:45.2578522+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneWrongIDStillRejected","Output":"=== RUN TestGetRenderBundle_TakenSceneWrongIDStillRejected\n"} +{"Time":"2026-10-09T10:39:45.258374+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneWrongIDStillRejected","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:6d0d6e53-2342-43dd-bb70-1f707a719913] details:map[status:404] domain:service message:Request failed requestId:6d0d6e53-2342-43dd-bb70-1f707a719913 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.258374+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneWrongIDStillRejected","Output":"--- PASS: TestGetRenderBundle_TakenSceneWrongIDStillRejected (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.258374+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_TakenSceneWrongIDStillRejected","Elapsed":0} +{"Time":"2026-10-09T10:39:45.258374+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_PreviewSymmetryUnaffected"} +{"Time":"2026-10-09T10:39:45.258374+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_PreviewSymmetryUnaffected","Output":"=== RUN TestGetRenderBundle_PreviewSymmetryUnaffected\n"} +{"Time":"2026-10-09T10:39:45.2589004+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_PreviewSymmetryUnaffected","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:3634755c-9a3e-4bb9-9ba4-741705592885] details:map[status:404] domain:service message:Request failed requestId:3634755c-9a3e-4bb9-9ba4-741705592885 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2589004+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_PreviewSymmetryUnaffected","Output":"--- PASS: TestGetRenderBundle_PreviewSymmetryUnaffected (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2589004+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_PreviewSymmetryUnaffected","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2589004+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_VersionPinSelectsMatchingSlot"} +{"Time":"2026-10-09T10:39:45.2589004+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_VersionPinSelectsMatchingSlot","Output":"=== RUN TestGetRenderBundle_VersionPinSelectsMatchingSlot\n"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_VersionPinSelectsMatchingSlot","Output":"--- PASS: TestGetRenderBundle_VersionPinSelectsMatchingSlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_VersionPinSelectsMatchingSlot","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_UnknownVersionIs404"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_UnknownVersionIs404","Output":"=== RUN TestGetRenderBundle_UnknownVersionIs404\n"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_UnknownVersionIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:5bfc171a-8bfe-4d37-b8f3-1462e2ecde7f] details:map[status:404] domain:service message:Request failed requestId:5bfc171a-8bfe-4d37-b8f3-1462e2ecde7f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_UnknownVersionIs404","Output":"--- PASS: TestGetRenderBundle_UnknownVersionIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetRenderBundle_UnknownVersionIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_ExtractsKeyWhenPresent"} +{"Time":"2026-10-09T10:39:45.2594216+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_ExtractsKeyWhenPresent","Output":"=== RUN TestGetOperatorInputs_ExtractsKeyWhenPresent\n"} +{"Time":"2026-10-09T10:39:45.2599484+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_ExtractsKeyWhenPresent","Output":"--- PASS: TestGetOperatorInputs_ExtractsKeyWhenPresent (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2599484+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_ExtractsKeyWhenPresent","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2599484+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_AbsentKeyYieldsEmptyArray"} +{"Time":"2026-10-09T10:39:45.2599484+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_AbsentKeyYieldsEmptyArray","Output":"=== RUN TestGetOperatorInputs_AbsentKeyYieldsEmptyArray\n"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_AbsentKeyYieldsEmptyArray","Output":"--- PASS: TestGetOperatorInputs_AbsentKeyYieldsEmptyArray (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_AbsentKeyYieldsEmptyArray","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_SceneIDMismatchIs404"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_SceneIDMismatchIs404","Output":"=== RUN TestGetOperatorInputs_SceneIDMismatchIs404\n"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_SceneIDMismatchIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:PUSHED_VERSION_NOT_FOUND context:map[requestId:c03e4772-f406-4408-b5bf-0ed0b6d7709f] details:map[status:404] domain:service message:Request failed requestId:c03e4772-f406-4408-b5bf-0ed0b6d7709f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_SceneIDMismatchIs404","Output":"--- PASS: TestGetOperatorInputs_SceneIDMismatchIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestGetOperatorInputs_SceneIDMismatchIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_PreviewOnly_AntenneIs404"} +{"Time":"2026-10-09T10:39:45.2604582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_PreviewOnly_AntenneIs404","Output":"=== RUN TestExport_Seam_PreviewOnly_AntenneIs404\n"} +{"Time":"2026-10-09T10:39:45.2609839+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_PreviewOnly_AntenneIs404","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:NOT_FOUND context:map[requestId:c18ab7c0-b3f8-4970-91dd-9c5f7536269f] details:map[status:404] domain:service message:Request failed requestId:c18ab7c0-b3f8-4970-91dd-9c5f7536269f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2609839+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_PreviewOnly_AntenneIs404","Output":"--- PASS: TestExport_Seam_PreviewOnly_AntenneIs404 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2609839+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_PreviewOnly_AntenneIs404","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2609839+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Sidecar_ReturnsSnapshot"} +{"Time":"2026-10-09T10:39:45.2609839+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Sidecar_ReturnsSnapshot","Output":"=== RUN TestExport_Seam_Sidecar_ReturnsSnapshot\n"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Sidecar_ReturnsSnapshot","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e6a7f594-6c7f-4239-8f9e-fa682ef89238] details:map[status:200] domain:service message:HTTP action completed requestId:e6a7f594-6c7f-4239-8f9e-fa682ef89238 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Sidecar_ReturnsSnapshot","Output":"--- PASS: TestExport_Seam_Sidecar_ReturnsSnapshot (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Sidecar_ReturnsSnapshot","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_RequiresOperator"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_RequiresOperator","Output":"=== RUN TestExport_Seam_RequiresOperator\n"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_RequiresOperator","Output":"2026/10/09 10:39:45 WARN operator role required prism=\"map[code:PERMISSION_DENIED context:map[requestId:b68b022e-a97d-4687-9703-807867e7d71d] details:map[status:403] domain:service message:operator role required requestId:b68b022e-a97d-4687-9703-807867e7d71d schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_RequiresOperator","Output":"--- PASS: TestExport_Seam_RequiresOperator (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_RequiresOperator","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession"} +{"Time":"2026-10-09T10:39:45.2615093+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession","Output":"=== RUN TestExport_Seam_Session_ReadsIsolatedSession\n"} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:15a7b6ad-aeae-4ff8-a152-9d9652822cdd] details:map[status:200] domain:service message:HTTP action completed requestId:15a7b6ad-aeae-4ff8-a152-9d9652822cdd schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7e25196f-c639-4ed9-a29e-f953f43335ea] details:map[status:200] domain:service message:HTTP action completed requestId:7e25196f-c639-4ed9-a29e-f953f43335ea schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:TEST_SESSION_EXPIRED context:map[requestId:82b2adb9-de9c-4300-9b84-9bee65993123] details:map[status:410] domain:service message:Request failed requestId:82b2adb9-de9c-4300-9b84-9bee65993123 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession","Output":"--- PASS: TestExport_Seam_Session_ReadsIsolatedSession (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestExport_Seam_Session_ReadsIsolatedSession","Elapsed":0} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall"} +{"Time":"2026-10-09T10:39:45.264103+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"=== RUN TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall\n"} +{"Time":"2026-10-09T10:39:45.2657479+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7d01e528-69e0-4f87-b2be-89848e8421f2] details:map[status:200] domain:service message:HTTP action completed requestId:7d01e528-69e0-4f87-b2be-89848e8421f2 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2662658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c41850a7-0a5e-4d0b-8294-603e55f52b2c] details:map[status:200] domain:service message:HTTP action completed requestId:c41850a7-0a5e-4d0b-8294-603e55f52b2c schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2667968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a6c1e65b-8ceb-4b69-a219-8bd54a3a98fc] details:map[status:200] domain:service message:HTTP action completed requestId:a6c1e65b-8ceb-4b69-a219-8bd54a3a98fc schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2667968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ba9655fd-b8ba-4a1b-8e15-e99cec2cca84] details:map[status:200] domain:service message:HTTP action completed requestId:ba9655fd-b8ba-4a1b-8e15-e99cec2cca84 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2667968+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2b5339f0-2604-48ec-a6d8-268ae4a3c50d] details:map[status:200] domain:service message:HTTP action completed requestId:2b5339f0-2604-48ec-a6d8-268ae4a3c50d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.267319+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:4cfbc740-15d3-4005-87b8-7b9130ff529d] details:map[status:200] domain:service message:HTTP action completed requestId:4cfbc740-15d3-4005-87b8-7b9130ff529d schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.267319+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:25cf41e2-ed7d-4d3d-9fb4-d57eef722c77] details:map[status:200] domain:service message:HTTP action completed requestId:25cf41e2-ed7d-4d3d-9fb4-d57eef722c77 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.267319+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:7a163c7c-615d-41fa-a2d3-3f39dd91e00a] details:map[status:200] domain:service message:HTTP action completed requestId:7a163c7c-615d-41fa-a2d3-3f39dd91e00a schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.267319+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:b8c91d22-40bc-4ea2-8658-d59985cd42a8] details:map[status:202] domain:service message:HTTP action completed requestId:b8c91d22-40bc-4ea2-8658-d59985cd42a8 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.267319+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:53605dea-88b6-44a7-a85b-54b5a14f0c52] details:map[status:200] domain:service message:HTTP action completed requestId:53605dea-88b6-44a7-a85b-54b5a14f0c52 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.267319+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:bbc20f29-c7e8-42d3-8d58-cb58eaf69db3] details:map[status:200] domain:service message:HTTP action completed requestId:bbc20f29-c7e8-42d3-8d58-cb58eaf69db3 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Output":"--- PASS: TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_BlueLoadCockpitBothTargetsAndOperatorCall","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_RejectsSceneCarrierWithoutCallingBlue"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_RejectsSceneCarrierWithoutCallingBlue","Output":"=== RUN TestStreamRules_RejectsSceneCarrierWithoutCallingBlue\n"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_RejectsSceneCarrierWithoutCallingBlue","Output":"2026/10/09 10:39:45 WARN blueprint_id is required; stream rules are not scenes prism=\"map[code:SCENE_STREAM_RULE_UNSUPPORTED context:map[requestId:b186ee94-2677-436a-8b5c-c2827ba4701f] details:map[status:400] domain:service message:blueprint_id is required; stream rules are not scenes requestId:b186ee94-2677-436a-8b5c-c2827ba4701f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_RejectsSceneCarrierWithoutCallingBlue","Output":"--- PASS: TestStreamRules_RejectsSceneCarrierWithoutCallingBlue (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_RejectsSceneCarrierWithoutCallingBlue","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics"} +{"Time":"2026-10-09T10:39:45.2678325+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Output":"=== RUN TestStreamRules_PreservesBlueCompileDiagnostics\n"} +{"Time":"2026-10-09T10:39:45.268355+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:2b39c4cf-8e35-46c0-9b28-c90313a00317] details:map[status:200] domain:service message:HTTP action completed requestId:2b39c4cf-8e35-46c0-9b28-c90313a00317 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2688784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Output":"2026/10/09 10:39:45 WARN graph.nodes[3].config.foo is not supported prism=\"map[code:UNSUPPORTED_FIELD context:map[requestId:e60a0053-b2a1-4c5f-9b04-3e47f881203f] details:map[status:422] domain:service message:graph.nodes[3].config.foo is not supported requestId:e60a0053-b2a1-4c5f-9b04-3e47f881203f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2688784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Output":"2026/10/09 10:39:45 ERROR Blue returned HTTP 422: {\"code\":\"UNSUPPORTED_FIELD\",\"context\":{\"requestId\":\"e60a0053-b2a1-4c5f-9b04-3e47f881203f\"},\"detail\":\"graph.nodes[3].config.foo is not supported\",\"details\":{\"status\":422},\"domain\":\"service\",\"errors\":[{\"message\":\"remove the field before compiling\",\"path\":\"graph.nodes[3].config.foo\"}],\"legacy\":{\"code\":\"UNSUPPORTED_FIELD\",\"errors\":[{\"message\":\"remove the field before compiling\",\"path\":\"graph.nodes[3].config.foo\"}],\"message\":\"graph.nodes[3].config.foo is not supported\"},\"message\":\"graph.nodes[3].config.foo is not supported\",\"requestId\":\"e60a0053-b2a1-4c5f-9b04-3e47f881203f\",\"schemaVersion\":1,\"severity\":\"warning\",\"source\":\"orion.http\",\"status\":422,\"title\":\"Unprocessable Entity\",\"type\":\"https://cyell.pro/problems/UNSUPPORTED_FIELD\"} prism=\"map[code:BLUEPRINT_COMPILE_FAILED context:map[requestId:ab3e865f-3bf5-4a7d-ba70-cd2b84270cf6] details:map[status:502] domain:service message:Blue returned HTTP 422: {\\\"code\\\":\\\"UNSUPPORTED_FIELD\\\",\\\"context\\\":{\\\"requestId\\\":\\\"e60a0"} +{"Time":"2026-10-09T10:39:45.2688784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Output":"053-b2a1-4c5f-9b04-3e47f881203f\\\"},\\\"detail\\\":\\\"graph.nodes[3].config.foo is not supported\\\",\\\"details\\\":{\\\"status\\\":422},\\\"domain\\\":\\\"service\\\",\\\"errors\\\":[{\\\"message\\\":\\\"remove the field before compiling\\\",\\\"path\\\":\\\"graph.nodes[3].config.foo\\\"}],\\\"legacy\\\":{\\\"code\\\":\\\"UNSUPPORTED_FIELD\\\",\\\"errors\\\":[{\\\"message\\\":\\\"remove the field before compiling\\\",\\\"path\\\":\\\"graph.nodes[3].config.foo\\\"}],\\\"message\\\":\\\"graph.nodes[3].config.foo is not supported\\\"},\\\"message\\\":\\\"graph.nodes[3].config.foo is not supported\\\",\\\"requestId\\\":\\\"e60a0053-b2a1-4c5f-9b04-3e47f881203f\\\",\\\"schemaVersion\\\":1,\\\"severity\\\":\\\"warning\\\",\\\"source\\\":\\\"orion.http\\\",\\\"status\\\":422,\\\"title\\\":\\\"Unprocessable Entity\\\",\\\"type\\\":\\\"https://cyell.pro/problems/UNSUPPORTED_FIELD\\\"} requestId:ab3e865f-3bf5-4a7d-ba70-cd2b84270cf6 schemaVersion:1 severity:error source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2694145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Output":"--- PASS: TestStreamRules_PreservesBlueCompileDiagnostics (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2694145+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestStreamRules_PreservesBlueCompileDiagnostics","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2694145+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope"} +{"Time":"2026-10-09T10:39:45.2694145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:6553cba6-5c54-4f7a-a5d3-02d532767438] details:map[status:403] domain:service message:Request failed requestId:6553cba6-5c54-4f7a-a5d3-02d532767438 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/no_auth_headers","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:555082b8-742e-4b39-baaf-4d325c51097d] details:map[status:403] domain:service message:Request failed requestId:555082b8-742e-4b39-baaf-4d325c51097d schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/viewer_role,_exact_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:0fa4a271-0cae-4a5f-8973-91ab62086af5] details:map[status:403] domain:service message:Request failed requestId:0fa4a271-0cae-4a5f-8973-91ab62086af5 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wrong_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:1bf62392-5ea1-4643-892a-42db8f301d38] details:map[status:403] domain:service message:Request failed requestId:1bf62392-5ea1-4643-892a-42db8f301d38 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_parent_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:fdee184a-2bd1-478f-a274-1a321aa98f70] details:map[status:403] domain:service message:Request failed requestId:fdee184a-2bd1-478f-a274-1a321aa98f70 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_wildcard_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope","Output":"=== RUN TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:ea3549c6-e471-4567-94af-ad07d21696fc] details:map[status:403] domain:service message:Request failed requestId:ea3549c6-e471-4567-94af-ad07d21696fc schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope/service_role,_no_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope","Output":"--- PASS: TestPostValidateProgram_RequiresExactServiceScope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RequiresExactServiceScope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin"} +{"Time":"2026-10-09T10:39:45.2699298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin","Output":"=== RUN TestPostValidateProgram_AcceptsOperatorOrAdmin\n"} +{"Time":"2026-10-09T10:39:45.2704781+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/operator"} +{"Time":"2026-10-09T10:39:45.2704781+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/operator","Output":"=== RUN TestPostValidateProgram_AcceptsOperatorOrAdmin/operator\n"} +{"Time":"2026-10-09T10:39:45.2710078+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/operator","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:25d50192-42f2-4d8f-a0d9-6501a43ed7bb] details:map[status:200] domain:service message:HTTP action completed requestId:25d50192-42f2-4d8f-a0d9-6501a43ed7bb schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2710078+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/operator","Output":"--- PASS: TestPostValidateProgram_AcceptsOperatorOrAdmin/operator (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2710078+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/operator","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2710078+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/admin"} +{"Time":"2026-10-09T10:39:45.2710078+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/admin","Output":"=== RUN TestPostValidateProgram_AcceptsOperatorOrAdmin/admin\n"} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/admin","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c2b7645d-7a38-4798-ab29-eb0978ab32c2] details:map[status:200] domain:service message:HTTP action completed requestId:c2b7645d-7a38-4798-ab29-eb0978ab32c2 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/admin","Output":"--- PASS: TestPostValidateProgram_AcceptsOperatorOrAdmin/admin (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin/admin","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin","Output":"--- PASS: TestPostValidateProgram_AcceptsOperatorOrAdmin (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsOperatorOrAdmin","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsServableProgram"} +{"Time":"2026-10-09T10:39:45.2721234+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsServableProgram","Output":"=== RUN TestPostValidateProgram_AcceptsServableProgram\n"} +{"Time":"2026-10-09T10:39:45.2726454+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsServableProgram","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:34d6c505-619d-4aef-a548-365088468389] details:map[status:200] domain:service message:HTTP action completed requestId:34d6c505-619d-4aef-a548-365088468389 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2726454+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsServableProgram","Output":"--- PASS: TestPostValidateProgram_AcceptsServableProgram (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2726454+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsServableProgram","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2726454+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsByteExactBase64Program"} +{"Time":"2026-10-09T10:39:45.2726454+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsByteExactBase64Program","Output":"=== RUN TestPostValidateProgram_AcceptsByteExactBase64Program\n"} +{"Time":"2026-10-09T10:39:45.273704+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsByteExactBase64Program","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:a61acb45-b3c6-4240-82a9-044c37abb8f0] details:map[status:200] domain:service message:HTTP action completed requestId:a61acb45-b3c6-4240-82a9-044c37abb8f0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2742298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsByteExactBase64Program","Output":"--- PASS: TestPostValidateProgram_AcceptsByteExactBase64Program (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2742298+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_AcceptsByteExactBase64Program","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2742298+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RefusesUnknownCapability"} +{"Time":"2026-10-09T10:39:45.2742298+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RefusesUnknownCapability","Output":"=== RUN TestPostValidateProgram_RefusesUnknownCapability\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RefusesUnknownCapability","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:c0cb5f16-91a6-4e67-8c9e-6b0ae15f9b76] details:map[status:200] domain:service message:HTTP action completed requestId:c0cb5f16-91a6-4e67-8c9e-6b0ae15f9b76 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RefusesUnknownCapability","Output":"--- PASS: TestPostValidateProgram_RefusesUnknownCapability (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_RefusesUnknownCapability","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody","Output":"=== RUN TestPostValidateProgram_InvalidBody\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/malformed_JSON"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/malformed_JSON","Output":"=== RUN TestPostValidateProgram_InvalidBody/malformed_JSON\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/malformed_JSON","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:INVALID_BODY context:map[requestId:6b830a88-07c6-4e5d-975f-cf456b28dace] details:map[status:400] domain:service message:Request failed requestId:6b830a88-07c6-4e5d-975f-cf456b28dace schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/malformed_JSON","Output":"--- PASS: TestPostValidateProgram_InvalidBody/malformed_JSON (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/malformed_JSON","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/missing_program_field"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/missing_program_field","Output":"=== RUN TestPostValidateProgram_InvalidBody/missing_program_field\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/missing_program_field","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:INVALID_BODY context:map[requestId:a820ad7e-9eb1-4db7-b296-5a21ebc4e37c] details:map[status:400] domain:service message:Request failed requestId:a820ad7e-9eb1-4db7-b296-5a21ebc4e37c schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/missing_program_field","Output":"--- PASS: TestPostValidateProgram_InvalidBody/missing_program_field (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody/missing_program_field","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody","Output":"--- PASS: TestPostValidateProgram_InvalidBody (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_InvalidBody","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_BodyTooLarge"} +{"Time":"2026-10-09T10:39:45.2747438+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_BodyTooLarge","Output":"=== RUN TestPostValidateProgram_BodyTooLarge\n"} +{"Time":"2026-10-09T10:39:45.2763072+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_BodyTooLarge","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:BODY_TOO_LARGE context:map[requestId:d9364cd8-36a5-4a2f-84ed-5c03ca80ea93] details:map[status:413] domain:service message:Request failed requestId:d9364cd8-36a5-4a2f-84ed-5c03ca80ea93 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2763072+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_BodyTooLarge","Output":"--- PASS: TestPostValidateProgram_BodyTooLarge (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2763072+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestPostValidateProgram_BodyTooLarge","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2763072+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_ServiceExactScope_Passes"} +{"Time":"2026-10-09T10:39:45.2763072+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_ServiceExactScope_Passes","Output":"=== RUN TestSimulateGate_ServiceExactScope_Passes\n"} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_ServiceExactScope_Passes","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:e68fa00c-9e4f-4331-b12c-5866b2a0f165] details:map[status:200] domain:service message:HTTP action completed requestId:e68fa00c-9e4f-4331-b12c-5866b2a0f165 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_ServiceExactScope_Passes","Output":"--- PASS: TestSimulateGate_ServiceExactScope_Passes (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_ServiceExactScope_Passes","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects"} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects","Output":"=== RUN TestSimulateGate_Rejects\n"} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/parent_scope"} +{"Time":"2026-10-09T10:39:45.2768281+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/parent_scope","Output":"=== RUN TestSimulateGate_Rejects/parent_scope\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/parent_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:29d65bfb-6ff0-4151-8550-c6507ff6c1a2] details:map[status:403] domain:service message:Request failed requestId:29d65bfb-6ff0-4151-8550-c6507ff6c1a2 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/parent_scope","Output":"--- PASS: TestSimulateGate_Rejects/parent_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/parent_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/wildcard_scope"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/wildcard_scope","Output":"=== RUN TestSimulateGate_Rejects/wildcard_scope\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/wildcard_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:9694b162-9928-4091-b4ac-22a459e6f002] details:map[status:403] domain:service message:Request failed requestId:9694b162-9928-4091-b4ac-22a459e6f002 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/wildcard_scope","Output":"--- PASS: TestSimulateGate_Rejects/wildcard_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/wildcard_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/validate_wildcard"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/validate_wildcard","Output":"=== RUN TestSimulateGate_Rejects/validate_wildcard\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/validate_wildcard","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:3235f41b-d5a3-4082-ac85-bc7fd0cebcc2] details:map[status:403] domain:service message:Request failed requestId:3235f41b-d5a3-4082-ac85-bc7fd0cebcc2 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/validate_wildcard","Output":"--- PASS: TestSimulateGate_Rejects/validate_wildcard (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/validate_wildcard","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/superstring_scope"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/superstring_scope","Output":"=== RUN TestSimulateGate_Rejects/superstring_scope\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/superstring_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:42ec0f94-3f64-4a14-9d91-1422faff1f23] details:map[status:403] domain:service message:Request failed requestId:42ec0f94-3f64-4a14-9d91-1422faff1f23 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/superstring_scope","Output":"--- PASS: TestSimulateGate_Rejects/superstring_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/superstring_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/absent_scope"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/absent_scope","Output":"=== RUN TestSimulateGate_Rejects/absent_scope\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/absent_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:ab032ea5-2e36-4bc9-b4d9-5cc69e0a26e4] details:map[status:403] domain:service message:Request failed requestId:ab032ea5-2e36-4bc9-b4d9-5cc69e0a26e4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/absent_scope","Output":"--- PASS: TestSimulateGate_Rejects/absent_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/absent_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_scope_header"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_scope_header","Output":"=== RUN TestSimulateGate_Rejects/no_scope_header\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_scope_header","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:68fc7433-ee1d-4540-be16-4070fc6379e6] details:map[status:403] domain:service message:Request failed requestId:68fc7433-ee1d-4540-be16-4070fc6379e6 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_scope_header","Output":"--- PASS: TestSimulateGate_Rejects/no_scope_header (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_scope_header","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/operator_role_exact_scope"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/operator_role_exact_scope","Output":"=== RUN TestSimulateGate_Rejects/operator_role_exact_scope\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/operator_role_exact_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:78645fad-a26b-4ee5-aef2-3f4b4ae41a72] details:map[status:403] domain:service message:Request failed requestId:78645fad-a26b-4ee5-aef2-3f4b4ae41a72 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/operator_role_exact_scope","Output":"--- PASS: TestSimulateGate_Rejects/operator_role_exact_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/operator_role_exact_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/admin_role_exact_scope"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/admin_role_exact_scope","Output":"=== RUN TestSimulateGate_Rejects/admin_role_exact_scope\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/admin_role_exact_scope","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:f181a409-df8f-4d0e-9033-a837ebc63c9f] details:map[status:403] domain:service message:Request failed requestId:f181a409-df8f-4d0e-9033-a837ebc63c9f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/admin_role_exact_scope","Output":"--- PASS: TestSimulateGate_Rejects/admin_role_exact_scope (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/admin_role_exact_scope","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_identity_at_all"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_identity_at_all","Output":"=== RUN TestSimulateGate_Rejects/no_identity_at_all\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_identity_at_all","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:841d3716-f09f-4c3f-bc17-44c6f2f3feeb] details:map[status:403] domain:service message:Request failed requestId:841d3716-f09f-4c3f-bc17-44c6f2f3feeb schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_identity_at_all","Output":"--- PASS: TestSimulateGate_Rejects/no_identity_at_all (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects/no_identity_at_all","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects","Output":"--- PASS: TestSimulateGate_Rejects (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateGate_Rejects","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_ValidGraph_Returns200Report"} +{"Time":"2026-10-09T10:39:45.2773509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_ValidGraph_Returns200Report","Output":"=== RUN TestSimulate_ValidGraph_Returns200Report\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_ValidGraph_Returns200Report","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:0fc1a448-38aa-436a-9532-d1f3b284f3a4] details:map[status:200] domain:service message:HTTP action completed requestId:0fc1a448-38aa-436a-9532-d1f3b284f3a4 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_ValidGraph_Returns200Report","Output":"--- PASS: TestSimulate_ValidGraph_Returns200Report (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_ValidGraph_Returns200Report","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_CorruptGraph_Returns400"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_CorruptGraph_Returns400","Output":"=== RUN TestSimulate_CorruptGraph_Returns400\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_CorruptGraph_Returns400","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:INVALID_BODY context:map[requestId:aa7672af-3d5d-4f08-92d4-1e8ecd7e08e4] details:map[status:400] domain:service message:Request failed requestId:aa7672af-3d5d-4f08-92d4-1e8ecd7e08e4 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_CorruptGraph_Returns400","Output":"--- PASS: TestSimulate_CorruptGraph_Returns400 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_CorruptGraph_Returns400","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_GraphNotAGraph_Returns400InvalidGraph"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_GraphNotAGraph_Returns400InvalidGraph","Output":"=== RUN TestSimulate_GraphNotAGraph_Returns400InvalidGraph\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_GraphNotAGraph_Returns400InvalidGraph","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:INVALID_GRAPH context:map[requestId:dada1d6d-5bbc-4f60-bc91-968022553639] details:map[status:400] domain:service message:Request failed requestId:dada1d6d-5bbc-4f60-bc91-968022553639 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_GraphNotAGraph_Returns400InvalidGraph","Output":"--- PASS: TestSimulate_GraphNotAGraph_Returns400InvalidGraph (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_GraphNotAGraph_Returns400InvalidGraph","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_BodyOverBound_Returns413"} +{"Time":"2026-10-09T10:39:45.2778725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_BodyOverBound_Returns413","Output":"=== RUN TestSimulate_BodyOverBound_Returns413\n"} +{"Time":"2026-10-09T10:39:45.2783987+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_BodyOverBound_Returns413","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:BODY_TOO_LARGE context:map[requestId:71d3bf4e-7f25-407d-b781-78c1c155ae07] details:map[status:413] domain:service message:Request failed requestId:71d3bf4e-7f25-407d-b781-78c1c155ae07 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2783987+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_BodyOverBound_Returns413","Output":"--- PASS: TestSimulate_BodyOverBound_Returns413 (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2783987+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_BodyOverBound_Returns413","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2783987+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_DoesNotRideOperatorGate"} +{"Time":"2026-10-09T10:39:45.2783987+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_DoesNotRideOperatorGate","Output":"=== RUN TestSimulate_DoesNotRideOperatorGate\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_DoesNotRideOperatorGate","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:a0d005f0-64c5-436f-b3bf-7ae3bd5b9a10] details:map[status:403] domain:service message:Request failed requestId:a0d005f0-64c5-436f-b3bf-7ae3bd5b9a10 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_DoesNotRideOperatorGate","Output":"--- PASS: TestSimulate_DoesNotRideOperatorGate (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_DoesNotRideOperatorGate","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_RouteRegisteredDistinctFromShow"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_RouteRegisteredDistinctFromShow","Output":"=== RUN TestSimulate_RouteRegisteredDistinctFromShow\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_RouteRegisteredDistinctFromShow","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:FORBIDDEN context:map[requestId:d470ea40-5565-4653-94c3-0d72571c998d] details:map[status:403] domain:service message:Request failed requestId:d470ea40-5565-4653-94c3-0d72571c998d schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_RouteRegisteredDistinctFromShow","Output":"--- PASS: TestSimulate_RouteRegisteredDistinctFromShow (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulate_RouteRegisteredDistinctFromShow","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_BlueprintGraph_BlueprintsNonNull"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_BlueprintGraph_BlueprintsNonNull","Output":"=== RUN TestSimulateR7_BlueprintGraph_BlueprintsNonNull\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_BlueprintGraph_BlueprintsNonNull","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:22b7f338-8bc7-4f14-a615-cfc5f6829f2f] details:map[status:200] domain:service message:HTTP action completed requestId:22b7f338-8bc7-4f14-a615-cfc5f6829f2f schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_BlueprintGraph_BlueprintsNonNull","Output":"--- PASS: TestSimulateR7_BlueprintGraph_BlueprintsNonNull (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_BlueprintGraph_BlueprintsNonNull","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownDefinition_CompileFailed"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownDefinition_CompileFailed","Output":"=== RUN TestSimulateR7_UnknownDefinition_CompileFailed\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownDefinition_CompileFailed","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:COMPILE_FAILED context:map[requestId:084f9c93-e105-461e-8603-3eae25296da6] details:map[status:400] domain:service message:Request failed requestId:084f9c93-e105-461e-8603-3eae25296da6 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownDefinition_CompileFailed","Output":"--- PASS: TestSimulateR7_UnknownDefinition_CompileFailed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownDefinition_CompileFailed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_DanglingExecTarget_CompileFailed"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_DanglingExecTarget_CompileFailed","Output":"=== RUN TestSimulateR7_DanglingExecTarget_CompileFailed\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_DanglingExecTarget_CompileFailed","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:COMPILE_FAILED context:map[requestId:f3b11ad2-ced9-4caa-98a1-25607e7c6f1f] details:map[status:400] domain:service message:Request failed requestId:f3b11ad2-ced9-4caa-98a1-25607e7c6f1f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_DanglingExecTarget_CompileFailed","Output":"--- PASS: TestSimulateR7_DanglingExecTarget_CompileFailed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_DanglingExecTarget_CompileFailed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownUnwiredNode_CompileFailed"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownUnwiredNode_CompileFailed","Output":"=== RUN TestSimulateR7_UnknownUnwiredNode_CompileFailed\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownUnwiredNode_CompileFailed","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:COMPILE_FAILED context:map[requestId:937c4679-de31-4df3-b85e-89c11a8e7b35] details:map[status:400] domain:service message:Request failed requestId:937c4679-de31-4df3-b85e-89c11a8e7b35 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownUnwiredNode_CompileFailed","Output":"--- PASS: TestSimulateR7_UnknownUnwiredNode_CompileFailed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_UnknownUnwiredNode_CompileFailed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_NoExecProgram_CompileFailed"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_NoExecProgram_CompileFailed","Output":"=== RUN TestSimulateR7_NoExecProgram_CompileFailed\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_NoExecProgram_CompileFailed","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:COMPILE_FAILED context:map[requestId:26427c5f-6cd4-43a8-ba71-1f67d900c19f] details:map[status:400] domain:service message:Request failed requestId:26427c5f-6cd4-43a8-ba71-1f67d900c19f schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_NoExecProgram_CompileFailed","Output":"--- PASS: TestSimulateR7_NoExecProgram_CompileFailed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_NoExecProgram_CompileFailed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_ReferenceNode_CompileFailed"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_ReferenceNode_CompileFailed","Output":"=== RUN TestSimulateR7_ReferenceNode_CompileFailed\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_ReferenceNode_CompileFailed","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:COMPILE_FAILED context:map[requestId:a1ea98ed-a668-4847-924f-1521bfd58d17] details:map[status:400] domain:service message:Request failed requestId:a1ea98ed-a668-4847-924f-1521bfd58d17 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_ReferenceNode_CompileFailed","Output":"--- PASS: TestSimulateR7_ReferenceNode_CompileFailed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_ReferenceNode_CompileFailed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed"} +{"Time":"2026-10-09T10:39:45.2789368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed","Output":"=== RUN TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed\n"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed","Output":"2026/10/09 10:39:45 WARN Request failed prism=\"map[code:INVALID_GRAPH context:map[requestId:b39ecd51-d800-4652-a2fd-a313e474bb87] details:map[status:400] domain:service message:Request failed requestId:b39ecd51-d800-4652-a2fd-a313e474bb87 schemaVersion:1 severity:warning source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed","Output":"--- PASS: TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_EmptyNodes_InvalidGraphNotCompileFailed","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_Isolation_HTTPRequestNoEgress"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_Isolation_HTTPRequestNoEgress","Output":"=== RUN TestSimulateR7_Isolation_HTTPRequestNoEgress\n"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_Isolation_HTTPRequestNoEgress","Output":"2026/10/09 10:39:45 INFO HTTP action completed prism=\"map[code:ACTION_SUCCEEDED context:map[requestId:ec275dd6-c26f-4277-a969-494280c3cab0] details:map[status:200] domain:service message:HTTP action completed requestId:ec275dd6-c26f-4277-a969-494280c3cab0 schemaVersion:1 severity:info source:orion.http]\"\n"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_Isolation_HTTPRequestNoEgress","Output":"--- PASS: TestSimulateR7_Isolation_HTTPRequestNoEgress (0.00s)\n"} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Test":"TestSimulateR7_Isolation_HTTPRequestNoEgress","Elapsed":0} +{"Time":"2026-10-09T10:39:45.2799151+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:45.2855916+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/api","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/api\t2.343s\n"} +{"Time":"2026-10-09T10:39:45.3495438+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/api","Elapsed":2.407} +{"Time":"2026-10-09T10:39:45.8891709+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/attestation"} +{"Time":"2026-10-09T10:39:46.2725463+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_Valid"} +{"Time":"2026-10-09T10:39:46.2725463+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_Valid","Output":"=== RUN TestVerify_Valid\n"} +{"Time":"2026-10-09T10:39:46.2746501+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_Valid","Output":"--- PASS: TestVerify_Valid (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2746501+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_Valid","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2746501+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsTamperedPayload"} +{"Time":"2026-10-09T10:39:46.2746501+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsTamperedPayload","Output":"=== RUN TestVerify_RejectsTamperedPayload\n"} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsTamperedPayload","Output":"--- PASS: TestVerify_RejectsTamperedPayload (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsTamperedPayload","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_UnknownKid"} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_UnknownKid","Output":"=== RUN TestVerify_UnknownKid\n"} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_UnknownKid","Output":"--- PASS: TestVerify_UnknownKid (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_UnknownKid","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPayloadKidMismatch"} +{"Time":"2026-10-09T10:39:46.2751837+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPayloadKidMismatch","Output":"=== RUN TestVerify_RejectsPayloadKidMismatch\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPayloadKidMismatch","Output":"--- PASS: TestVerify_RejectsPayloadKidMismatch (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPayloadKidMismatch","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsAlgNone"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsAlgNone","Output":"=== RUN TestVerify_RejectsAlgNone\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsAlgNone","Output":"--- PASS: TestVerify_RejectsAlgNone (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsAlgNone","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsCrit"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsCrit","Output":"=== RUN TestVerify_RejectsCrit\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsCrit","Output":"--- PASS: TestVerify_RejectsCrit (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsCrit","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsUnknownHeaderParam"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsUnknownHeaderParam","Output":"=== RUN TestVerify_RejectsUnknownHeaderParam\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsUnknownHeaderParam","Output":"--- PASS: TestVerify_RejectsUnknownHeaderParam (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsUnknownHeaderParam","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpired"} +{"Time":"2026-10-09T10:39:46.2757308+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpired","Output":"=== RUN TestVerify_RejectsExpired\n"} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpired","Output":"--- PASS: TestVerify_RejectsExpired (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpired","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpiredReadiness"} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpiredReadiness","Output":"=== RUN TestVerify_RejectsExpiredReadiness\n"} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpiredReadiness","Output":"--- PASS: TestVerify_RejectsExpiredReadiness (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsExpiredReadiness","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsBoundedNotBeforeClockSkew"} +{"Time":"2026-10-09T10:39:46.2762599+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsBoundedNotBeforeClockSkew","Output":"=== RUN TestVerify_AcceptsBoundedNotBeforeClockSkew\n"} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsBoundedNotBeforeClockSkew","Output":"--- PASS: TestVerify_AcceptsBoundedNotBeforeClockSkew (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsBoundedNotBeforeClockSkew","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsNotBeforeBeyondClockSkew"} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsNotBeforeBeyondClockSkew","Output":"=== RUN TestVerify_RejectsNotBeforeBeyondClockSkew\n"} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsNotBeforeBeyondClockSkew","Output":"--- PASS: TestVerify_RejectsNotBeforeBeyondClockSkew (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsNotBeforeBeyondClockSkew","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsWrongAudience"} +{"Time":"2026-10-09T10:39:46.2768006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsWrongAudience","Output":"=== RUN TestVerify_RejectsWrongAudience\n"} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsWrongAudience","Output":"--- PASS: TestVerify_RejectsWrongAudience (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsWrongAudience","Elapsed":0} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsActionNotAllowed"} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsActionNotAllowed","Output":"=== RUN TestVerify_RejectsActionNotAllowed\n"} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsActionNotAllowed","Output":"--- PASS: TestVerify_RejectsActionNotAllowed (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsActionNotAllowed","Elapsed":0} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPrincipalMismatch"} +{"Time":"2026-10-09T10:39:46.277379+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPrincipalMismatch","Output":"=== RUN TestVerify_RejectsPrincipalMismatch\n"} +{"Time":"2026-10-09T10:39:46.2779146+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPrincipalMismatch","Output":"--- PASS: TestVerify_RejectsPrincipalMismatch (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2779146+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsPrincipalMismatch","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2779146+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorTraversal"} +{"Time":"2026-10-09T10:39:46.2779146+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorTraversal","Output":"=== RUN TestVerify_RejectsLocatorTraversal\n"} +{"Time":"2026-10-09T10:39:46.2779146+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorTraversal","Output":"--- PASS: TestVerify_RejectsLocatorTraversal (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2779146+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorTraversal","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorAbsoluteURL"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorAbsoluteURL","Output":"=== RUN TestVerify_RejectsLocatorAbsoluteURL\n"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorAbsoluteURL","Output":"--- PASS: TestVerify_RejectsLocatorAbsoluteURL (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsLocatorAbsoluteURL","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_AcceptsCanonicalCanvasAPIPath"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_AcceptsCanonicalCanvasAPIPath","Output":"=== RUN TestValidateLocator_AcceptsCanonicalCanvasAPIPath\n"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_AcceptsCanonicalCanvasAPIPath","Output":"--- PASS: TestValidateLocator_AcceptsCanonicalCanvasAPIPath (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_AcceptsCanonicalCanvasAPIPath","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_RejectsCanonicalPathWithWrongPrefix"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_RejectsCanonicalPathWithWrongPrefix","Output":"=== RUN TestValidateLocator_RejectsCanonicalPathWithWrongPrefix\n"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_RejectsCanonicalPathWithWrongPrefix","Output":"--- PASS: TestValidateLocator_RejectsCanonicalPathWithWrongPrefix (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestValidateLocator_RejectsCanonicalPathWithWrongPrefix","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsDuplicateKeyRaw"} +{"Time":"2026-10-09T10:39:46.2784361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsDuplicateKeyRaw","Output":"=== RUN TestVerify_RejectsDuplicateKeyRaw\n"} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsDuplicateKeyRaw","Output":"--- PASS: TestVerify_RejectsDuplicateKeyRaw (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsDuplicateKeyRaw","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsEmptyBlueProgramDigest"} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsEmptyBlueProgramDigest","Output":"=== RUN TestVerify_AcceptsEmptyBlueProgramDigest\n"} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsEmptyBlueProgramDigest","Output":"--- PASS: TestVerify_AcceptsEmptyBlueProgramDigest (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_AcceptsEmptyBlueProgramDigest","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsMalformedBlueProgramDigest"} +{"Time":"2026-10-09T10:39:46.2789622+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsMalformedBlueProgramDigest","Output":"=== RUN TestVerify_RejectsMalformedBlueProgramDigest\n"} +{"Time":"2026-10-09T10:39:46.2795148+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsMalformedBlueProgramDigest","Output":"--- PASS: TestVerify_RejectsMalformedBlueProgramDigest (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2795148+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_RejectsMalformedBlueProgramDigest","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2795148+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_StillRequiresSceneAndArtifactDigests"} +{"Time":"2026-10-09T10:39:46.2795148+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_StillRequiresSceneAndArtifactDigests","Output":"=== RUN TestVerify_StillRequiresSceneAndArtifactDigests\n"} +{"Time":"2026-10-09T10:39:46.2800591+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_StillRequiresSceneAndArtifactDigests","Output":"--- PASS: TestVerify_StillRequiresSceneAndArtifactDigests (0.00s)\n"} +{"Time":"2026-10-09T10:39:46.2800591+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Test":"TestVerify_StillRequiresSceneAndArtifactDigests","Elapsed":0} +{"Time":"2026-10-09T10:39:46.2800591+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:46.2839536+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/attestation\t0.394s\n"} +{"Time":"2026-10-09T10:39:46.2952173+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/attestation","Elapsed":0.406} +{"Time":"2026-10-09T10:39:47.8126812+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/auth"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders","Output":"=== RUN TestHeaderAuthSource_ParityWithFromHeaders\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/empty"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/empty","Output":"=== RUN TestHeaderAuthSource_ParityWithFromHeaders/empty\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/empty","Output":"--- PASS: TestHeaderAuthSource_ParityWithFromHeaders/empty (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/empty","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/operator"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/operator","Output":"=== RUN TestHeaderAuthSource_ParityWithFromHeaders/operator\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/operator","Output":"--- PASS: TestHeaderAuthSource_ParityWithFromHeaders/operator (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/operator","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/admin-mixed-case-role"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/admin-mixed-case-role","Output":"=== RUN TestHeaderAuthSource_ParityWithFromHeaders/admin-mixed-case-role\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/admin-mixed-case-role","Output":"--- PASS: TestHeaderAuthSource_ParityWithFromHeaders/admin-mixed-case-role (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/admin-mixed-case-role","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/service-with-paths"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/service-with-paths","Output":"=== RUN TestHeaderAuthSource_ParityWithFromHeaders/service-with-paths\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/service-with-paths","Output":"--- PASS: TestHeaderAuthSource_ParityWithFromHeaders/service-with-paths (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/service-with-paths","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/viewer"} +{"Time":"2026-10-09T10:39:49.0921847+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/viewer","Output":"=== RUN TestHeaderAuthSource_ParityWithFromHeaders/viewer\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/viewer","Output":"--- PASS: TestHeaderAuthSource_ParityWithFromHeaders/viewer (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders/viewer","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders","Output":"--- PASS: TestHeaderAuthSource_ParityWithFromHeaders (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestHeaderAuthSource_ParityWithFromHeaders","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_PlatformScope_KickAndYoutube"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_PlatformScope_KickAndYoutube","Output":"=== RUN TestMatchPath_PlatformScope_KickAndYoutube\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_PlatformScope_KickAndYoutube","Output":"--- PASS: TestMatchPath_PlatformScope_KickAndYoutube (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_PlatformScope_KickAndYoutube","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_AnonymousWhenMissing"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_AnonymousWhenMissing","Output":"=== RUN TestFromHeaders_AnonymousWhenMissing\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_AnonymousWhenMissing","Output":"--- PASS: TestFromHeaders_AnonymousWhenMissing (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_AnonymousWhenMissing","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_OperatorTrust"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_OperatorTrust","Output":"=== RUN TestFromHeaders_OperatorTrust\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_OperatorTrust","Output":"--- PASS: TestFromHeaders_OperatorTrust (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_OperatorTrust","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ServicePathScope"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ServicePathScope","Output":"=== RUN TestFromHeaders_ServicePathScope\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ServicePathScope","Output":"--- PASS: TestFromHeaders_ServicePathScope (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ServicePathScope","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ViewerNeverWrites"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ViewerNeverWrites","Output":"=== RUN TestFromHeaders_ViewerNeverWrites\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ViewerNeverWrites","Output":"--- PASS: TestFromHeaders_ViewerNeverWrites (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFromHeaders_ViewerNeverWrites","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_ExactAndPrefix"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_ExactAndPrefix","Output":"=== RUN TestMatchPath_ExactAndPrefix\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_ExactAndPrefix","Output":"--- PASS: TestMatchPath_ExactAndPrefix (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_ExactAndPrefix","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsOperatorOnValidHandshake"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsOperatorOnValidHandshake","Output":"=== RUN TestLocalOperatorAuth_GrantsOperatorOnValidHandshake\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsOperatorOnValidHandshake","Output":"--- PASS: TestLocalOperatorAuth_GrantsOperatorOnValidHandshake (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsOperatorOnValidHandshake","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsScopedServiceForQuasarWriter"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsScopedServiceForQuasarWriter","Output":"=== RUN TestLocalOperatorAuth_GrantsScopedServiceForQuasarWriter\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsScopedServiceForQuasarWriter","Output":"--- PASS: TestLocalOperatorAuth_GrantsScopedServiceForQuasarWriter (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_GrantsScopedServiceForQuasarWriter","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake","Output":"=== RUN TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/absent"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/absent","Output":"=== RUN TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/absent\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/absent","Output":"--- PASS: TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/absent (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/absent","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/empty"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/empty","Output":"=== RUN TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/empty\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/empty","Output":"--- PASS: TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/empty (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/empty","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/wrong"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/wrong","Output":"=== RUN TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/wrong\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/wrong","Output":"--- PASS: TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/wrong (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/wrong","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/prefix-of-real"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/prefix-of-real","Output":"=== RUN TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/prefix-of-real\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/prefix-of-real","Output":"--- PASS: TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/prefix-of-real (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake/prefix-of-real","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake","Output":"--- PASS: TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_RefusesWrongOrAbsentHandshake","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_DoesNotTrustZabGateHeaders"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_DoesNotTrustZabGateHeaders","Output":"=== RUN TestLocalOperatorAuth_DoesNotTrustZabGateHeaders\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_DoesNotTrustZabGateHeaders","Output":"--- PASS: TestLocalOperatorAuth_DoesNotTrustZabGateHeaders (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLocalOperatorAuth_DoesNotTrustZabGateHeaders","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestNewLocalOperatorAuth_RefusesEmptySecret"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestNewLocalOperatorAuth_RefusesEmptySecret","Output":"=== RUN TestNewLocalOperatorAuth_RefusesEmptySecret\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestNewLocalOperatorAuth_RefusesEmptySecret","Output":"--- PASS: TestNewLocalOperatorAuth_RefusesEmptySecret (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestNewLocalOperatorAuth_RefusesEmptySecret","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly","Output":"=== RUN TestLoopbackOnly\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback","Output":"=== RUN TestLoopbackOnly/ipv4-loopback\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback","Output":"--- PASS: TestLoopbackOnly/ipv4-loopback (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback-range"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback-range","Output":"=== RUN TestLoopbackOnly/ipv4-loopback-range\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback-range","Output":"--- PASS: TestLoopbackOnly/ipv4-loopback-range (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv4-loopback-range","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0927201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv6-loopback"} +{"Time":"2026-10-09T10:39:49.0932517+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv6-loopback","Output":"=== RUN TestLoopbackOnly/ipv6-loopback\n"} +{"Time":"2026-10-09T10:39:49.0932517+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv6-loopback","Output":"--- PASS: TestLoopbackOnly/ipv6-loopback (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.0932517+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/ipv6-loopback","Elapsed":0} +{"Time":"2026-10-09T10:39:49.0932517+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/routable-v4"} +{"Time":"2026-10-09T10:39:49.0932517+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/routable-v4","Output":"=== RUN TestLoopbackOnly/routable-v4\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/routable-v4","Output":"2026/10/09 10:39:49 WARN embedded-local: non-loopback request refused prism=\"map[code:PERMISSION_DENIED context:map[requestId:940ffb0b-96a7-4342-8fc1-5a82a1ed9b9f] details:map[] domain:service message:embedded-local: non-loopback request refused requestId:940ffb0b-96a7-4342-8fc1-5a82a1ed9b9f schemaVersion:1 severity:warning source:orion.local-auth]\"\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/routable-v4","Output":"--- PASS: TestLoopbackOnly/routable-v4 (0.05s)\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/routable-v4","Elapsed":0.05} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/lan-v4"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/lan-v4","Output":"=== RUN TestLoopbackOnly/lan-v4\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/lan-v4","Output":"2026/10/09 10:39:49 WARN embedded-local: non-loopback request refused prism=\"map[code:PERMISSION_DENIED context:map[requestId:841b81f9-b4b9-4836-8e6c-67a47adf8dd4] details:map[] domain:service message:embedded-local: non-loopback request refused requestId:841b81f9-b4b9-4836-8e6c-67a47adf8dd4 schemaVersion:1 severity:warning source:orion.local-auth]\"\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/lan-v4","Output":"--- PASS: TestLoopbackOnly/lan-v4 (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/lan-v4","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/unparseable"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/unparseable","Output":"=== RUN TestLoopbackOnly/unparseable\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/unparseable","Output":"2026/10/09 10:39:49 WARN embedded-local: non-loopback request refused prism=\"map[code:PERMISSION_DENIED context:map[requestId:f7fa6516-c7c3-438c-9219-6bc4a87edb7f] details:map[] domain:service message:embedded-local: non-loopback request refused requestId:f7fa6516-c7c3-438c-9219-6bc4a87edb7f schemaVersion:1 severity:warning source:orion.local-auth]\"\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/unparseable","Output":"--- PASS: TestLoopbackOnly/unparseable (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly/unparseable","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly","Output":"--- PASS: TestLoopbackOnly (0.05s)\n"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestLoopbackOnly","Elapsed":0.05} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFileServiceTokenStoreRoundTrip"} +{"Time":"2026-10-09T10:39:49.1462727+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFileServiceTokenStoreRoundTrip","Output":"=== RUN TestFileServiceTokenStoreRoundTrip\n"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFileServiceTokenStoreRoundTrip","Output":"--- PASS: TestFileServiceTokenStoreRoundTrip (0.01s)\n"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestFileServiceTokenStoreRoundTrip","Elapsed":0.01} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ExactAndSuperstring"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ExactAndSuperstring","Output":"=== RUN TestMatchPath_AnimScope_ExactAndSuperstring\n"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ExactAndSuperstring","Output":"--- PASS: TestMatchPath_AnimScope_ExactAndSuperstring (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ExactAndSuperstring","Elapsed":0} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ParentScope_DEFECT"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ParentScope_DEFECT","Output":"=== RUN TestMatchPath_AnimScope_ParentScope_DEFECT\n"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ParentScope_DEFECT","Output":"--- PASS: TestMatchPath_AnimScope_ParentScope_DEFECT (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.155255+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestMatchPath_AnimScope_ParentScope_DEFECT","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1557806+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestCanWritePath_AnimReport_ServiceToken"} +{"Time":"2026-10-09T10:39:49.1557806+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestCanWritePath_AnimReport_ServiceToken","Output":"=== RUN TestCanWritePath_AnimReport_ServiceToken\n"} +{"Time":"2026-10-09T10:39:49.1557806+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestCanWritePath_AnimReport_ServiceToken","Output":"--- PASS: TestCanWritePath_AnimReport_ServiceToken (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1557806+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestCanWritePath_AnimReport_ServiceToken","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1557806+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerBootRotationPersistsSuccessor"} +{"Time":"2026-10-09T10:39:49.1557806+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerBootRotationPersistsSuccessor","Output":"=== RUN TestServiceTokenManagerBootRotationPersistsSuccessor\n"} +{"Time":"2026-10-09T10:39:49.1579074+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerBootRotationPersistsSuccessor","Output":"2026/10/09 10:39:49 INFO durable service token rotated expires_at=2099-01-01T00:00:00.000Z\n"} +{"Time":"2026-10-09T10:39:49.1584368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerBootRotationPersistsSuccessor","Output":"--- PASS: TestServiceTokenManagerBootRotationPersistsSuccessor (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1584368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerBootRotationPersistsSuccessor","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1584368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerRecoversInterruptedRotationFromSeed"} +{"Time":"2026-10-09T10:39:49.1584368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerRecoversInterruptedRotationFromSeed","Output":"=== RUN TestServiceTokenManagerRecoversInterruptedRotationFromSeed\n"} +{"Time":"2026-10-09T10:39:49.1584368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerRecoversInterruptedRotationFromSeed","Output":"2026/10/09 10:39:49 ERROR durable service token recovering from interrupted rotation with bootstrap seed\n"} +{"Time":"2026-10-09T10:39:49.1594928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerRecoversInterruptedRotationFromSeed","Output":"2026/10/09 10:39:49 INFO durable service token rotated expires_at=2099-01-01T00:00:00.000Z\n"} +{"Time":"2026-10-09T10:39:49.1594928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerRecoversInterruptedRotationFromSeed","Output":"--- PASS: TestServiceTokenManagerRecoversInterruptedRotationFromSeed (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1594928+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerRecoversInterruptedRotationFromSeed","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1594928+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromRevokedPersistedFamily"} +{"Time":"2026-10-09T10:39:49.1594928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromRevokedPersistedFamily","Output":"=== RUN TestServiceTokenManagerFallsBackFromRevokedPersistedFamily\n"} +{"Time":"2026-10-09T10:39:49.1600159+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromRevokedPersistedFamily","Output":"2026/10/09 10:39:49 WARN persisted service-token family rejected or identity mismatched; retrying with fresh bootstrap seed\n"} +{"Time":"2026-10-09T10:39:49.1605481+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromRevokedPersistedFamily","Output":"2026/10/09 10:39:49 INFO durable service token rotated expires_at=2099-01-01T00:00:00.000Z\n"} +{"Time":"2026-10-09T10:39:49.1605481+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromRevokedPersistedFamily","Output":"--- PASS: TestServiceTokenManagerFallsBackFromRevokedPersistedFamily (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1605481+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromRevokedPersistedFamily","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1605481+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromPersistedWrongIdentity"} +{"Time":"2026-10-09T10:39:49.1605481+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromPersistedWrongIdentity","Output":"=== RUN TestServiceTokenManagerFallsBackFromPersistedWrongIdentity\n"} +{"Time":"2026-10-09T10:39:49.1610614+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromPersistedWrongIdentity","Output":"2026/10/09 10:39:49 WARN persisted service-token family rejected or identity mismatched; retrying with fresh bootstrap seed\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromPersistedWrongIdentity","Output":"2026/10/09 10:39:49 INFO durable service token rotated expires_at=2099-01-01T00:00:00.000Z\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromPersistedWrongIdentity","Output":"--- PASS: TestServiceTokenManagerFallsBackFromPersistedWrongIdentity (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerFallsBackFromPersistedWrongIdentity","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenRefreshURL"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenRefreshURL","Output":"=== RUN TestServiceTokenRefreshURL\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenRefreshURL","Output":"--- PASS: TestServiceTokenRefreshURL (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenRefreshURL","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode","Output":"=== RUN TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode","Output":"2026/10/09 10:39:49 ERROR durable service token disabled: no persisted refresh token or bootstrap seed\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode","Output":"--- PASS: TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode (0.00s)\n"} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Test":"TestServiceTokenManagerDoesNotUseExpiredStaticTokenInDurableMode","Elapsed":0} +{"Time":"2026-10-09T10:39:49.1615905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:49.1646877+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/auth","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/auth\t1.352s\n"} +{"Time":"2026-10-09T10:39:49.1890955+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/auth","Elapsed":1.376} +{"Time":"2026-10-09T10:39:51.7581023+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/bluehost"} +{"Time":"2026-10-09T10:39:53.045518+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerPersistsThenMirrors"} +{"Time":"2026-10-09T10:39:53.045518+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerPersistsThenMirrors","Output":"=== RUN TestAssignSlotHandlerPersistsThenMirrors\n"} +{"Time":"2026-10-09T10:39:53.0481563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerPersistsThenMirrors","Output":"--- PASS: TestAssignSlotHandlerPersistsThenMirrors (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0481563+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerPersistsThenMirrors","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0481563+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerDoesNotMirrorNon2xx"} +{"Time":"2026-10-09T10:39:53.0481563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerDoesNotMirrorNon2xx","Output":"=== RUN TestAssignSlotHandlerDoesNotMirrorNon2xx\n"} +{"Time":"2026-10-09T10:39:53.0497468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerDoesNotMirrorNon2xx","Output":"--- PASS: TestAssignSlotHandlerDoesNotMirrorNon2xx (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0497468+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignSlotHandlerDoesNotMirrorNon2xx","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0497468+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignCameraSlotCapabilitySharesCanonicalOperation"} +{"Time":"2026-10-09T10:39:53.0497468+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignCameraSlotCapabilitySharesCanonicalOperation","Output":"=== RUN TestAssignCameraSlotCapabilitySharesCanonicalOperation\n"} +{"Time":"2026-10-09T10:39:53.0502907+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignCameraSlotCapabilitySharesCanonicalOperation","Output":"--- PASS: TestAssignCameraSlotCapabilitySharesCanonicalOperation (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0508281+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAssignCameraSlotCapabilitySharesCanonicalOperation","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0508281+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReleaseCameraSlotCapabilityUsesCuratedDeleteAndClearsMirror"} +{"Time":"2026-10-09T10:39:53.0508281+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReleaseCameraSlotCapabilityUsesCuratedDeleteAndClearsMirror","Output":"=== RUN TestReleaseCameraSlotCapabilityUsesCuratedDeleteAndClearsMirror\n"} +{"Time":"2026-10-09T10:39:53.0513537+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReleaseCameraSlotCapabilityUsesCuratedDeleteAndClearsMirror","Output":"--- PASS: TestReleaseCameraSlotCapabilityUsesCuratedDeleteAndClearsMirror (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0513537+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReleaseCameraSlotCapabilityUsesCuratedDeleteAndClearsMirror","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0513537+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_OnAirReachesMirror"} +{"Time":"2026-10-09T10:39:53.0513537+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_OnAirReachesMirror","Output":"=== RUN TestDispatchOverlayAppSet_OnAirReachesMirror\n"} +{"Time":"2026-10-09T10:39:53.0593005+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_OnAirReachesMirror","Output":"--- PASS: TestDispatchOverlayAppSet_OnAirReachesMirror (0.01s)\n"} +{"Time":"2026-10-09T10:39:53.0593005+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_OnAirReachesMirror","Elapsed":0.01} +{"Time":"2026-10-09T10:39:53.0593005+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_UnchangedRecordNotReDispatched"} +{"Time":"2026-10-09T10:39:53.0593005+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_UnchangedRecordNotReDispatched","Output":"=== RUN TestDispatchOverlayAppSet_UnchangedRecordNotReDispatched\n"} +{"Time":"2026-10-09T10:39:53.0598301+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_UnchangedRecordNotReDispatched","Output":"--- PASS: TestDispatchOverlayAppSet_UnchangedRecordNotReDispatched (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0598301+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_UnchangedRecordNotReDispatched","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0598301+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_PreviewNeverReachesMirror"} +{"Time":"2026-10-09T10:39:53.0598301+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_PreviewNeverReachesMirror","Output":"=== RUN TestDispatchOverlayAppSet_PreviewNeverReachesMirror\n"} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_PreviewNeverReachesMirror","Output":"--- PASS: TestDispatchOverlayAppSet_PreviewNeverReachesMirror (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchOverlayAppSet_PreviewNeverReachesMirror","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_ConfigFallback"} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_ConfigFallback","Output":"=== RUN TestOverlayAppSetRecordFields_ConfigFallback\n"} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_ConfigFallback","Output":"--- PASS: TestOverlayAppSetRecordFields_ConfigFallback (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_ConfigFallback","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_InputsTakePrecedence"} +{"Time":"2026-10-09T10:39:53.0603477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_InputsTakePrecedence","Output":"=== RUN TestOverlayAppSetRecordFields_InputsTakePrecedence\n"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_InputsTakePrecedence","Output":"--- PASS: TestOverlayAppSetRecordFields_InputsTakePrecedence (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_InputsTakePrecedence","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_MissingAppIDSkipped"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_MissingAppIDSkipped","Output":"=== RUN TestOverlayAppSetRecordFields_MissingAppIDSkipped\n"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_MissingAppIDSkipped","Output":"--- PASS: TestOverlayAppSetRecordFields_MissingAppIDSkipped (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_MissingAppIDSkipped","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_BothDimensionsAbsentSkipped"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_BothDimensionsAbsentSkipped","Output":"=== RUN TestOverlayAppSetRecordFields_BothDimensionsAbsentSkipped\n"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_BothDimensionsAbsentSkipped","Output":"--- PASS: TestOverlayAppSetRecordFields_BothDimensionsAbsentSkipped (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestOverlayAppSetRecordFields_BothDimensionsAbsentSkipped","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesReadOnlyDBQuery"} +{"Time":"2026-10-09T10:39:53.0608842+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesReadOnlyDBQuery","Output":"=== RUN TestEffectHandlers_PreviewExecutesReadOnlyDBQuery\n"} +{"Time":"2026-10-09T10:39:53.061419+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesReadOnlyDBQuery","Output":"--- PASS: TestEffectHandlers_PreviewExecutesReadOnlyDBQuery (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.061419+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesReadOnlyDBQuery","Elapsed":0} +{"Time":"2026-10-09T10:39:53.061419+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesCuratedReadRoute"} +{"Time":"2026-10-09T10:39:53.061419+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesCuratedReadRoute","Output":"=== RUN TestEffectHandlers_PreviewExecutesCuratedReadRoute\n"} +{"Time":"2026-10-09T10:39:53.0624257+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesCuratedReadRoute","Output":"--- PASS: TestEffectHandlers_PreviewExecutesCuratedReadRoute (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0624257+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewExecutesCuratedReadRoute","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0624257+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallNon2xxPreservesStatusBodyAndOK"} +{"Time":"2026-10-09T10:39:53.0624257+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallNon2xxPreservesStatusBodyAndOK","Output":"=== RUN TestEffectHandlers_ServiceCallNon2xxPreservesStatusBodyAndOK\n"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallNon2xxPreservesStatusBodyAndOK","Output":"--- PASS: TestEffectHandlers_ServiceCallNon2xxPreservesStatusBodyAndOK (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallNon2xxPreservesStatusBodyAndOK","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallReferenceWithoutResolverFailsClosed"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallReferenceWithoutResolverFailsClosed","Output":"=== RUN TestEffectHandlers_ServiceCallReferenceWithoutResolverFailsClosed\n"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallReferenceWithoutResolverFailsClosed","Output":"--- PASS: TestEffectHandlers_ServiceCallReferenceWithoutResolverFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallReferenceWithoutResolverFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallRejectsAuthoredTransportDetails"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallRejectsAuthoredTransportDetails","Output":"=== RUN TestEffectHandlers_ServiceCallRejectsAuthoredTransportDetails\n"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallRejectsAuthoredTransportDetails","Output":"--- PASS: TestEffectHandlers_ServiceCallRejectsAuthoredTransportDetails (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallRejectsAuthoredTransportDetails","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallInvalidInputMissingTokenAndBudgetFailClosed"} +{"Time":"2026-10-09T10:39:53.0634658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallInvalidInputMissingTokenAndBudgetFailClosed","Output":"=== RUN TestEffectHandlers_ServiceCallInvalidInputMissingTokenAndBudgetFailClosed\n"} +{"Time":"2026-10-09T10:39:53.0645227+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallInvalidInputMissingTokenAndBudgetFailClosed","Output":"--- PASS: TestEffectHandlers_ServiceCallInvalidInputMissingTokenAndBudgetFailClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0645227+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallInvalidInputMissingTokenAndBudgetFailClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0645227+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewNeverDialsNetwork"} +{"Time":"2026-10-09T10:39:53.0645227+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewNeverDialsNetwork","Output":"=== RUN TestEffectHandlers_PreviewNeverDialsNetwork\n"} +{"Time":"2026-10-09T10:39:53.0656053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewNeverDialsNetwork","Output":"--- PASS: TestEffectHandlers_PreviewNeverDialsNetwork (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0656053+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_PreviewNeverDialsNetwork","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0656053+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteDispatchesRealHTTP"} +{"Time":"2026-10-09T10:39:53.0656053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteDispatchesRealHTTP","Output":"=== RUN TestEffectHandlers_ExecuteDispatchesRealHTTP\n"} +{"Time":"2026-10-09T10:39:53.067186+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteDispatchesRealHTTP","Output":"--- PASS: TestEffectHandlers_ExecuteDispatchesRealHTTP (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteDispatchesRealHTTP","Elapsed":0} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteEgressDeniedFiresErrorPin"} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteEgressDeniedFiresErrorPin","Output":"=== RUN TestEffectHandlers_ExecuteEgressDeniedFiresErrorPin\n"} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteEgressDeniedFiresErrorPin","Output":"--- PASS: TestEffectHandlers_ExecuteEgressDeniedFiresErrorPin (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteEgressDeniedFiresErrorPin","Elapsed":0} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteWithoutEgressPolicyFailsClosed"} +{"Time":"2026-10-09T10:39:53.067775+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteWithoutEgressPolicyFailsClosed","Output":"=== RUN TestEffectHandlers_ExecuteWithoutEgressPolicyFailsClosed\n"} +{"Time":"2026-10-09T10:39:53.0683062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteWithoutEgressPolicyFailsClosed","Output":"--- PASS: TestEffectHandlers_ExecuteWithoutEgressPolicyFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0683062+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteWithoutEgressPolicyFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0683062+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallPreviewRejectsWrite"} +{"Time":"2026-10-09T10:39:53.0683062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallPreviewRejectsWrite","Output":"=== RUN TestEffectHandlers_ServiceCallPreviewRejectsWrite\n"} +{"Time":"2026-10-09T10:39:53.0688396+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallPreviewRejectsWrite","Output":"--- PASS: TestEffectHandlers_ServiceCallPreviewRejectsWrite (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0688396+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ServiceCallPreviewRejectsWrite","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0688396+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteServiceCallBuildsPathAndCalls"} +{"Time":"2026-10-09T10:39:53.0688396+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteServiceCallBuildsPathAndCalls","Output":"=== RUN TestEffectHandlers_ExecuteServiceCallBuildsPathAndCalls\n"} +{"Time":"2026-10-09T10:39:53.0693517+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteServiceCallBuildsPathAndCalls","Output":"--- PASS: TestEffectHandlers_ExecuteServiceCallBuildsPathAndCalls (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0693517+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestEffectHandlers_ExecuteServiceCallBuildsPathAndCalls","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0693517+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations"} +{"Time":"2026-10-09T10:39:53.0693517+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations","Output":"=== RUN TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations\n"} +{"Time":"2026-10-09T10:39:53.0693517+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/tick"} +{"Time":"2026-10-09T10:39:53.0693517+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/tick","Output":"=== RUN TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/tick\n"} +{"Time":"2026-10-09T10:39:53.0725135+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/tick","Output":"--- PASS: TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/tick (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.0725135+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/tick","Elapsed":0} +{"Time":"2026-10-09T10:39:53.0725135+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call"} +{"Time":"2026-10-09T10:39:53.0725135+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call","Output":"=== RUN TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call\n"} +{"Time":"2026-10-09T10:39:53.1193714+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=arm status=idle output_count=2 runtime_wait_ms=0 runtime_ms=0.54\n"} +{"Time":"2026-10-09T10:39:53.1193714+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call","Output":"--- PASS: TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call (0.05s)\n"} +{"Time":"2026-10-09T10:39:53.1193714+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/call","Elapsed":0.05} +{"Time":"2026-10-09T10:39:53.1193714+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/platform-event"} +{"Time":"2026-10-09T10:39:53.1193714+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/platform-event","Output":"=== RUN TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/platform-event\n"} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/platform-event","Output":"--- PASS: TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/platform-event (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations/platform-event","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations","Output":"--- PASS: TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations (0.05s)\n"} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntryPointsUseDirectEffectHandlersBecauseBlueDoesNotReturnInvocations","Elapsed":0.05} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TickFiresOnTickEntrypoint"} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TickFiresOnTickEntrypoint","Output":"=== RUN TestHost_TickFiresOnTickEntrypoint\n"} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TickFiresOnTickEntrypoint","Output":"--- PASS: TestHost_TickFiresOnTickEntrypoint (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1215161+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TickFiresOnTickEntrypoint","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_CallFiresOnCallEntrypoint"} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_CallFiresOnCallEntrypoint","Output":"=== RUN TestHost_CallFiresOnCallEntrypoint\n"} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_CallFiresOnCallEntrypoint","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=arm status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_CallFiresOnCallEntrypoint","Output":"--- PASS: TestHost_CallFiresOnCallEntrypoint (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_CallFiresOnCallEntrypoint","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_WritePlatformEventFiresEntrypoint"} +{"Time":"2026-10-09T10:39:53.1220507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_WritePlatformEventFiresEntrypoint","Output":"=== RUN TestHost_WritePlatformEventFiresEntrypoint\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_WritePlatformEventFiresEntrypoint","Output":"--- PASS: TestHost_WritePlatformEventFiresEntrypoint (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_WritePlatformEventFiresEntrypoint","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntrypointMethodsFailOnEmptySlot"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntrypointMethodsFailOnEmptySlot","Output":"=== RUN TestHost_EntrypointMethodsFailOnEmptySlot\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntrypointMethodsFailOnEmptySlot","Output":"--- PASS: TestHost_EntrypointMethodsFailOnEmptySlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EntrypointMethodsFailOnEmptySlot","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPrepareStatic_AdmissionAndIdentity"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPrepareStatic_AdmissionAndIdentity","Output":"=== RUN TestPrepareStatic_AdmissionAndIdentity\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPrepareStatic_AdmissionAndIdentity","Output":"--- PASS: TestPrepareStatic_AdmissionAndIdentity (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPrepareStatic_AdmissionAndIdentity","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPreparePreviewStaticReplacesDifferentScene"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPreparePreviewStaticReplacesDifferentScene","Output":"=== RUN TestPreparePreviewStaticReplacesDifferentScene\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPreparePreviewStaticReplacesDifferentScene","Output":"--- PASS: TestPreparePreviewStaticReplacesDifferentScene (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestPreparePreviewStaticReplacesDifferentScene","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestTakeStatic_SupersedesStaticWithoutError"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestTakeStatic_SupersedesStaticWithoutError","Output":"=== RUN TestTakeStatic_SupersedesStaticWithoutError\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestTakeStatic_SupersedesStaticWithoutError","Output":"--- PASS: TestTakeStatic_SupersedesStaticWithoutError (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestTakeStatic_SupersedesStaticWithoutError","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStaticOccupation_InstanceDoorsAnswerNotLoaded"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStaticOccupation_InstanceDoorsAnswerNotLoaded","Output":"=== RUN TestStaticOccupation_InstanceDoorsAnswerNotLoaded\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStaticOccupation_InstanceDoorsAnswerNotLoaded","Output":"--- PASS: TestStaticOccupation_InstanceDoorsAnswerNotLoaded (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStaticOccupation_InstanceDoorsAnswerNotLoaded","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewAndOnAirAreIsolated"} +{"Time":"2026-10-09T10:39:53.1225882+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewAndOnAirAreIsolated","Output":"=== RUN TestHost_PreparePreviewAndOnAirAreIsolated\n"} +{"Time":"2026-10-09T10:39:53.1231098+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewAndOnAirAreIsolated","Output":"--- PASS: TestHost_PreparePreviewAndOnAirAreIsolated (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1231098+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewAndOnAirAreIsolated","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1231098+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PrepareRefusesDoubleLoad"} +{"Time":"2026-10-09T10:39:53.1231098+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PrepareRefusesDoubleLoad","Output":"=== RUN TestHost_PrepareRefusesDoubleLoad\n"} +{"Time":"2026-10-09T10:39:53.1236312+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PrepareRefusesDoubleLoad","Output":"--- PASS: TestHost_PrepareRefusesDoubleLoad (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1236312+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PrepareRefusesDoubleLoad","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1236312+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewReplacesDifferentScene"} +{"Time":"2026-10-09T10:39:53.1236312+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewReplacesDifferentScene","Output":"=== RUN TestHost_PreparePreviewReplacesDifferentScene\n"} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewReplacesDifferentScene","Output":"--- PASS: TestHost_PreparePreviewReplacesDifferentScene (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreparePreviewReplacesDifferentScene","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReusesParsedProgramHandleAcrossSceneReplacements"} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReusesParsedProgramHandleAcrossSceneReplacements","Output":"=== RUN TestHost_ReusesParsedProgramHandleAcrossSceneReplacements\n"} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReusesParsedProgramHandleAcrossSceneReplacements","Output":"--- PASS: TestHost_ReusesParsedProgramHandleAcrossSceneReplacements (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReusesParsedProgramHandleAcrossSceneReplacements","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeSupersedesPreviousOnAirWithoutStateTransfer"} +{"Time":"2026-10-09T10:39:53.1241662+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeSupersedesPreviousOnAirWithoutStateTransfer","Output":"=== RUN TestHost_TakeSupersedesPreviousOnAirWithoutStateTransfer\n"} +{"Time":"2026-10-09T10:39:53.124679+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeSupersedesPreviousOnAirWithoutStateTransfer","Output":"--- PASS: TestHost_TakeSupersedesPreviousOnAirWithoutStateTransfer (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.124679+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeSupersedesPreviousOnAirWithoutStateTransfer","Elapsed":0} +{"Time":"2026-10-09T10:39:53.124679+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeFailureLeavesPreviousOnAirUntouched"} +{"Time":"2026-10-09T10:39:53.124679+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeFailureLeavesPreviousOnAirUntouched","Output":"=== RUN TestHost_TakeFailureLeavesPreviousOnAirUntouched\n"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeFailureLeavesPreviousOnAirUntouched","Output":"--- PASS: TestHost_TakeFailureLeavesPreviousOnAirUntouched (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_TakeFailureLeavesPreviousOnAirUntouched","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseIsIdempotentOnEmptySlot"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseIsIdempotentOnEmptySlot","Output":"=== RUN TestHost_ReleaseIsIdempotentOnEmptySlot\n"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseIsIdempotentOnEmptySlot","Output":"--- PASS: TestHost_ReleaseIsIdempotentOnEmptySlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseIsIdempotentOnEmptySlot","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_StepOnEmptySlotFails"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_StepOnEmptySlotFails","Output":"=== RUN TestHost_StepOnEmptySlotFails\n"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_StepOnEmptySlotFails","Output":"--- PASS: TestHost_StepOnEmptySlotFails (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_StepOnEmptySlotFails","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseThenReprepare"} +{"Time":"2026-10-09T10:39:53.1252088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseThenReprepare","Output":"=== RUN TestHost_ReleaseThenReprepare\n"} +{"Time":"2026-10-09T10:39:53.125729+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseThenReprepare","Output":"--- PASS: TestHost_ReleaseThenReprepare (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.125729+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ReleaseThenReprepare","Elapsed":0} +{"Time":"2026-10-09T10:39:53.125729+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_SetBundleAndBundle"} +{"Time":"2026-10-09T10:39:53.125729+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_SetBundleAndBundle","Output":"=== RUN TestHost_SetBundleAndBundle\n"} +{"Time":"2026-10-09T10:39:53.1267728+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_SetBundleAndBundle","Output":"--- PASS: TestHost_SetBundleAndBundle (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1267728+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_SetBundleAndBundle","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1267728+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ServingRequiresBothSceneIDAndDigestToMatch"} +{"Time":"2026-10-09T10:39:53.1267728+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ServingRequiresBothSceneIDAndDigestToMatch","Output":"=== RUN TestHost_ServingRequiresBothSceneIDAndDigestToMatch\n"} +{"Time":"2026-10-09T10:39:53.1272957+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ServingRequiresBothSceneIDAndDigestToMatch","Output":"--- PASS: TestHost_ServingRequiresBothSceneIDAndDigestToMatch (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1272957+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_ServingRequiresBothSceneIDAndDigestToMatch","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1272957+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareResponseAndSecurity"} +{"Time":"2026-10-09T10:39:53.1272957+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareResponseAndSecurity","Output":"=== RUN TestHTTPTransportAdaptersShareResponseAndSecurity\n"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareResponseAndSecurity","Output":"--- PASS: TestHTTPTransportAdaptersShareResponseAndSecurity (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareResponseAndSecurity","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareHeaderCap"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareHeaderCap","Output":"=== RUN TestHTTPTransportAdaptersShareHeaderCap\n"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareHeaderCap","Output":"--- PASS: TestHTTPTransportAdaptersShareHeaderCap (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportAdaptersShareHeaderCap","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization","Output":"=== RUN TestHTTPTransportMethodNormalization\n"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/empty_defaults_to_GET"} +{"Time":"2026-10-09T10:39:53.1283515+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/empty_defaults_to_GET","Output":"=== RUN TestHTTPTransportMethodNormalization/empty_defaults_to_GET\n"} +{"Time":"2026-10-09T10:39:53.1288736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/empty_defaults_to_GET","Output":"--- PASS: TestHTTPTransportMethodNormalization/empty_defaults_to_GET (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1288736+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/empty_defaults_to_GET","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1288736+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_get_uppercases"} +{"Time":"2026-10-09T10:39:53.1288736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_get_uppercases","Output":"=== RUN TestHTTPTransportMethodNormalization/lowercase_get_uppercases\n"} +{"Time":"2026-10-09T10:39:53.1294561+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_get_uppercases","Output":"--- PASS: TestHTTPTransportMethodNormalization/lowercase_get_uppercases (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1294561+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_get_uppercases","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1294561+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/mixed_case_uppercases"} +{"Time":"2026-10-09T10:39:53.1294561+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/mixed_case_uppercases","Output":"=== RUN TestHTTPTransportMethodNormalization/mixed_case_uppercases\n"} +{"Time":"2026-10-09T10:39:53.1304957+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/mixed_case_uppercases","Output":"--- PASS: TestHTTPTransportMethodNormalization/mixed_case_uppercases (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1304957+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/mixed_case_uppercases","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1304957+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_post_uppercases"} +{"Time":"2026-10-09T10:39:53.1304957+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_post_uppercases","Output":"=== RUN TestHTTPTransportMethodNormalization/lowercase_post_uppercases\n"} +{"Time":"2026-10-09T10:39:53.1315664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_post_uppercases","Output":"--- PASS: TestHTTPTransportMethodNormalization/lowercase_post_uppercases (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1315664+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/lowercase_post_uppercases","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1315664+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PURGE_is_not_allowlisted_away"} +{"Time":"2026-10-09T10:39:53.1315664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PURGE_is_not_allowlisted_away","Output":"=== RUN TestHTTPTransportMethodNormalization/non-standard_verb_PURGE_is_not_allowlisted_away\n"} +{"Time":"2026-10-09T10:39:53.1320834+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PURGE_is_not_allowlisted_away","Output":"--- PASS: TestHTTPTransportMethodNormalization/non-standard_verb_PURGE_is_not_allowlisted_away (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1320834+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PURGE_is_not_allowlisted_away","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1320834+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PROPFIND_is_not_allowlisted_away"} +{"Time":"2026-10-09T10:39:53.1320834+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PROPFIND_is_not_allowlisted_away","Output":"=== RUN TestHTTPTransportMethodNormalization/non-standard_verb_PROPFIND_is_not_allowlisted_away\n"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PROPFIND_is_not_allowlisted_away","Output":"--- PASS: TestHTTPTransportMethodNormalization/non-standard_verb_PROPFIND_is_not_allowlisted_away (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/non-standard_verb_PROPFIND_is_not_allowlisted_away","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/padded_method_is_refused,_never_reaches_the_wire"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/padded_method_is_refused,_never_reaches_the_wire","Output":"=== RUN TestHTTPTransportMethodNormalization/padded_method_is_refused,_never_reaches_the_wire\n"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/padded_method_is_refused,_never_reaches_the_wire","Output":"--- PASS: TestHTTPTransportMethodNormalization/padded_method_is_refused,_never_reaches_the_wire (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization/padded_method_is_refused,_never_reaches_the_wire","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization","Output":"--- PASS: TestHTTPTransportMethodNormalization (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportMethodNormalization","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire","Output":"=== RUN TestHTTPTransportObservesURLTimeoutAndBodyOnWire\n"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/authored_path_and_query_reach_the_wire_unmodified"} +{"Time":"2026-10-09T10:39:53.1331394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/authored_path_and_query_reach_the_wire_unmodified","Output":"=== RUN TestHTTPTransportObservesURLTimeoutAndBodyOnWire/authored_path_and_query_reach_the_wire_unmodified\n"} +{"Time":"2026-10-09T10:39:53.1336578+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/authored_path_and_query_reach_the_wire_unmodified","Output":"--- PASS: TestHTTPTransportObservesURLTimeoutAndBodyOnWire/authored_path_and_query_reach_the_wire_unmodified (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1336578+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/authored_path_and_query_reach_the_wire_unmodified","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1336578+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/timeout_ms_is_enforced_against_the_real_connection,_not_recomputed"} +{"Time":"2026-10-09T10:39:53.1336578+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/timeout_ms_is_enforced_against_the_real_connection,_not_recomputed","Output":"=== RUN TestHTTPTransportObservesURLTimeoutAndBodyOnWire/timeout_ms_is_enforced_against_the_real_connection,_not_recomputed\n"} +{"Time":"2026-10-09T10:39:53.1846706+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/timeout_ms_is_enforced_against_the_real_connection,_not_recomputed","Output":"--- PASS: TestHTTPTransportObservesURLTimeoutAndBodyOnWire/timeout_ms_is_enforced_against_the_real_connection,_not_recomputed (0.05s)\n"} +{"Time":"2026-10-09T10:39:53.1846706+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/timeout_ms_is_enforced_against_the_real_connection,_not_recomputed","Elapsed":0.05} +{"Time":"2026-10-09T10:39:53.1846706+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/body_reaches_the_wire_byte-identical_to_what_was_authored"} +{"Time":"2026-10-09T10:39:53.1846706+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/body_reaches_the_wire_byte-identical_to_what_was_authored","Output":"=== RUN TestHTTPTransportObservesURLTimeoutAndBodyOnWire/body_reaches_the_wire_byte-identical_to_what_was_authored\n"} +{"Time":"2026-10-09T10:39:53.1851872+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/body_reaches_the_wire_byte-identical_to_what_was_authored","Output":"--- PASS: TestHTTPTransportObservesURLTimeoutAndBodyOnWire/body_reaches_the_wire_byte-identical_to_what_was_authored (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.1851872+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/body_reaches_the_wire_byte-identical_to_what_was_authored","Elapsed":0} +{"Time":"2026-10-09T10:39:53.1851872+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/Orion's_own_request-body_bound_is_enforced_on_the_wire,_never_Blue's"} +{"Time":"2026-10-09T10:39:53.1851872+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/Orion's_own_request-body_bound_is_enforced_on_the_wire,_never_Blue's","Output":"=== RUN TestHTTPTransportObservesURLTimeoutAndBodyOnWire/Orion's_own_request-body_bound_is_enforced_on_the_wire,_never_Blue's\n"} +{"Time":"2026-10-09T10:39:53.6875992+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/Orion's_own_request-body_bound_is_enforced_on_the_wire,_never_Blue's","Output":"--- PASS: TestHTTPTransportObservesURLTimeoutAndBodyOnWire/Orion's_own_request-body_bound_is_enforced_on_the_wire,_never_Blue's (0.50s)\n"} +{"Time":"2026-10-09T10:39:53.6875992+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire/Orion's_own_request-body_bound_is_enforced_on_the_wire,_never_Blue's","Elapsed":0.5} +{"Time":"2026-10-09T10:39:53.6875992+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire","Output":"--- PASS: TestHTTPTransportObservesURLTimeoutAndBodyOnWire (0.55s)\n"} +{"Time":"2026-10-09T10:39:53.6875992+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHTTPTransportObservesURLTimeoutAndBodyOnWire","Elapsed":0.55} +{"Time":"2026-10-09T10:39:53.6875992+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureLocalCopiesMatchTheirSidecars"} +{"Time":"2026-10-09T10:39:53.6875992+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureLocalCopiesMatchTheirSidecars","Output":"=== RUN TestContractFixtureLocalCopiesMatchTheirSidecars\n"} +{"Time":"2026-10-09T10:39:53.7130672+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureLocalCopiesMatchTheirSidecars","Output":"--- PASS: TestContractFixtureLocalCopiesMatchTheirSidecars (0.03s)\n"} +{"Time":"2026-10-09T10:39:53.7130672+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureLocalCopiesMatchTheirSidecars","Elapsed":0.03} +{"Time":"2026-10-09T10:39:53.7130672+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureArm_CoreHTTPRequest"} +{"Time":"2026-10-09T10:39:53.7140928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureArm_CoreHTTPRequest","Output":"=== RUN TestContractFixtureArm_CoreHTTPRequest\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureArm_CoreHTTPRequest","Output":"--- PASS: TestContractFixtureArm_CoreHTTPRequest (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestContractFixtureArm_CoreHTTPRequest","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRealMarkerRuleLaunchAndLSMLIntent"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRealMarkerRuleLaunchAndLSMLIntent","Output":"=== RUN TestRealMarkerRuleLaunchAndLSMLIntent\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRealMarkerRuleLaunchAndLSMLIntent","Output":" marker_process_test.go:20: requires actual Marker executable, native receiver and explicit capture path\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRealMarkerRuleLaunchAndLSMLIntent","Output":"--- SKIP: TestRealMarkerRuleLaunchAndLSMLIntent (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRealMarkerRuleLaunchAndLSMLIntent","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsPromotesGraphOutputBag"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsPromotesGraphOutputBag","Output":"=== RUN TestNormalizeRuntimeOutputsPromotesGraphOutputBag\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsPromotesGraphOutputBag","Output":"--- PASS: TestNormalizeRuntimeOutputsPromotesGraphOutputBag (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsPromotesGraphOutputBag","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsIsNoopWithoutOutputBag"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsIsNoopWithoutOutputBag","Output":"=== RUN TestNormalizeRuntimeOutputsIsNoopWithoutOutputBag\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsIsNoopWithoutOutputBag","Output":"--- PASS: TestNormalizeRuntimeOutputsIsNoopWithoutOutputBag (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestNormalizeRuntimeOutputsIsNoopWithoutOutputBag","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostProjectedStepTickAndPlatformEventKeepLocalSideEffects"} +{"Time":"2026-10-09T10:39:53.7146207+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostProjectedStepTickAndPlatformEventKeepLocalSideEffects","Output":"=== RUN TestHostProjectedStepTickAndPlatformEventKeepLocalSideEffects\n"} +{"Time":"2026-10-09T10:39:53.7172812+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostProjectedStepTickAndPlatformEventKeepLocalSideEffects","Output":"--- PASS: TestHostProjectedStepTickAndPlatformEventKeepLocalSideEffects (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7172812+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostProjectedStepTickAndPlatformEventKeepLocalSideEffects","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7172812+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementRetainsExactInstanceAndBlocksNewExecutions"} +{"Time":"2026-10-09T10:39:53.7172812+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementRetainsExactInstanceAndBlocksNewExecutions","Output":"=== RUN TestReplacementRetainsExactInstanceAndBlocksNewExecutions\n"} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementRetainsExactInstanceAndBlocksNewExecutions","Output":"--- PASS: TestReplacementRetainsExactInstanceAndBlocksNewExecutions (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementRetainsExactInstanceAndBlocksNewExecutions","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementFinalizationAndFailedProgramPreserveLane"} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementFinalizationAndFailedProgramPreserveLane","Output":"=== RUN TestReplacementFinalizationAndFailedProgramPreserveLane\n"} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementFinalizationAndFailedProgramPreserveLane","Output":"--- PASS: TestReplacementFinalizationAndFailedProgramPreserveLane (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestReplacementFinalizationAndFailedProgramPreserveLane","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots"} +{"Time":"2026-10-09T10:39:53.7177982+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots","Output":"=== RUN TestRulePlane_MarkerOnOffAcrossSceneSlots\n"} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=marker_overlay_on status=idle output_count=0 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=marker_overlay_off status=idle output_count=0 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=marker_overlay_on status=idle output_count=0 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots","Output":"--- PASS: TestRulePlane_MarkerOnOffAcrossSceneSlots (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_MarkerOnOffAcrossSceneSlots","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlaneRestoresCachedProgramAndDurablyDemotes"} +{"Time":"2026-10-09T10:39:53.7183229+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlaneRestoresCachedProgramAndDurablyDemotes","Output":"=== RUN TestRulePlaneRestoresCachedProgramAndDurablyDemotes\n"} +{"Time":"2026-10-09T10:39:53.7494954+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlaneRestoresCachedProgramAndDurablyDemotes","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=marker_overlay_on status=idle output_count=0 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:53.7616824+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlaneRestoresCachedProgramAndDurablyDemotes","Output":"--- PASS: TestRulePlaneRestoresCachedProgramAndDurablyDemotes (0.04s)\n"} +{"Time":"2026-10-09T10:39:53.7616824+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlaneRestoresCachedProgramAndDurablyDemotes","Elapsed":0.04} +{"Time":"2026-10-09T10:39:53.7616824+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion"} +{"Time":"2026-10-09T10:39:53.7616824+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion","Output":"=== RUN TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion\n"} +{"Time":"2026-10-09T10:39:53.7638046+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion","Output":"--- PASS: TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7638046+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7638046+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock"} +{"Time":"2026-10-09T10:39:53.7638046+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock","Output":"=== RUN TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock\n"} +{"Time":"2026-10-09T10:39:53.7659655+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock","Output":"2026/10/09 10:39:53 INFO blue runtime operator call completed slot=on-air call_id=arm status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock","Output":"--- PASS: TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostSceneInterface_SourceAuthorityCopiesAndLifetime"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostSceneInterface_SourceAuthorityCopiesAndLifetime","Output":"=== RUN TestHostSceneInterface_SourceAuthorityCopiesAndLifetime\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostSceneInterface_SourceAuthorityCopiesAndLifetime","Output":"--- PASS: TestHostSceneInterface_SourceAuthorityCopiesAndLifetime (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHostSceneInterface_SourceAuthorityCopiesAndLifetime","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads","Output":"=== RUN TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads","Output":"--- PASS: TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestBuildShowEmitEventIsAcceptedByBlueRuntime"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestBuildShowEmitEventIsAcceptedByBlueRuntime","Output":"=== RUN TestBuildShowEmitEventIsAcceptedByBlueRuntime\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestBuildShowEmitEventIsAcceptedByBlueRuntime","Output":"--- PASS: TestBuildShowEmitEventIsAcceptedByBlueRuntime (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestBuildShowEmitEventIsAcceptedByBlueRuntime","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EmitEventDoesNotConsumeSequenceWhenTopicIsRejected"} +{"Time":"2026-10-09T10:39:53.7664881+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EmitEventDoesNotConsumeSequenceWhenTopicIsRejected","Output":"=== RUN TestHost_EmitEventDoesNotConsumeSequenceWhenTopicIsRejected\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EmitEventDoesNotConsumeSequenceWhenTopicIsRejected","Output":"--- PASS: TestHost_EmitEventDoesNotConsumeSequenceWhenTopicIsRejected (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_EmitEventDoesNotConsumeSequenceWhenTopicIsRejected","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestShowEventRouterBoundsReentrantCycles"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestShowEventRouterBoundsReentrantCycles","Output":"=== RUN TestShowEventRouterBoundsReentrantCycles\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestShowEventRouterBoundsReentrantCycles","Output":"--- PASS: TestShowEventRouterBoundsReentrantCycles (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestShowEventRouterBoundsReentrantCycles","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestLocalInvocationsRouteMutationsToTheirOwnSlot"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestLocalInvocationsRouteMutationsToTheirOwnSlot","Output":"=== RUN TestLocalInvocationsRouteMutationsToTheirOwnSlot\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestLocalInvocationsRouteMutationsToTheirOwnSlot","Output":"--- PASS: TestLocalInvocationsRouteMutationsToTheirOwnSlot (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestLocalInvocationsRouteMutationsToTheirOwnSlot","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAnimationDispatchReplaysOnlyNewCausation"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAnimationDispatchReplaysOnlyNewCausation","Output":"=== RUN TestAnimationDispatchReplaysOnlyNewCausation\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAnimationDispatchReplaysOnlyNewCausation","Output":"--- PASS: TestAnimationDispatchReplaysOnlyNewCausation (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestAnimationDispatchReplaysOnlyNewCausation","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_StopsWhenIdle"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_StopsWhenIdle","Output":"=== RUN TestStepUntilSettledOrExhausted_StopsWhenIdle\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_StopsWhenIdle","Output":"--- PASS: TestStepUntilSettledOrExhausted_StopsWhenIdle (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_StopsWhenIdle","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_RefusesUnconsumedInvocation"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_RefusesUnconsumedInvocation","Output":"=== RUN TestStepUntilSettledOrExhausted_RefusesUnconsumedInvocation\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_RefusesUnconsumedInvocation","Output":"--- PASS: TestStepUntilSettledOrExhausted_RefusesUnconsumedInvocation (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_RefusesUnconsumedInvocation","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_PropagatesStepError"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_PropagatesStepError","Output":"=== RUN TestStepUntilSettledOrExhausted_PropagatesStepError\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_PropagatesStepError","Output":"--- PASS: TestStepUntilSettledOrExhausted_PropagatesStepError (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_PropagatesStepError","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_ExhaustsStepBudget"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_ExhaustsStepBudget","Output":"=== RUN TestStepUntilSettledOrExhausted_ExhaustsStepBudget\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_ExhaustsStepBudget","Output":"--- PASS: TestStepUntilSettledOrExhausted_ExhaustsStepBudget (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestStepUntilSettledOrExhausted_ExhaustsStepBudget","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_ExceedsWallClock"} +{"Time":"2026-10-09T10:39:53.7680961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_ExceedsWallClock","Output":"=== RUN TestRunBoundedSteps_ExceedsWallClock\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_ExceedsWallClock","Output":"--- PASS: TestRunBoundedSteps_ExceedsWallClock (0.01s)\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_ExceedsWallClock","Elapsed":0.01} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_CallsStopOnNormalCompletion"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_CallsStopOnNormalCompletion","Output":"=== RUN TestRunBoundedSteps_CallsStopOnNormalCompletion\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_CallsStopOnNormalCompletion","Output":"--- PASS: TestRunBoundedSteps_CallsStopOnNormalCompletion (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_CallsStopOnNormalCompletion","Elapsed":0} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict","Output":"=== RUN TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/execution_refusal_wins"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/execution_refusal_wins","Output":"=== RUN TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/execution_refusal_wins\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/execution_refusal_wins","Output":"--- PASS: TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/execution_refusal_wins (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/execution_refusal_wins","Elapsed":0} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/stop_error_surfaces_when_otherwise_servable"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/stop_error_surfaces_when_otherwise_servable","Output":"=== RUN TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/stop_error_surfaces_when_otherwise_servable\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/stop_error_surfaces_when_otherwise_servable","Output":"--- PASS: TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/stop_error_surfaces_when_otherwise_servable (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict/stop_error_surfaces_when_otherwise_servable","Elapsed":0} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict","Output":"--- PASS: TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestRunBoundedSteps_StopErrorOnlySurfacesWhenNoOtherVerdict","Elapsed":0} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_StartAloneNeverDialsEvenWithLiveExecuteHandlers"} +{"Time":"2026-10-09T10:39:53.778607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_StartAloneNeverDialsEvenWithLiveExecuteHandlers","Output":"=== RUN TestValidateProgram_StartAloneNeverDialsEvenWithLiveExecuteHandlers\n"} +{"Time":"2026-10-09T10:39:53.7797291+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_StartAloneNeverDialsEvenWithLiveExecuteHandlers","Output":"--- PASS: TestValidateProgram_StartAloneNeverDialsEvenWithLiveExecuteHandlers (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7797291+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_StartAloneNeverDialsEvenWithLiveExecuteHandlers","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7797291+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverDialsEvenThoughStepReallyExecutes"} +{"Time":"2026-10-09T10:39:53.7797291+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverDialsEvenThoughStepReallyExecutes","Output":"=== RUN TestValidateProgram_NeverDialsEvenThoughStepReallyExecutes\n"} +{"Time":"2026-10-09T10:39:53.7802509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverDialsEvenThoughStepReallyExecutes","Output":"--- PASS: TestValidateProgram_NeverDialsEvenThoughStepReallyExecutes (0.00s)\n"} +{"Time":"2026-10-09T10:39:53.7802509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverDialsEvenThoughStepReallyExecutes","Elapsed":0} +{"Time":"2026-10-09T10:39:53.7802509+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewNeverReceivesCompletionEvenWithoutHTTPEffects"} +{"Time":"2026-10-09T10:39:53.7802509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewNeverReceivesCompletionEvenWithoutHTTPEffects","Output":"=== RUN TestHost_PreviewNeverReceivesCompletionEvenWithoutHTTPEffects\n"} +{"Time":"2026-10-09T10:39:54.2890527+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewNeverReceivesCompletionEvenWithoutHTTPEffects","Output":"--- PASS: TestHost_PreviewNeverReceivesCompletionEvenWithoutHTTPEffects (0.51s)\n"} +{"Time":"2026-10-09T10:39:54.2890527+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewNeverReceivesCompletionEvenWithoutHTTPEffects","Elapsed":0.51} +{"Time":"2026-10-09T10:39:54.2890527+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectFullCycle"} +{"Time":"2026-10-09T10:39:54.2890527+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectFullCycle","Output":"=== RUN TestHost_HTTPEffectFullCycle\n"} +{"Time":"2026-10-09T10:39:54.2911352+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectFullCycle","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:3dba6651e600791c70fc2e1256304b549a3db4caf07e84cf0a13e5eaed67754a capability=core.http.request operation=request status=succeeded error=\"\"\n"} +{"Time":"2026-10-09T10:39:54.3113113+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectFullCycle","Output":"--- PASS: TestHost_HTTPEffectFullCycle (0.02s)\n"} +{"Time":"2026-10-09T10:39:54.3113113+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectFullCycle","Elapsed":0.02} +{"Time":"2026-10-09T10:39:54.3113113+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake"} +{"Time":"2026-10-09T10:39:54.3113113+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake","Output":"=== RUN TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake\n"} +{"Time":"2026-10-09T10:39:54.3150108+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:31a3b05b4984422e0f5a7f709d94bc786583495f533f1a7a5ca127e064f621c6 capability=core.http.request operation=request status=succeeded error=\"\"\n"} +{"Time":"2026-10-09T10:39:54.3156292+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:15ff90770e648e1eecf2e373df26f4e1d93791a23327aed61c723b91419340d2 capability=core.http.request operation=request status=succeeded error=\"\"\n"} +{"Time":"2026-10-09T10:39:54.334755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake","Output":"--- PASS: TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake (0.02s)\n"} +{"Time":"2026-10-09T10:39:54.334755+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectStaleCompletionIsDroppedAfterTake","Elapsed":0.02} +{"Time":"2026-10-09T10:39:54.334755+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewHTTPEffectGateBlocksRealDispatch"} +{"Time":"2026-10-09T10:39:54.334755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewHTTPEffectGateBlocksRealDispatch","Output":"=== RUN TestHost_PreviewHTTPEffectGateBlocksRealDispatch\n"} +{"Time":"2026-10-09T10:39:54.8436513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewHTTPEffectGateBlocksRealDispatch","Output":"--- PASS: TestHost_PreviewHTTPEffectGateBlocksRealDispatch (0.51s)\n"} +{"Time":"2026-10-09T10:39:54.8436513+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_PreviewHTTPEffectGateBlocksRealDispatch","Elapsed":0.51} +{"Time":"2026-10-09T10:39:54.8436513+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate"} +{"Time":"2026-10-09T10:39:54.8436513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate","Output":"=== RUN TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate\n"} +{"Time":"2026-10-09T10:39:54.8447321+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:003f6b30dfd6756f74d3b844aca973c833257b2937de75e1730da00892331d92 capability=core.http.request operation=request status=failed error=EFFECT_QUEUE_FULL\n"} +{"Time":"2026-10-09T10:39:54.865359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate","Output":"--- PASS: TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate (0.02s)\n"} +{"Time":"2026-10-09T10:39:54.865359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectQueueFullOnAntennaAfterPreviewGate","Elapsed":0.02} +{"Time":"2026-10-09T10:39:54.865359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure"} +{"Time":"2026-10-09T10:39:54.865359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure","Output":"=== RUN TestHost_HTTPEffectMissingDependenciesCompletesFailure\n"} +{"Time":"2026-10-09T10:39:54.865359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent"} +{"Time":"2026-10-09T10:39:54.865359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent","Output":"=== RUN TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent\n"} +{"Time":"2026-10-09T10:39:54.8664439+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:93c496198a6fb65142ac9f2147836f07f9904530b5d6f42aa376792524fa4db0 capability=core.http.request operation=request status=failed error=\"EFFECT_PROVIDER_UNAVAILABLE: HTTP effect dependencies are not configured\"\n"} +{"Time":"2026-10-09T10:39:54.8870449+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent","Output":"--- PASS: TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent (0.02s)\n"} +{"Time":"2026-10-09T10:39:54.8870449+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/bundle_absent","Elapsed":0.02} +{"Time":"2026-10-09T10:39:54.8870449+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent"} +{"Time":"2026-10-09T10:39:54.8870449+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent","Output":"=== RUN TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent\n"} +{"Time":"2026-10-09T10:39:54.8882008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:93c496198a6fb65142ac9f2147836f07f9904530b5d6f42aa376792524fa4db0 capability=core.http.request operation=request status=failed error=\"EFFECT_PROVIDER_UNAVAILABLE: HTTP effect dependencies are not configured\"\n"} +{"Time":"2026-10-09T10:39:54.9087451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent","Output":"--- PASS: TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent (0.02s)\n"} +{"Time":"2026-10-09T10:39:54.9087451+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/runner_absent","Elapsed":0.02} +{"Time":"2026-10-09T10:39:54.9087451+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent"} +{"Time":"2026-10-09T10:39:54.9087451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent","Output":"=== RUN TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent\n"} +{"Time":"2026-10-09T10:39:54.909931+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent","Output":"2026/10/09 10:39:54 INFO blue effect execution finished slot=on-air invocation_id=sha256:93c496198a6fb65142ac9f2147836f07f9904530b5d6f42aa376792524fa4db0 capability=core.http.request operation=request status=failed error=\"EFFECT_PROVIDER_UNAVAILABLE: HTTP effect dependencies are not configured\"\n"} +{"Time":"2026-10-09T10:39:54.9310558+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent","Output":"--- PASS: TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent (0.02s)\n"} +{"Time":"2026-10-09T10:39:54.9310558+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure/egress_absent","Elapsed":0.02} +{"Time":"2026-10-09T10:39:54.9310558+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure","Output":"--- PASS: TestHost_HTTPEffectMissingDependenciesCompletesFailure (0.07s)\n"} +{"Time":"2026-10-09T10:39:54.9310558+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestHost_HTTPEffectMissingDependenciesCompletesFailure","Elapsed":0.07} +{"Time":"2026-10-09T10:39:54.9310558+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_AcceptsWhenCapabilityServed"} +{"Time":"2026-10-09T10:39:54.9310558+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_AcceptsWhenCapabilityServed","Output":"=== RUN TestValidateProgram_AcceptsWhenCapabilityServed\n"} +{"Time":"2026-10-09T10:39:54.9325769+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_AcceptsWhenCapabilityServed","Output":"--- PASS: TestValidateProgram_AcceptsWhenCapabilityServed (0.00s)\n"} +{"Time":"2026-10-09T10:39:54.9325769+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_AcceptsWhenCapabilityServed","Elapsed":0} +{"Time":"2026-10-09T10:39:54.9325769+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesUnknownCapability"} +{"Time":"2026-10-09T10:39:54.9325769+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesUnknownCapability","Output":"=== RUN TestValidateProgram_RefusesUnknownCapability\n"} +{"Time":"2026-10-09T10:39:54.9331176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesUnknownCapability","Output":"--- PASS: TestValidateProgram_RefusesUnknownCapability (0.00s)\n"} +{"Time":"2026-10-09T10:39:54.9331176+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesUnknownCapability","Elapsed":0} +{"Time":"2026-10-09T10:39:54.9331176+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesExecutionFailure"} +{"Time":"2026-10-09T10:39:54.9331176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesExecutionFailure","Output":"=== RUN TestValidateProgram_RefusesExecutionFailure\n"} +{"Time":"2026-10-09T10:39:54.9342208+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesExecutionFailure","Output":"--- PASS: TestValidateProgram_RefusesExecutionFailure (0.00s)\n"} +{"Time":"2026-10-09T10:39:54.9342208+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_RefusesExecutionFailure","Elapsed":0} +{"Time":"2026-10-09T10:39:54.9342208+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverTouchesHostSlots"} +{"Time":"2026-10-09T10:39:54.9342208+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverTouchesHostSlots","Output":"=== RUN TestValidateProgram_NeverTouchesHostSlots\n"} +{"Time":"2026-10-09T10:39:54.9363046+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverTouchesHostSlots","Output":"--- PASS: TestValidateProgram_NeverTouchesHostSlots (0.00s)\n"} +{"Time":"2026-10-09T10:39:54.9368312+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Test":"TestValidateProgram_NeverTouchesHostSlots","Elapsed":0} +{"Time":"2026-10-09T10:39:54.9368312+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:54.9414052+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/bluehost\t3.183s\n"} +{"Time":"2026-10-09T10:39:54.9813782+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluehost","Elapsed":3.223} +{"Time":"2026-10-09T10:39:55.5056255+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/blueproject"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_DropsObjectValues"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_DropsObjectValues","Output":"=== RUN TestProject_DropsObjectValues\n"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_DropsObjectValues","Output":"--- PASS: TestProject_DropsObjectValues (0.00s)\n"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_DropsObjectValues","Elapsed":0} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_EmptyOutputsYieldsEmptyPatches"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_EmptyOutputsYieldsEmptyPatches","Output":"=== RUN TestProject_EmptyOutputsYieldsEmptyPatches\n"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_EmptyOutputsYieldsEmptyPatches","Output":"--- PASS: TestProject_EmptyOutputsYieldsEmptyPatches (0.00s)\n"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_EmptyOutputsYieldsEmptyPatches","Elapsed":0} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProjectNativePreservesStructuredRenderableValues"} +{"Time":"2026-10-09T10:39:55.8707607+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProjectNativePreservesStructuredRenderableValues","Output":"=== RUN TestProjectNativePreservesStructuredRenderableValues\n"} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProjectNativePreservesStructuredRenderableValues","Output":"--- PASS: TestProjectNativePreservesStructuredRenderableValues (0.00s)\n"} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProjectNativePreservesStructuredRenderableValues","Elapsed":0} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_ArrayOfArraysStillLegal"} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_ArrayOfArraysStillLegal","Output":"=== RUN TestProject_ArrayOfArraysStillLegal\n"} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_ArrayOfArraysStillLegal","Output":"--- PASS: TestProject_ArrayOfArraysStillLegal (0.00s)\n"} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Test":"TestProject_ArrayOfArraysStillLegal","Elapsed":0} +{"Time":"2026-10-09T10:39:55.8713218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:55.873353+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/blueproject\t0.367s\n"} +{"Time":"2026-10-09T10:39:55.8834675+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/blueproject","Elapsed":0.378} +{"Time":"2026-10-09T10:39:56.4150764+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/bluespike"} +{"Time":"2026-10-09T10:39:56.7784072+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Test":"TestBlueRuntimeLifecycle"} +{"Time":"2026-10-09T10:39:56.7784072+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Test":"TestBlueRuntimeLifecycle","Output":"=== RUN TestBlueRuntimeLifecycle\n"} +{"Time":"2026-10-09T10:39:56.7789329+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Test":"TestBlueRuntimeLifecycle","Output":"--- PASS: TestBlueRuntimeLifecycle (0.00s)\n"} +{"Time":"2026-10-09T10:39:56.7789329+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Test":"TestBlueRuntimeLifecycle","Elapsed":0} +{"Time":"2026-10-09T10:39:56.7789329+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:56.7814833+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/bluespike\t0.366s\n"} +{"Time":"2026-10-09T10:39:56.7945626+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluespike","Elapsed":0.379} +{"Time":"2026-10-09T10:39:57.8550322+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/bluewire"} +{"Time":"2026-10-09T10:39:58.7101978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestProjectionDigest_MatchesMarshalAndKeepsRetainedBuffer"} +{"Time":"2026-10-09T10:39:58.7101978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestProjectionDigest_MatchesMarshalAndKeepsRetainedBuffer","Output":"=== RUN TestProjectionDigest_MatchesMarshalAndKeepsRetainedBuffer\n"} +{"Time":"2026-10-09T10:39:58.7101978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestProjectionDigest_MatchesMarshalAndKeepsRetainedBuffer","Output":"--- PASS: TestProjectionDigest_MatchesMarshalAndKeepsRetainedBuffer (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestProjectionDigest_MatchesMarshalAndKeepsRetainedBuffer","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_ForwardsDelta"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_ForwardsDelta","Output":"=== RUN TestBridge_StepOnce_ForwardsDelta\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_ForwardsDelta","Output":"--- PASS: TestBridge_StepOnce_ForwardsDelta (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_ForwardsDelta","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_InitialStepIsDistinctFromPeriodicTick"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_InitialStepIsDistinctFromPeriodicTick","Output":"=== RUN TestBridge_InitialStepIsDistinctFromPeriodicTick\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_InitialStepIsDistinctFromPeriodicTick","Output":"--- PASS: TestBridge_InitialStepIsDistinctFromPeriodicTick (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_InitialStepIsDistinctFromPeriodicTick","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_ForwardsImmediateOperatorMutation"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_ForwardsImmediateOperatorMutation","Output":"=== RUN TestBridge_ForwardResult_ForwardsImmediateOperatorMutation\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_ForwardsImmediateOperatorMutation","Output":"--- PASS: TestBridge_ForwardResult_ForwardsImmediateOperatorMutation (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_ForwardsImmediateOperatorMutation","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_LogsSuccessfulForward"} +{"Time":"2026-10-09T10:39:58.7107822+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_LogsSuccessfulForward","Output":"=== RUN TestBridge_StepOnce_LogsSuccessfulForward\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_LogsSuccessfulForward","Output":"--- PASS: TestBridge_StepOnce_LogsSuccessfulForward (0.04s)\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_LogsSuccessfulForward","Elapsed":0.04} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogWithoutLogger"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogWithoutLogger","Output":"=== RUN TestBridge_StepOnce_NoLogWithoutLogger\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogWithoutLogger","Output":"--- PASS: TestBridge_StepOnce_NoLogWithoutLogger (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogWithoutLogger","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogOnEmptyOrDuplicateProjection"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogOnEmptyOrDuplicateProjection","Output":"=== RUN TestBridge_StepOnce_NoLogOnEmptyOrDuplicateProjection\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogOnEmptyOrDuplicateProjection","Output":"--- PASS: TestBridge_StepOnce_NoLogOnEmptyOrDuplicateProjection (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_NoLogOnEmptyOrDuplicateProjection","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_NoLogOnDeduplicatedReplay"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_NoLogOnDeduplicatedReplay","Output":"=== RUN TestBridge_TickOnce_NoLogOnDeduplicatedReplay\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_NoLogOnDeduplicatedReplay","Output":"--- PASS: TestBridge_TickOnce_NoLogOnDeduplicatedReplay (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_NoLogOnDeduplicatedReplay","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_EmptyProjectionIsNoOp"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_EmptyProjectionIsNoOp","Output":"=== RUN TestBridge_StepOnce_EmptyProjectionIsNoOp\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_EmptyProjectionIsNoOp","Output":"--- PASS: TestBridge_StepOnce_EmptyProjectionIsNoOp (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_EmptyProjectionIsNoOp","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_PropagatesError"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_PropagatesError","Output":"=== RUN TestBridge_StepOnce_PropagatesError\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_PropagatesError","Output":"--- PASS: TestBridge_StepOnce_PropagatesError (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_PropagatesError","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_UsesInjectedClockAndDeterministicProjection"} +{"Time":"2026-10-09T10:39:58.7457821+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_UsesInjectedClockAndDeterministicProjection","Output":"=== RUN TestBridge_TickOnce_UsesInjectedClockAndDeterministicProjection\n"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_UsesInjectedClockAndDeterministicProjection","Output":"--- PASS: TestBridge_TickOnce_UsesInjectedClockAndDeterministicProjection (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_TickOnce_UsesInjectedClockAndDeterministicProjection","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_RejectsStaleNonIdenticalRuntimeSequence"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_RejectsStaleNonIdenticalRuntimeSequence","Output":"=== RUN TestBridge_StepOnce_RejectsStaleNonIdenticalRuntimeSequence\n"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_RejectsStaleNonIdenticalRuntimeSequence","Output":"--- PASS: TestBridge_StepOnce_RejectsStaleNonIdenticalRuntimeSequence (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_StepOnce_RejectsStaleNonIdenticalRuntimeSequence","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_RuntimeSequenceZeroAfterSeedForwardsChangedProjection"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_RuntimeSequenceZeroAfterSeedForwardsChangedProjection","Output":"=== RUN TestBridge_ForwardResult_RuntimeSequenceZeroAfterSeedForwardsChangedProjection\n"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_RuntimeSequenceZeroAfterSeedForwardsChangedProjection","Output":"--- PASS: TestBridge_ForwardResult_RuntimeSequenceZeroAfterSeedForwardsChangedProjection (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_ForwardResult_RuntimeSequenceZeroAfterSeedForwardsChangedProjection","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestNewBridge_TickOnceUsesHostScheduler"} +{"Time":"2026-10-09T10:39:58.7462927+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestNewBridge_TickOnceUsesHostScheduler","Output":"=== RUN TestNewBridge_TickOnceUsesHostScheduler\n"} +{"Time":"2026-10-09T10:39:58.7468225+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestNewBridge_TickOnceUsesHostScheduler","Output":"--- PASS: TestNewBridge_TickOnceUsesHostScheduler (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.7468225+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestNewBridge_TickOnceUsesHostScheduler","Elapsed":0} +{"Time":"2026-10-09T10:39:58.7468225+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_StepsUntilCancelled"} +{"Time":"2026-10-09T10:39:58.7468225+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_StepsUntilCancelled","Output":"=== RUN TestBridge_Run_StepsUntilCancelled\n"} +{"Time":"2026-10-09T10:39:58.7694237+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_StepsUntilCancelled","Output":"--- PASS: TestBridge_Run_StepsUntilCancelled (0.02s)\n"} +{"Time":"2026-10-09T10:39:58.7694237+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_StepsUntilCancelled","Elapsed":0.02} +{"Time":"2026-10-09T10:39:58.7694237+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_ReportsErrorsButKeepsGoing"} +{"Time":"2026-10-09T10:39:58.7694237+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_ReportsErrorsButKeepsGoing","Output":"=== RUN TestBridge_Run_ReportsErrorsButKeepsGoing\n"} +{"Time":"2026-10-09T10:39:58.7913726+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_ReportsErrorsButKeepsGoing","Output":"--- PASS: TestBridge_Run_ReportsErrorsButKeepsGoing (0.02s)\n"} +{"Time":"2026-10-09T10:39:58.7913726+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_Run_ReportsErrorsButKeepsGoing","Elapsed":0.02} +{"Time":"2026-10-09T10:39:58.7913726+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_RunWaitsForStartupGate"} +{"Time":"2026-10-09T10:39:58.7913726+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_RunWaitsForStartupGate","Output":"=== RUN TestBridge_RunWaitsForStartupGate\n"} +{"Time":"2026-10-09T10:39:58.8164649+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_RunWaitsForStartupGate","Output":"--- PASS: TestBridge_RunWaitsForStartupGate (0.03s)\n"} +{"Time":"2026-10-09T10:39:58.8164649+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestBridge_RunWaitsForStartupGate","Elapsed":0.03} +{"Time":"2026-10-09T10:39:58.8164649+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartThenStop"} +{"Time":"2026-10-09T10:39:58.8164649+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartThenStop","Output":"=== RUN TestRegistry_StartThenStop\n"} +{"Time":"2026-10-09T10:39:58.8675692+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartThenStop","Output":"--- PASS: TestRegistry_StartThenStop (0.05s)\n"} +{"Time":"2026-10-09T10:39:58.8675692+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartThenStop","Elapsed":0.05} +{"Time":"2026-10-09T10:39:58.8675692+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartReplacesPreviousBridgeForSameSlot"} +{"Time":"2026-10-09T10:39:58.8675692+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartReplacesPreviousBridgeForSameSlot","Output":"=== RUN TestRegistry_StartReplacesPreviousBridgeForSameSlot\n"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartReplacesPreviousBridgeForSameSlot","Output":"--- PASS: TestRegistry_StartReplacesPreviousBridgeForSameSlot (0.05s)\n"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StartReplacesPreviousBridgeForSameSlot","Elapsed":0.05} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopOnEmptySlotIsNoOp"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopOnEmptySlotIsNoOp","Output":"=== RUN TestRegistry_StopOnEmptySlotIsNoOp\n"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopOnEmptySlotIsNoOp","Output":"--- PASS: TestRegistry_StopOnEmptySlotIsNoOp (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopOnEmptySlotIsNoOp","Elapsed":0} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopAll"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopAll","Output":"=== RUN TestRegistry_StopAll\n"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopAll","Output":"--- PASS: TestRegistry_StopAll (0.00s)\n"} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Test":"TestRegistry_StopAll","Elapsed":0} +{"Time":"2026-10-09T10:39:58.9134725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Output":"PASS\n"} +{"Time":"2026-10-09T10:39:58.9171688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/bluewire\t1.060s\n"} +{"Time":"2026-10-09T10:39:58.9298384+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/bluewire","Elapsed":1.075} +{"Time":"2026-10-09T10:39:58.9330162+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/buildinfo"} +{"Time":"2026-10-09T10:39:58.9330162+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/buildinfo","Output":"? \tgithub.com/ZabLaboratory/Orion/internal/buildinfo\t[no test files]\n"} +{"Time":"2026-10-09T10:39:58.9330162+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/buildinfo","Elapsed":0} +{"Time":"2026-10-09T10:39:58.9330162+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/canonical"} +{"Time":"2026-10-09T10:39:58.9330162+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/canonical","Output":"? \tgithub.com/ZabLaboratory/Orion/internal/canonical\t[no test files]\n"} +{"Time":"2026-10-09T10:39:58.9330162+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/canonical","Elapsed":0} +{"Time":"2026-10-09T10:40:00.5282818+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/compiler"} +{"Time":"2026-10-09T10:40:01.3256085+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_Nominal_Passes"} +{"Time":"2026-10-09T10:40:01.3256085+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_Nominal_Passes","Output":"=== RUN TestGate_Nominal_Passes\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_Nominal_Passes","Output":"--- PASS: TestGate_Nominal_Passes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_Nominal_Passes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NoAssets_NoRemoteSrc_Passes"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NoAssets_NoRemoteSrc_Passes","Output":"=== RUN TestGate_NoAssets_NoRemoteSrc_Passes\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NoAssets_NoRemoteSrc_Passes","Output":"--- PASS: TestGate_NoAssets_NoRemoteSrc_Passes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NoAssets_NoRemoteSrc_Passes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcHostNotAllowed"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcHostNotAllowed","Output":"=== RUN TestGate_SrcHostNotAllowed\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcHostNotAllowed","Output":"--- PASS: TestGate_SrcHostNotAllowed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcHostNotAllowed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcSubstringHostNotAllowed"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcSubstringHostNotAllowed","Output":"=== RUN TestGate_SrcSubstringHostNotAllowed\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcSubstringHostNotAllowed","Output":"--- PASS: TestGate_SrcSubstringHostNotAllowed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_SrcSubstringHostNotAllowed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_HostileScheme"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_HostileScheme","Output":"=== RUN TestGate_HostileScheme\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_HostileScheme","Output":"--- PASS: TestGate_HostileScheme (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_HostileScheme","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_EmptyAllowlistDeniesRemote"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_EmptyAllowlistDeniesRemote","Output":"=== RUN TestGate_EmptyAllowlistDeniesRemote\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_EmptyAllowlistDeniesRemote","Output":"--- PASS: TestGate_EmptyAllowlistDeniesRemote (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_EmptyAllowlistDeniesRemote","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_RejectedURLNeverEchoed"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_RejectedURLNeverEchoed","Output":"=== RUN TestGate_RejectedURLNeverEchoed\n"} +{"Time":"2026-10-09T10:40:01.3261245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_RejectedURLNeverEchoed","Output":"--- PASS: TestGate_RejectedURLNeverEchoed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_RejectedURLNeverEchoed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BlendModeHostile"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BlendModeHostile","Output":"=== RUN TestGate_BlendModeHostile\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BlendModeHostile","Output":"--- PASS: TestGate_BlendModeHostile (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BlendModeHostile","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_FillBlendOutOfEnum"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_FillBlendOutOfEnum","Output":"=== RUN TestGate_FillBlendOutOfEnum\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_FillBlendOutOfEnum","Output":"--- PASS: TestGate_FillBlendOutOfEnum (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_FillBlendOutOfEnum","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_ObjectFitOutOfEnum"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_ObjectFitOutOfEnum","Output":"=== RUN TestGate_ObjectFitOutOfEnum\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_ObjectFitOutOfEnum","Output":"--- PASS: TestGate_ObjectFitOutOfEnum (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_ObjectFitOutOfEnum","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskEnumsOutOfList"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskEnumsOutOfList","Output":"=== RUN TestGate_MaskEnumsOutOfList\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskEnumsOutOfList","Output":"--- PASS: TestGate_MaskEnumsOutOfList (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskEnumsOutOfList","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DanglingMaskRef"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DanglingMaskRef","Output":"=== RUN TestGate_DanglingMaskRef\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DanglingMaskRef","Output":"--- PASS: TestGate_DanglingMaskRef (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DanglingMaskRef","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskCycle"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskCycle","Output":"=== RUN TestGate_MaskCycle\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskCycle","Output":"--- PASS: TestGate_MaskCycle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskCycle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskSelfCycle"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskSelfCycle","Output":"=== RUN TestGate_MaskSelfCycle\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskSelfCycle","Output":"--- PASS: TestGate_MaskSelfCycle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskSelfCycle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskImageSourceGated"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskImageSourceGated","Output":"=== RUN TestGate_MaskImageSourceGated\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskImageSourceGated","Output":"--- PASS: TestGate_MaskImageSourceGated (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MaskImageSourceGated","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetBlendNodes"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetBlendNodes","Output":"=== RUN TestGate_BudgetBlendNodes\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetBlendNodes","Output":"--- PASS: TestGate_BudgetBlendNodes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetBlendNodes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetImageNodes"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetImageNodes","Output":"=== RUN TestGate_BudgetImageNodes\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetImageNodes","Output":"--- PASS: TestGate_BudgetImageNodes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetImageNodes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetTotalNodes"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetTotalNodes","Output":"=== RUN TestGate_BudgetTotalNodes\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetTotalNodes","Output":"--- PASS: TestGate_BudgetTotalNodes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetTotalNodes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetMaskDepth"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetMaskDepth","Output":"=== RUN TestGate_BudgetMaskDepth\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetMaskDepth","Output":"--- PASS: TestGate_BudgetMaskDepth (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_BudgetMaskDepth","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DeepAcyclicMaskUnderCapPasses"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DeepAcyclicMaskUnderCapPasses","Output":"=== RUN TestGate_DeepAcyclicMaskUnderCapPasses\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DeepAcyclicMaskUnderCapPasses","Output":"--- PASS: TestGate_DeepAcyclicMaskUnderCapPasses (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_DeepAcyclicMaskUnderCapPasses","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MalformedLayout"} +{"Time":"2026-10-09T10:40:01.3266456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MalformedLayout","Output":"=== RUN TestGate_MalformedLayout\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MalformedLayout","Output":"--- PASS: TestGate_MalformedLayout (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_MalformedLayout","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NilBundle"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NilBundle","Output":"=== RUN TestGate_NilBundle\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NilBundle","Output":"--- PASS: TestGate_NilBundle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGate_NilBundle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CanvasLayoutShape"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CanvasLayoutShape","Output":"=== RUN TestBundledFetcher_CanvasLayoutShape\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CanvasLayoutShape","Output":"--- PASS: TestBundledFetcher_CanvasLayoutShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CanvasLayoutShape","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_BlueprintGraphShape"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_BlueprintGraphShape","Output":"=== RUN TestBundledFetcher_BlueprintGraphShape\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_BlueprintGraphShape","Output":"--- PASS: TestBundledFetcher_BlueprintGraphShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_BlueprintGraphShape","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ResolvedGraphShape"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ResolvedGraphShape","Output":"=== RUN TestBundledFetcher_ResolvedGraphShape\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ResolvedGraphShape","Output":"--- PASS: TestBundledFetcher_ResolvedGraphShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ResolvedGraphShape","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ServesFrozenLayout"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ServesFrozenLayout","Output":"=== RUN TestBundledFetcher_ServesFrozenLayout\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ServesFrozenLayout","Output":"--- PASS: TestBundledFetcher_ServesFrozenLayout (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ServesFrozenLayout","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CollapsesBlueprintTwoCall"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CollapsesBlueprintTwoCall","Output":"=== RUN TestBundledFetcher_CollapsesBlueprintTwoCall\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CollapsesBlueprintTwoCall","Output":"--- PASS: TestBundledFetcher_CollapsesBlueprintTwoCall (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_CollapsesBlueprintTwoCall","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_PinnedResolvedGraph"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_PinnedResolvedGraph","Output":"=== RUN TestBundledFetcher_PinnedResolvedGraph\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_PinnedResolvedGraph","Output":"--- PASS: TestBundledFetcher_PinnedResolvedGraph (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_PinnedResolvedGraph","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissingPinnedFailsClosed"} +{"Time":"2026-10-09T10:40:01.3271709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissingPinnedFailsClosed","Output":"=== RUN TestBundledFetcher_MissingPinnedFailsClosed\n"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissingPinnedFailsClosed","Output":"--- PASS: TestBundledFetcher_MissingPinnedFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissingPinnedFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissIsHardError"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissIsHardError","Output":"=== RUN TestBundledFetcher_MissIsHardError\n"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissIsHardError","Output":"--- PASS: TestBundledFetcher_MissIsHardError (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_MissIsHardError","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ComputeManifestVerbatim"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ComputeManifestVerbatim","Output":"=== RUN TestBundledFetcher_ComputeManifestVerbatim\n"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ComputeManifestVerbatim","Output":"--- PASS: TestBundledFetcher_ComputeManifestVerbatim (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBundledFetcher_ComputeManifestVerbatim","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle"} +{"Time":"2026-10-09T10:40:01.3276811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle","Output":"=== RUN TestLoadSceneBundle\n"} +{"Time":"2026-10-09T10:40:01.3360937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle","Output":"--- PASS: TestLoadSceneBundle (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.3360937+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.3360937+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle_Missing"} +{"Time":"2026-10-09T10:40:01.3360937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle_Missing","Output":"=== RUN TestLoadSceneBundle_Missing\n"} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle_Missing","Output":"--- PASS: TestLoadSceneBundle_Missing (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLoadSceneBundle_Missing","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_MaterialisesDataTranche"} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_MaterialisesDataTranche","Output":"=== RUN TestCompileBlueprintRule_MaterialisesDataTranche\n"} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_MaterialisesDataTranche","Output":"--- PASS: TestCompileBlueprintRule_MaterialisesDataTranche (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_MaterialisesDataTranche","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ParityWithScenePath"} +{"Time":"2026-10-09T10:40:01.3376559+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ParityWithScenePath","Output":"=== RUN TestCompileBlueprintRule_ParityWithScenePath\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ParityWithScenePath","Output":"--- PASS: TestCompileBlueprintRule_ParityWithScenePath (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ParityWithScenePath","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_RejectsPureDataflow"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_RejectsPureDataflow","Output":"=== RUN TestCompileBlueprintRule_RejectsPureDataflow\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_RejectsPureDataflow","Output":"--- PASS: TestCompileBlueprintRule_RejectsPureDataflow (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_RejectsPureDataflow","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ManifestFetchFails"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ManifestFetchFails","Output":"=== RUN TestCompileBlueprintRule_ManifestFetchFails\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ManifestFetchFails","Output":"--- PASS: TestCompileBlueprintRule_ManifestFetchFails (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileBlueprintRule_ManifestFetchFails","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_OnStartProgram"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_OnStartProgram","Output":"=== RUN TestCompileExecPrograms_OnStartProgram\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_OnStartProgram","Output":"--- PASS: TestCompileExecPrograms_OnStartProgram (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_OnStartProgram","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesSeedDefaults"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesSeedDefaults","Output":"=== RUN TestCompileExecPrograms_VariablesSeedDefaults\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesSeedDefaults","Output":"--- PASS: TestCompileExecPrograms_VariablesSeedDefaults (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesSeedDefaults","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesKeyNamespaced"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesKeyNamespaced","Output":"=== RUN TestCompileExecPrograms_VariablesKeyNamespaced\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesKeyNamespaced","Output":"--- PASS: TestCompileExecPrograms_VariablesKeyNamespaced (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_VariablesKeyNamespaced","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsReference"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsReference","Output":"=== RUN TestCompileExecPrograms_RejectsReference\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsReference","Output":"--- PASS: TestCompileExecPrograms_RejectsReference (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsReference","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_DanglingTarget"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_DanglingTarget","Output":"=== RUN TestCompileExecPrograms_DanglingTarget\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_DanglingTarget","Output":"--- PASS: TestCompileExecPrograms_DanglingTarget (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_DanglingTarget","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_PureDataflowNoProgram"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_PureDataflowNoProgram","Output":"=== RUN TestCompileExecPrograms_PureDataflowNoProgram\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_PureDataflowNoProgram","Output":"--- PASS: TestCompileExecPrograms_PureDataflowNoProgram (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_PureDataflowNoProgram","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsUnknownUnwiredNode"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsUnknownUnwiredNode","Output":"=== RUN TestCompileExecPrograms_RejectsUnknownUnwiredNode\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsUnknownUnwiredNode","Output":"--- PASS: TestCompileExecPrograms_RejectsUnknownUnwiredNode (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileExecPrograms_RejectsUnknownUnwiredNode","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_BackCompat_SingularEqualsEmptyKeyList"} +{"Time":"2026-10-09T10:40:01.3381828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_BackCompat_SingularEqualsEmptyKeyList","Output":"=== RUN TestCompile_BackCompat_SingularEqualsEmptyKeyList\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_BackCompat_SingularEqualsEmptyKeyList","Output":"--- PASS: TestCompile_BackCompat_SingularEqualsEmptyKeyList (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_BackCompat_SingularEqualsEmptyKeyList","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_LeafPathsPrefixed"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_LeafPathsPrefixed","Output":"=== RUN TestCompile_NBlueprints_LeafPathsPrefixed\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_LeafPathsPrefixed","Output":"--- PASS: TestCompile_NBlueprints_LeafPathsPrefixed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_LeafPathsPrefixed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_OrderIndependentHash"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_OrderIndependentHash","Output":"=== RUN TestCompile_NBlueprints_OrderIndependentHash\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_OrderIndependentHash","Output":"--- PASS: TestCompile_NBlueprints_OrderIndependentHash (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_OrderIndependentHash","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Conflict"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Conflict","Output":"=== RUN TestNormalizeBlueprints_Conflict\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Conflict","Output":"--- PASS: TestNormalizeBlueprints_Conflict (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Conflict","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table","Output":"=== RUN TestNormalizeBlueprints_Table\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/empty_→_blueprint-free"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/empty_→_blueprint-free","Output":"=== RUN TestNormalizeBlueprints_Table/empty_→_blueprint-free\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/empty_→_blueprint-free","Output":"--- PASS: TestNormalizeBlueprints_Table/empty_→_blueprint-free (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/empty_→_blueprint-free","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/none_sentinel_→_blueprint-free"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/none_sentinel_→_blueprint-free","Output":"=== RUN TestNormalizeBlueprints_Table/none_sentinel_→_blueprint-free\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/none_sentinel_→_blueprint-free","Output":"--- PASS: TestNormalizeBlueprints_Table/none_sentinel_→_blueprint-free (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/none_sentinel_→_blueprint-free","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/legacy_single_→_key-empty_list"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/legacy_single_→_key-empty_list","Output":"=== RUN TestNormalizeBlueprints_Table/legacy_single_→_key-empty_list\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/legacy_single_→_key-empty_list","Output":"--- PASS: TestNormalizeBlueprints_Table/legacy_single_→_key-empty_list (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3387028+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/legacy_single_→_key-empty_list","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/plural_sorted_by_key"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/plural_sorted_by_key","Output":"=== RUN TestNormalizeBlueprints_Table/plural_sorted_by_key\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/plural_sorted_by_key","Output":"--- PASS: TestNormalizeBlueprints_Table/plural_sorted_by_key (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table/plural_sorted_by_key","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table","Output":"--- PASS: TestNormalizeBlueprints_Table (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestNormalizeBlueprints_Table","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DuplicateBlueprintKey"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DuplicateBlueprintKey","Output":"=== RUN TestCompile_DuplicateBlueprintKey\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DuplicateBlueprintKey","Output":"--- PASS: TestCompile_DuplicateBlueprintKey (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DuplicateBlueprintKey","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownBlueprintKey"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownBlueprintKey","Output":"=== RUN TestCompile_UnknownBlueprintKey\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownBlueprintKey","Output":"--- PASS: TestCompile_UnknownBlueprintKey (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownBlueprintKey","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeclaredBlueprintKeyBindingResolves"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeclaredBlueprintKeyBindingResolves","Output":"=== RUN TestCompile_DeclaredBlueprintKeyBindingResolves\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeclaredBlueprintKeyBindingResolves","Output":"--- PASS: TestCompile_DeclaredBlueprintKeyBindingResolves (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeclaredBlueprintKeyBindingResolves","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite","Output":"=== RUN TestCompile_VariableGetLeafMatchesSetWrite\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/legacy_empty_key"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/legacy_empty_key","Output":"=== RUN TestCompile_VariableGetLeafMatchesSetWrite/legacy_empty_key\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/legacy_empty_key","Output":"--- PASS: TestCompile_VariableGetLeafMatchesSetWrite/legacy_empty_key (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/legacy_empty_key","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/keyed_blueprint"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/keyed_blueprint","Output":"=== RUN TestCompile_VariableGetLeafMatchesSetWrite/keyed_blueprint\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/keyed_blueprint","Output":"--- PASS: TestCompile_VariableGetLeafMatchesSetWrite/keyed_blueprint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite/keyed_blueprint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite","Output":"--- PASS: TestCompile_VariableGetLeafMatchesSetWrite (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_VariableGetLeafMatchesSetWrite","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_ImpureServedExecPartitioned"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_ImpureServedExecPartitioned","Output":"=== RUN TestCompile_NBlueprints_ImpureServedExecPartitioned\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_ImpureServedExecPartitioned","Output":"--- PASS: TestCompile_NBlueprints_ImpureServedExecPartitioned (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NBlueprints_ImpureServedExecPartitioned","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold_AllCaps"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold_AllCaps","Output":"=== RUN TestCompile_PlatformChannelCasefold_AllCaps\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold_AllCaps","Output":"--- PASS: TestCompile_PlatformChannelCasefold_AllCaps (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold_AllCaps","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases","Output":"=== RUN TestCompile_PlatformChannelDiagnostics_ExtraCases\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/space_in_channel"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/space_in_channel","Output":"=== RUN TestCompile_PlatformChannelDiagnostics_ExtraCases/space_in_channel\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/space_in_channel","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics_ExtraCases/space_in_channel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/space_in_channel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/json_null_channel"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/json_null_channel","Output":"=== RUN TestCompile_PlatformChannelDiagnostics_ExtraCases/json_null_channel\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/json_null_channel","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics_ExtraCases/json_null_channel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/json_null_channel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/unicode_with_space"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/unicode_with_space","Output":"=== RUN TestCompile_PlatformChannelDiagnostics_ExtraCases/unicode_with_space\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/unicode_with_space","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics_ExtraCases/unicode_with_space (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases/unicode_with_space","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics_ExtraCases (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics_ExtraCases","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_InjectionPrevented"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_InjectionPrevented","Output":"=== RUN TestCompile_PlatformLeaf_InjectionPrevented\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_InjectionPrevented","Output":"--- PASS: TestCompile_PlatformLeaf_InjectionPrevented (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_InjectionPrevented","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_All14Events"} +{"Time":"2026-10-09T10:40:01.3392273+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_All14Events","Output":"=== RUN TestCompile_PlatformLeaf_All14Events\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_All14Events","Output":"--- PASS: TestCompile_PlatformLeaf_All14Events (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeaf_All14Events","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold","Output":"=== RUN TestCompile_PlatformChannelCasefold\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold","Output":"--- PASS: TestCompile_PlatformChannelCasefold (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelCasefold","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics","Output":"=== RUN TestCompile_PlatformChannelDiagnostics\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/absent_config.channel"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/absent_config.channel","Output":"=== RUN TestCompile_PlatformChannelDiagnostics/absent_config.channel\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/absent_config.channel","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics/absent_config.channel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/absent_config.channel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/empty_channel"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/empty_channel","Output":"=== RUN TestCompile_PlatformChannelDiagnostics/empty_channel\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/empty_channel","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics/empty_channel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/empty_channel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/hyphen_rejected_not_rewritten"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/hyphen_rejected_not_rewritten","Output":"=== RUN TestCompile_PlatformChannelDiagnostics/hyphen_rejected_not_rewritten\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/hyphen_rejected_not_rewritten","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics/hyphen_rejected_not_rewritten (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/hyphen_rejected_not_rewritten","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/dot_rejected_(path_injection)"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/dot_rejected_(path_injection)","Output":"=== RUN TestCompile_PlatformChannelDiagnostics/dot_rejected_(path_injection)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/dot_rejected_(path_injection)","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics/dot_rejected_(path_injection) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/dot_rejected_(path_injection)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-ascii_rejected"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-ascii_rejected","Output":"=== RUN TestCompile_PlatformChannelDiagnostics/non-ascii_rejected\n"} +{"Time":"2026-10-09T10:40:01.3397469+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-ascii_rejected","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics/non-ascii_rejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-ascii_rejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-string_channel"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-string_channel","Output":"=== RUN TestCompile_PlatformChannelDiagnostics/non-string_channel\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-string_channel","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics/non-string_channel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics/non-string_channel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics","Output":"--- PASS: TestCompile_PlatformChannelDiagnostics (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformChannelDiagnostics","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeafNotKeyPrefixed"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeafNotKeyPrefixed","Output":"=== RUN TestCompile_PlatformLeafNotKeyPrefixed\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeafNotKeyPrefixed","Output":"--- PASS: TestCompile_PlatformLeafNotKeyPrefixed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformLeafNotKeyPrefixed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformBindingDeduped"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformBindingDeduped","Output":"=== RUN TestCompile_PlatformBindingDeduped\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformBindingDeduped","Output":"--- PASS: TestCompile_PlatformBindingDeduped (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_PlatformBindingDeduped","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HappyPath"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HappyPath","Output":"=== RUN TestCompile_HappyPath\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HappyPath","Output":"--- PASS: TestCompile_HappyPath (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HappyPath","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CyclicComponent"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CyclicComponent","Output":"=== RUN TestCompile_CyclicComponent\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CyclicComponent","Output":"--- PASS: TestCompile_CyclicComponent (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CyclicComponent","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ImpureDataCompute_Accepted"} +{"Time":"2026-10-09T10:40:01.3402597+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ImpureDataCompute_Accepted","Output":"=== RUN TestCompile_ImpureDataCompute_Accepted\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ImpureDataCompute_Accepted","Output":"--- PASS: TestCompile_ImpureDataCompute_Accepted (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ImpureDataCompute_Accepted","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ExecPinNode_RoutedToProgram"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ExecPinNode_RoutedToProgram","Output":"=== RUN TestCompile_ExecPinNode_RoutedToProgram\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ExecPinNode_RoutedToProgram","Output":"--- PASS: TestCompile_ExecPinNode_RoutedToProgram (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_ExecPinNode_RoutedToProgram","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownComputeNode"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownComputeNode","Output":"=== RUN TestCompile_UnknownComputeNode\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownComputeNode","Output":"--- PASS: TestCompile_UnknownComputeNode (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_UnknownComputeNode","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeterministicHash"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeterministicHash","Output":"=== RUN TestCompile_DeterministicHash\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeterministicHash","Output":"--- PASS: TestCompile_DeterministicHash (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DeterministicHash","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint","Output":"=== RUN TestCompile_NoBlueprint\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/empty_target_sentinel"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/empty_target_sentinel","Output":"=== RUN TestCompile_NoBlueprint/empty_target_sentinel\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/empty_target_sentinel","Output":"--- PASS: TestCompile_NoBlueprint/empty_target_sentinel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/empty_target_sentinel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/legacy_none_sentinel"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/legacy_none_sentinel","Output":"=== RUN TestCompile_NoBlueprint/legacy_none_sentinel\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/legacy_none_sentinel","Output":"--- PASS: TestCompile_NoBlueprint/legacy_none_sentinel (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint/legacy_none_sentinel","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint","Output":"--- PASS: TestCompile_NoBlueprint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NoBlueprint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HoistsOperatorInputs"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HoistsOperatorInputs","Output":"=== RUN TestCompile_HoistsOperatorInputs\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HoistsOperatorInputs","Output":"--- PASS: TestCompile_HoistsOperatorInputs (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_HoistsOperatorInputs","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_SeedsOperatorInputDefault"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_SeedsOperatorInputDefault","Output":"=== RUN TestCompile_SeedsOperatorInputDefault\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_SeedsOperatorInputDefault","Output":"--- PASS: TestCompile_SeedsOperatorInputDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_SeedsOperatorInputDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OperatorInputNoDefaultUnseeded"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OperatorInputNoDefaultUnseeded","Output":"=== RUN TestCompile_OperatorInputNoDefaultUnseeded\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OperatorInputNoDefaultUnseeded","Output":"--- PASS: TestCompile_OperatorInputNoDefaultUnseeded (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OperatorInputNoDefaultUnseeded","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_BodyContract"} +{"Time":"2026-10-09T10:40:01.3407843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_BodyContract","Output":"=== RUN TestBlueprintNode_BodyContract\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_BodyContract","Output":"--- PASS: TestBlueprintNode_BodyContract (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_BodyContract","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_LiteralSeedsDefault"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_LiteralSeedsDefault","Output":"=== RUN TestBlueprintNode_LiteralSeedsDefault\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_LiteralSeedsDefault","Output":"--- PASS: TestBlueprintNode_LiteralSeedsDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_LiteralSeedsDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DBAtomicsCompileInMainGraph"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DBAtomicsCompileInMainGraph","Output":"=== RUN TestCompile_DBAtomicsCompileInMainGraph\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DBAtomicsCompileInMainGraph","Output":"--- PASS: TestCompile_DBAtomicsCompileInMainGraph (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_DBAtomicsCompileInMainGraph","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ConstantFolded"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ConstantFolded","Output":"=== RUN TestCompile_TopLevelVariable_ConstantFolded\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ConstantFolded","Output":"--- PASS: TestCompile_TopLevelVariable_ConstantFolded (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ConstantFolded","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ValuelessNotFolded"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ValuelessNotFolded","Output":"=== RUN TestCompile_TopLevelVariable_ValuelessNotFolded\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ValuelessNotFolded","Output":"--- PASS: TestCompile_TopLevelVariable_ValuelessNotFolded (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_TopLevelVariable_ValuelessNotFolded","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_UndeclaredRejected"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_UndeclaredRejected","Output":"=== RUN TestResolveEgress_UndeclaredRejected\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_UndeclaredRejected","Output":"--- PASS: TestResolveEgress_UndeclaredRejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_UndeclaredRejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_NilRegistryFailsClosed"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_NilRegistryFailsClosed","Output":"=== RUN TestResolveEgress_NilRegistryFailsClosed\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_NilRegistryFailsClosed","Output":"--- PASS: TestResolveEgress_NilRegistryFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_NilRegistryFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_DeclaredBakesRoute"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_DeclaredBakesRoute","Output":"=== RUN TestResolveEgress_DeclaredBakesRoute\n"} +{"Time":"2026-10-09T10:40:01.3413021+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_DeclaredBakesRoute","Output":"--- PASS: TestResolveEgress_DeclaredBakesRoute (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_DeclaredBakesRoute","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_AssignSlotBakesRoute"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_AssignSlotBakesRoute","Output":"=== RUN TestResolveEgress_AssignSlotBakesRoute\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_AssignSlotBakesRoute","Output":"--- PASS: TestResolveEgress_AssignSlotBakesRoute (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveEgress_AssignSlotBakesRoute","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBuildEgressRegistry_ParsesManifestEnvelope"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBuildEgressRegistry_ParsesManifestEnvelope","Output":"=== RUN TestBuildEgressRegistry_ParsesManifestEnvelope\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBuildEgressRegistry_ParsesManifestEnvelope","Output":"--- PASS: TestBuildEgressRegistry_ParsesManifestEnvelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBuildEgressRegistry_ParsesManifestEnvelope","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RoundTrip"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RoundTrip","Output":"=== RUN TestEmitLSML_1_2_RoundTrip\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RoundTrip","Output":"--- PASS: TestEmitLSML_1_2_RoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RetroCompat11"} +{"Time":"2026-10-09T10:40:01.3418184+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RetroCompat11","Output":"=== RUN TestEmitLSML_1_2_RetroCompat11\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RetroCompat11","Output":"--- PASS: TestEmitLSML_1_2_RetroCompat11 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_RetroCompat11","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_AssetsNeverSilentlyDropped"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_AssetsNeverSilentlyDropped","Output":"=== RUN TestEmitLSML_1_2_AssetsNeverSilentlyDropped\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_AssetsNeverSilentlyDropped","Output":"--- PASS: TestEmitLSML_1_2_AssetsNeverSilentlyDropped (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_1_2_AssetsNeverSilentlyDropped","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_K_ShapeMaskIdRoundTrip"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_K_ShapeMaskIdRoundTrip","Output":"=== RUN TestEmitLSML_K_ShapeMaskIdRoundTrip\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_K_ShapeMaskIdRoundTrip","Output":"--- PASS: TestEmitLSML_K_ShapeMaskIdRoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_K_ShapeMaskIdRoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_O_GroupMaskRoundTrip"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_O_GroupMaskRoundTrip","Output":"=== RUN TestEmitLSML_O_GroupMaskRoundTrip\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_O_GroupMaskRoundTrip","Output":"--- PASS: TestEmitLSML_O_GroupMaskRoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_O_GroupMaskRoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromCompile_CarriesAuthoringVocab"} +{"Time":"2026-10-09T10:40:01.3423486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromCompile_CarriesAuthoringVocab","Output":"=== RUN TestEmitLSML_FromCompile_CarriesAuthoringVocab\n"} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromCompile_CarriesAuthoringVocab","Output":"--- PASS: TestEmitLSML_FromCompile_CarriesAuthoringVocab (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromCompile_CarriesAuthoringVocab","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromLoweredRoot_IsRenderVocab"} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromLoweredRoot_IsRenderVocab","Output":"=== RUN TestEmitLSML_FromLoweredRoot_IsRenderVocab\n"} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromLoweredRoot_IsRenderVocab","Output":"--- PASS: TestEmitLSML_FromLoweredRoot_IsRenderVocab (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_FromLoweredRoot_IsRenderVocab","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ValidBundleShape"} +{"Time":"2026-10-09T10:40:01.3428573+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ValidBundleShape","Output":"=== RUN TestEmitLSML_ValidBundleShape\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ValidBundleShape","Output":"--- PASS: TestEmitLSML_ValidBundleShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ValidBundleShape","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_DeterministicHash"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_DeterministicHash","Output":"=== RUN TestEmitLSML_DeterministicHash\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_DeterministicHash","Output":"--- PASS: TestEmitLSML_DeterministicHash (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_DeterministicHash","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_AnimationsRideOpaque"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_AnimationsRideOpaque","Output":"=== RUN TestEmitLSML_AnimationsRideOpaque\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_AnimationsRideOpaque","Output":"--- PASS: TestEmitLSML_AnimationsRideOpaque (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_AnimationsRideOpaque","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_NoAnimationsOmitsField"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_NoAnimationsOmitsField","Output":"=== RUN TestEmitLSML_NoAnimationsOmitsField\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_NoAnimationsOmitsField","Output":"--- PASS: TestEmitLSML_NoAnimationsOmitsField (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_NoAnimationsOmitsField","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ExternalAdapters"} +{"Time":"2026-10-09T10:40:01.3433751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ExternalAdapters","Output":"=== RUN TestEmitLSML_ExternalAdapters\n"} +{"Time":"2026-10-09T10:40:01.3438954+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ExternalAdapters","Output":"--- PASS: TestEmitLSML_ExternalAdapters (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3438954+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_ExternalAdapters","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3438954+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity_MultiBlueprint"} +{"Time":"2026-10-09T10:40:01.3438954+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity_MultiBlueprint","Output":"=== RUN TestEmitLSML_CrossLanguageHashParity_MultiBlueprint\n"} +{"Time":"2026-10-09T10:40:01.3496937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity_MultiBlueprint","Output":"--- PASS: TestEmitLSML_CrossLanguageHashParity_MultiBlueprint (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.3496937+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity_MultiBlueprint","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.3496937+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity"} +{"Time":"2026-10-09T10:40:01.3496937+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity","Output":"=== RUN TestEmitLSML_CrossLanguageHashParity\n"} +{"Time":"2026-10-09T10:40:01.3549006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity","Output":"--- PASS: TestEmitLSML_CrossLanguageHashParity (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.3549006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEmitLSML_CrossLanguageHashParity","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.3549006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_SynthesizesEventTopicBinding"} +{"Time":"2026-10-09T10:40:01.3549006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_SynthesizesEventTopicBinding","Output":"=== RUN TestCompile_OnEvent_SynthesizesEventTopicBinding\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_SynthesizesEventTopicBinding","Output":"--- PASS: TestCompile_OnEvent_SynthesizesEventTopicBinding (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_SynthesizesEventTopicBinding","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_DeterministicSceneVersion"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_DeterministicSceneVersion","Output":"=== RUN TestCompile_OnEvent_DeterministicSceneVersion\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_DeterministicSceneVersion","Output":"--- PASS: TestCompile_OnEvent_DeterministicSceneVersion (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnEvent_DeterministicSceneVersion","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_EventsDataflowInputSynthesizesAcceptanceBinding"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_EventsDataflowInputSynthesizesAcceptanceBinding","Output":"=== RUN TestCompile_EventsDataflowInputSynthesizesAcceptanceBinding\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_EventsDataflowInputSynthesizesAcceptanceBinding","Output":"--- PASS: TestCompile_EventsDataflowInputSynthesizesAcceptanceBinding (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_EventsDataflowInputSynthesizesAcceptanceBinding","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph","Output":"=== RUN TestPartitionProbe_PureExecNodes_NotInDataGraph\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/branch"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/branch","Output":"=== RUN TestPartitionProbe_PureExecNodes_NotInDataGraph/branch\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/branch","Output":"--- PASS: TestPartitionProbe_PureExecNodes_NotInDataGraph/branch (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/branch","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/sequence"} +{"Time":"2026-10-09T10:40:01.3554125+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/sequence","Output":"=== RUN TestPartitionProbe_PureExecNodes_NotInDataGraph/sequence\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/sequence","Output":"--- PASS: TestPartitionProbe_PureExecNodes_NotInDataGraph/sequence (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/sequence","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-loop"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-loop","Output":"=== RUN TestPartitionProbe_PureExecNodes_NotInDataGraph/for-loop\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-loop","Output":"--- PASS: TestPartitionProbe_PureExecNodes_NotInDataGraph/for-loop (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-loop","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-each"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-each","Output":"=== RUN TestPartitionProbe_PureExecNodes_NotInDataGraph/for-each\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-each","Output":"--- PASS: TestPartitionProbe_PureExecNodes_NotInDataGraph/for-each (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/for-each","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/while"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/while","Output":"=== RUN TestPartitionProbe_PureExecNodes_NotInDataGraph/while\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/while","Output":"--- PASS: TestPartitionProbe_PureExecNodes_NotInDataGraph/while (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph/while","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph","Output":"--- PASS: TestPartitionProbe_PureExecNodes_NotInDataGraph (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureExecNodes_NotInDataGraph","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_SequenceInBranch"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_SequenceInBranch","Output":"=== RUN TestPartitionProbe_SequenceInBranch\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_SequenceInBranch","Output":"--- PASS: TestPartitionProbe_SequenceInBranch (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_SequenceInBranch","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ForLoopIndexPin"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ForLoopIndexPin","Output":"=== RUN TestPartitionProbe_ForLoopIndexPin\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ForLoopIndexPin","Output":"--- PASS: TestPartitionProbe_ForLoopIndexPin (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ForLoopIndexPin","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultipleOnEvent"} +{"Time":"2026-10-09T10:40:01.3559341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultipleOnEvent","Output":"=== RUN TestPartitionProbe_MultipleOnEvent\n"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultipleOnEvent","Output":"--- PASS: TestPartitionProbe_MultipleOnEvent (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultipleOnEvent","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_DelayConfigVerbatim"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_DelayConfigVerbatim","Output":"=== RUN TestPartitionProbe_DelayConfigVerbatim\n"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_DelayConfigVerbatim","Output":"--- PASS: TestPartitionProbe_DelayConfigVerbatim (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_DelayConfigVerbatim","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureDataflow_NoExecPrograms_AltBlueprint"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureDataflow_NoExecPrograms_AltBlueprint","Output":"=== RUN TestPartitionProbe_PureDataflow_NoExecPrograms_AltBlueprint\n"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureDataflow_NoExecPrograms_AltBlueprint","Output":"--- PASS: TestPartitionProbe_PureDataflow_NoExecPrograms_AltBlueprint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_PureDataflow_NoExecPrograms_AltBlueprint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_Determinism_Complex"} +{"Time":"2026-10-09T10:40:01.3564587+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_Determinism_Complex","Output":"=== RUN TestPartitionProbe_Determinism_Complex\n"} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_Determinism_Complex","Output":"--- PASS: TestPartitionProbe_Determinism_Complex (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_Determinism_Complex","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ExecOpUnmapped_NotCrash"} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ExecOpUnmapped_NotCrash","Output":"=== RUN TestPartitionProbe_ExecOpUnmapped_NotCrash\n"} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ExecOpUnmapped_NotCrash","Output":"--- PASS: TestPartitionProbe_ExecOpUnmapped_NotCrash (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_ExecOpUnmapped_NotCrash","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_TwoExecPrograms"} +{"Time":"2026-10-09T10:40:01.3585289+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_TwoExecPrograms","Output":"=== RUN TestPartitionProbe_MultiBlueprint_TwoExecPrograms\n"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_TwoExecPrograms","Output":"--- PASS: TestPartitionProbe_MultiBlueprint_TwoExecPrograms (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_TwoExecPrograms","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_Deterministic"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_Deterministic","Output":"=== RUN TestPartitionProbe_MultiBlueprint_Deterministic\n"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_Deterministic","Output":"--- PASS: TestPartitionProbe_MultiBlueprint_Deterministic (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_MultiBlueprint_Deterministic","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_OnEvent_ConfigKeyContract"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_OnEvent_ConfigKeyContract","Output":"=== RUN TestPartitionProbe_OnEvent_ConfigKeyContract\n"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_OnEvent_ConfigKeyContract","Output":"--- PASS: TestPartitionProbe_OnEvent_ConfigKeyContract (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartitionProbe_OnEvent_ConfigKeyContract","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3590466+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnEvent_DataEdgeIsNotExecTarget"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnEvent_DataEdgeIsNotExecTarget","Output":"=== RUN TestPartition_OnEvent_DataEdgeIsNotExecTarget\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnEvent_DataEdgeIsNotExecTarget","Output":"--- PASS: TestPartition_OnEvent_DataEdgeIsNotExecTarget (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnEvent_DataEdgeIsNotExecTarget","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnCall_KeyedByConfigEntrypoint"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnCall_KeyedByConfigEntrypoint","Output":"=== RUN TestPartition_OnCall_KeyedByConfigEntrypoint\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnCall_KeyedByConfigEntrypoint","Output":"--- PASS: TestPartition_OnCall_KeyedByConfigEntrypoint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_OnCall_KeyedByConfigEntrypoint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_MixedScene_Structure"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_MixedScene_Structure","Output":"=== RUN TestPartition_MixedScene_Structure\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_MixedScene_Structure","Output":"--- PASS: TestPartition_MixedScene_Structure (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_MixedScene_Structure","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PureDataflow_ByteIdentical"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PureDataflow_ByteIdentical","Output":"=== RUN TestPartition_PureDataflow_ByteIdentical\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PureDataflow_ByteIdentical","Output":"--- PASS: TestPartition_PureDataflow_ByteIdentical (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PureDataflow_ByteIdentical","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_Deterministic"} +{"Time":"2026-10-09T10:40:01.3595661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_Deterministic","Output":"=== RUN TestPartition_Deterministic\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_Deterministic","Output":"--- PASS: TestPartition_Deterministic (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_Deterministic","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_KeyedBlueprint_DataFromPrefixed"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_KeyedBlueprint_DataFromPrefixed","Output":"=== RUN TestPartition_KeyedBlueprint_DataFromPrefixed\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_KeyedBlueprint_DataFromPrefixed","Output":"--- PASS: TestPartition_KeyedBlueprint_DataFromPrefixed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_KeyedBlueprint_DataFromPrefixed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_DanglingExecTarget_FailsLoud"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_DanglingExecTarget_FailsLoud","Output":"=== RUN TestPartition_DanglingExecTarget_FailsLoud\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_DanglingExecTarget_FailsLoud","Output":"--- PASS: TestPartition_DanglingExecTarget_FailsLoud (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_DanglingExecTarget_FailsLoud","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_DanglingNext"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_DanglingNext","Output":"=== RUN TestValidateExecTargets_DanglingNext\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_DanglingNext","Output":"--- PASS: TestValidateExecTargets_DanglingNext (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_DanglingNext","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_HealthyProgram"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_HealthyProgram","Output":"=== RUN TestValidateExecTargets_HealthyProgram\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_HealthyProgram","Output":"--- PASS: TestValidateExecTargets_HealthyProgram (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateExecTargets_HealthyProgram","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_ExecOpUnmapped_FailsLoud"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_ExecOpUnmapped_FailsLoud","Output":"=== RUN TestPartition_ExecOpUnmapped_FailsLoud\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_ExecOpUnmapped_FailsLoud","Output":"--- PASS: TestPartition_ExecOpUnmapped_FailsLoud (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_ExecOpUnmapped_FailsLoud","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_DropsInlinedOnStart"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_DropsInlinedOnStart","Output":"=== RUN TestExpand_ExecTriggerableReference_DropsInlinedOnStart\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_DropsInlinedOnStart","Output":"--- PASS: TestExpand_ExecTriggerableReference_DropsInlinedOnStart (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_DropsInlinedOnStart","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DataOnlyReference_PreservesInlinedOnStart"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DataOnlyReference_PreservesInlinedOnStart","Output":"=== RUN TestExpand_DataOnlyReference_PreservesInlinedOnStart\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DataOnlyReference_PreservesInlinedOnStart","Output":"--- PASS: TestExpand_DataOnlyReference_PreservesInlinedOnStart (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DataOnlyReference_PreservesInlinedOnStart","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_OnStartPushesOutput_RejectedAsDangling"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_OnStartPushesOutput_RejectedAsDangling","Output":"=== RUN TestExpand_OnStartPushesOutput_RejectedAsDangling\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_OnStartPushesOutput_RejectedAsDangling","Output":"--- PASS: TestExpand_OnStartPushesOutput_RejectedAsDangling (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_OnStartPushesOutput_RejectedAsDangling","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_Deterministic"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_Deterministic","Output":"=== RUN TestExpand_ExecTriggerableReference_Deterministic\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_Deterministic","Output":"--- PASS: TestExpand_ExecTriggerableReference_Deterministic (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_ExecTriggerableReference_Deterministic","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_AlphaRename_NoIDCollision"} +{"Time":"2026-10-09T10:40:01.3600841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_AlphaRename_NoIDCollision","Output":"=== RUN TestMatrix_AlphaRename_NoIDCollision\n"} +{"Time":"2026-10-09T10:40:01.3610883+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_AlphaRename_NoIDCollision","Output":"--- PASS: TestMatrix_AlphaRename_NoIDCollision (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3610883+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_AlphaRename_NoIDCollision","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3610883+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_BelowMax_Passes"} +{"Time":"2026-10-09T10:40:01.3610883+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_BelowMax_Passes","Output":"=== RUN TestMatrix_DepthBound_BelowMax_Passes\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_BelowMax_Passes","Output":"--- PASS: TestMatrix_DepthBound_BelowMax_Passes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_BelowMax_Passes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_AtMax_Fails"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_AtMax_Fails","Output":"=== RUN TestMatrix_DepthBound_AtMax_Fails\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_AtMax_Fails","Output":"--- PASS: TestMatrix_DepthBound_AtMax_Fails (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_DepthBound_AtMax_Fails","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_MutualCycle_ABtoA"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_MutualCycle_ABtoA","Output":"=== RUN TestMatrix_MutualCycle_ABtoA\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_MutualCycle_ABtoA","Output":"--- PASS: TestMatrix_MutualCycle_ABtoA (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_MutualCycle_ABtoA","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptyBlueprintID_Rejected"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptyBlueprintID_Rejected","Output":"=== RUN TestMatrix_EmptyBlueprintID_Rejected\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptyBlueprintID_Rejected","Output":"--- PASS: TestMatrix_EmptyBlueprintID_Rejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptyBlueprintID_Rejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ZeroVersion_Rejected"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ZeroVersion_Rejected","Output":"=== RUN TestMatrix_ZeroVersion_Rejected\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ZeroVersion_Rejected","Output":"--- PASS: TestMatrix_ZeroVersion_Rejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ZeroVersion_Rejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NegativeVersion_Rejected"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NegativeVersion_Rejected","Output":"=== RUN TestMatrix_NegativeVersion_Rejected\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NegativeVersion_Rejected","Output":"--- PASS: TestMatrix_NegativeVersion_Rejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NegativeVersion_Rejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Conformance_ExpandedGraphNoUnservedNode"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Conformance_ExpandedGraphNoUnservedNode","Output":"=== RUN TestMatrix_Conformance_ExpandedGraphNoUnservedNode\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Conformance_ExpandedGraphNoUnservedNode","Output":"--- PASS: TestMatrix_Conformance_ExpandedGraphNoUnservedNode (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Conformance_ExpandedGraphNoUnservedNode","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_BundleByteStable"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_BundleByteStable","Output":"=== RUN TestMatrix_BundleByteStable\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_BundleByteStable","Output":"--- PASS: TestMatrix_BundleByteStable (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_BundleByteStable","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_VersionChange_ChangesBundleHash"} +{"Time":"2026-10-09T10:40:01.3615911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_VersionChange_ChangesBundleHash","Output":"=== RUN TestMatrix_VersionChange_ChangesBundleHash\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_VersionChange_ChangesBundleHash","Output":"--- PASS: TestMatrix_VersionChange_ChangesBundleHash (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_VersionChange_ChangesBundleHash","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NoReferenceNodeSurvives_DeepGraph"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NoReferenceNodeSurvives_DeepGraph","Output":"=== RUN TestMatrix_NoReferenceNodeSurvives_DeepGraph\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NoReferenceNodeSurvives_DeepGraph","Output":"--- PASS: TestMatrix_NoReferenceNodeSurvives_DeepGraph (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_NoReferenceNodeSurvives_DeepGraph","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ReferenceFreePush_IsNoop"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ReferenceFreePush_IsNoop","Output":"=== RUN TestMatrix_ReferenceFreePush_IsNoop\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ReferenceFreePush_IsNoop","Output":"--- PASS: TestMatrix_ReferenceFreePush_IsNoop (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_ReferenceFreePush_IsNoop","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_FanoutOutput_Splice"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_FanoutOutput_Splice","Output":"=== RUN TestMatrix_FanoutOutput_Splice\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_FanoutOutput_Splice","Output":"--- PASS: TestMatrix_FanoutOutput_Splice (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_FanoutOutput_Splice","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_UnwiredInputPin_IsNoError"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_UnwiredInputPin_IsNoError","Output":"=== RUN TestMatrix_UnwiredInputPin_IsNoError\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_UnwiredInputPin_IsNoError","Output":"--- PASS: TestMatrix_UnwiredInputPin_IsNoError (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_UnwiredInputPin_IsNoError","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptySubgraph_NoInteriorNodes"} +{"Time":"2026-10-09T10:40:01.3621132+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptySubgraph_NoInteriorNodes","Output":"=== RUN TestMatrix_EmptySubgraph_NoInteriorNodes\n"} +{"Time":"2026-10-09T10:40:01.3626296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptySubgraph_NoInteriorNodes","Output":"--- PASS: TestMatrix_EmptySubgraph_NoInteriorNodes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3626296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_EmptySubgraph_NoInteriorNodes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3626296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd"} +{"Time":"2026-10-09T10:40:01.3626296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd","Output":"=== RUN TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd\n"} +{"Time":"2026-10-09T10:40:01.3626296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_NOT_FOUND"} +{"Time":"2026-10-09T10:40:01.3626296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_NOT_FOUND","Output":"=== RUN TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_NOT_FOUND\n"} +{"Time":"2026-10-09T10:40:01.3642189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_NOT_FOUND","Output":"--- PASS: TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_NOT_FOUND (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3651659+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_NOT_FOUND","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3651659+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_FOUND"} +{"Time":"2026-10-09T10:40:01.3651659+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_FOUND","Output":"=== RUN TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_FOUND\n"} +{"Time":"2026-10-09T10:40:01.3656711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_FOUND","Output":"--- PASS: TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_FOUND (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3656711+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_FOUND","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3656711+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_PUBLISHED"} +{"Time":"2026-10-09T10:40:01.3656711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_PUBLISHED","Output":"=== RUN TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_PUBLISHED\n"} +{"Time":"2026-10-09T10:40:01.3666767+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_PUBLISHED","Output":"--- PASS: TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_PUBLISHED (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3666767+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd/BLUEPRINT_VERSION_NOT_PUBLISHED","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3666767+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd","Output":"--- PASS: TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3666767+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_ThreeTypedErrorCodes_EndToEnd","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3666767+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_NetworkError_IsFetchUpstream"} +{"Time":"2026-10-09T10:40:01.3666767+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_NetworkError_IsFetchUpstream","Output":"=== RUN TestMatrix_HTTPFetcher_NetworkError_IsFetchUpstream\n"} +{"Time":"2026-10-09T10:40:01.3671801+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_NetworkError_IsFetchUpstream","Output":"--- PASS: TestMatrix_HTTPFetcher_NetworkError_IsFetchUpstream (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3671801+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_NetworkError_IsFetchUpstream","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3671801+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_Non2xxNonTyped_IsFetchUpstream"} +{"Time":"2026-10-09T10:40:01.3671801+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_Non2xxNonTyped_IsFetchUpstream","Output":"=== RUN TestMatrix_HTTPFetcher_Non2xxNonTyped_IsFetchUpstream\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_Non2xxNonTyped_IsFetchUpstream","Output":"--- PASS: TestMatrix_HTTPFetcher_Non2xxNonTyped_IsFetchUpstream (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_HTTPFetcher_Non2xxNonTyped_IsFetchUpstream","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Memoise_DifferentVersionsAreSeparateCacheEntries"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Memoise_DifferentVersionsAreSeparateCacheEntries","Output":"=== RUN TestMatrix_Memoise_DifferentVersionsAreSeparateCacheEntries\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Memoise_DifferentVersionsAreSeparateCacheEntries","Output":"--- PASS: TestMatrix_Memoise_DifferentVersionsAreSeparateCacheEntries (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestMatrix_Memoise_DifferentVersionsAreSeparateCacheEntries","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_AllReachable"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_AllReachable","Output":"=== RUN TestExpand_AdjacentReferences_AllReachable\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_AllReachable","Output":"--- PASS: TestExpand_AdjacentReferences_AllReachable (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_AllReachable","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_ContiguousSpine"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_ContiguousSpine","Output":"=== RUN TestExpand_AdjacentReferences_ContiguousSpine\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_ContiguousSpine","Output":"--- PASS: TestExpand_AdjacentReferences_ContiguousSpine (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AdjacentReferences_ContiguousSpine","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SimpleReference_FlatGraph"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SimpleReference_FlatGraph","Output":"=== RUN TestExpand_SimpleReference_FlatGraph\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SimpleReference_FlatGraph","Output":"--- PASS: TestExpand_SimpleReference_FlatGraph (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SimpleReference_FlatGraph","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_Recurses"} +{"Time":"2026-10-09T10:40:01.3682202+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_Recurses","Output":"=== RUN TestExpand_NestedReference_Recurses\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_Recurses","Output":"--- PASS: TestExpand_NestedReference_Recurses (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_Recurses","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnpublishedVersion_Unresolved"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnpublishedVersion_Unresolved","Output":"=== RUN TestExpand_UnpublishedVersion_Unresolved\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnpublishedVersion_Unresolved","Output":"--- PASS: TestExpand_UnpublishedVersion_Unresolved (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnpublishedVersion_Unresolved","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_PinnedVersions_DistinctExpansions"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_PinnedVersions_DistinctExpansions","Output":"=== RUN TestExpand_PinnedVersions_DistinctExpansions\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_PinnedVersions_DistinctExpansions","Output":"--- PASS: TestExpand_PinnedVersions_DistinctExpansions (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_PinnedVersions_DistinctExpansions","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Deterministic"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Deterministic","Output":"=== RUN TestExpand_Deterministic\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Deterministic","Output":"--- PASS: TestExpand_Deterministic (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Deterministic","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SelfReference_Cyclic"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SelfReference_Cyclic","Output":"=== RUN TestExpand_SelfReference_Cyclic\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SelfReference_Cyclic","Output":"--- PASS: TestExpand_SelfReference_Cyclic (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_SelfReference_Cyclic","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_IndirectCycle_Cyclic"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_IndirectCycle_Cyclic","Output":"=== RUN TestExpand_IndirectCycle_Cyclic\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_IndirectCycle_Cyclic","Output":"--- PASS: TestExpand_IndirectCycle_Cyclic (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_IndirectCycle_Cyclic","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Diamond_NoCycle"} +{"Time":"2026-10-09T10:40:01.3687394+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Diamond_NoCycle","Output":"=== RUN TestExpand_Diamond_NoCycle\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Diamond_NoCycle","Output":"--- PASS: TestExpand_Diamond_NoCycle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_Diamond_NoCycle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DeepAcyclicChain_OK"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DeepAcyclicChain_OK","Output":"=== RUN TestExpand_DeepAcyclicChain_OK\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DeepAcyclicChain_OK","Output":"--- PASS: TestExpand_DeepAcyclicChain_OK (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_DeepAcyclicChain_OK","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnknownPort_Rejected"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnknownPort_Rejected","Output":"=== RUN TestExpand_UnknownPort_Rejected\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnknownPort_Rejected","Output":"--- PASS: TestExpand_UnknownPort_Rejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_UnknownPort_Rejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_MemoisesFetchPerVersion"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_MemoisesFetchPerVersion","Output":"=== RUN TestExpand_MemoisesFetchPerVersion\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_MemoisesFetchPerVersion","Output":"--- PASS: TestExpand_MemoisesFetchPerVersion (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_MemoisesFetchPerVersion","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_VarsLeaves_NoDoublePrefix"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_VarsLeaves_NoDoublePrefix","Output":"=== RUN TestExpand_NestedReference_VarsLeaves_NoDoublePrefix\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_VarsLeaves_NoDoublePrefix","Output":"--- PASS: TestExpand_NestedReference_VarsLeaves_NoDoublePrefix (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_NestedReference_VarsLeaves_NoDoublePrefix","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsGet_NamespacedCoherentWithSet"} +{"Time":"2026-10-09T10:40:01.3692586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsGet_NamespacedCoherentWithSet","Output":"=== RUN TestExpand_VarsGet_NamespacedCoherentWithSet\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsGet_NamespacedCoherentWithSet","Output":"--- PASS: TestExpand_VarsGet_NamespacedCoherentWithSet (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsGet_NamespacedCoherentWithSet","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AuthorNameCollision_TwoDistinctFunctions"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AuthorNameCollision_TwoDistinctFunctions","Output":"=== RUN TestExpand_AuthorNameCollision_TwoDistinctFunctions\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AuthorNameCollision_TwoDistinctFunctions","Output":"--- PASS: TestExpand_AuthorNameCollision_TwoDistinctFunctions (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_AuthorNameCollision_TwoDistinctFunctions","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInput_ExpandedTopology_ReaderWired"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInput_ExpandedTopology_ReaderWired","Output":"=== RUN TestExpand_VarsInput_ExpandedTopology_ReaderWired\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInput_ExpandedTopology_ReaderWired","Output":"--- PASS: TestExpand_VarsInput_ExpandedTopology_ReaderWired (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInput_ExpandedTopology_ReaderWired","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_Promoted"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_Promoted","Output":"=== RUN TestExpand_VarsInputReader_Promoted\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_Promoted","Output":"--- PASS: TestExpand_VarsInputReader_Promoted (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_Promoted","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_DistinctPerInstance"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_DistinctPerInstance","Output":"=== RUN TestExpand_VarsInputReader_DistinctPerInstance\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_DistinctPerInstance","Output":"--- PASS: TestExpand_VarsInputReader_DistinctPerInstance (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarsInputReader_DistinctPerInstance","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_InterfacePin_StillRelayed"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_InterfacePin_StillRelayed","Output":"=== RUN TestExpand_InterfacePin_StillRelayed\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_InterfacePin_StillRelayed","Output":"--- PASS: TestExpand_InterfacePin_StillRelayed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_InterfacePin_StillRelayed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_MaterialisedPerInstance"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_MaterialisedPerInstance","Output":"=== RUN TestExpand_VarSeed_MaterialisedPerInstance\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_MaterialisedPerInstance","Output":"--- PASS: TestExpand_VarSeed_MaterialisedPerInstance (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_MaterialisedPerInstance","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_DistinctPerInstance"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_DistinctPerInstance","Output":"=== RUN TestExpand_VarSeed_DistinctPerInstance\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_DistinctPerInstance","Output":"--- PASS: TestExpand_VarSeed_DistinctPerInstance (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_DistinctPerInstance","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_NoVariables_Unchanged"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_NoVariables_Unchanged","Output":"=== RUN TestExpand_VarSeed_NoVariables_Unchanged\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_NoVariables_Unchanged","Output":"--- PASS: TestExpand_VarSeed_NoVariables_Unchanged (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestExpand_VarSeed_NoVariables_Unchanged","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolvedGraph_VariablesDeserialised"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolvedGraph_VariablesDeserialised","Output":"=== RUN TestResolvedGraph_VariablesDeserialised\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolvedGraph_VariablesDeserialised","Output":"--- PASS: TestResolvedGraph_VariablesDeserialised (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolvedGraph_VariablesDeserialised","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEnvelopeFingerprint_StableAndDistinct"} +{"Time":"2026-10-09T10:40:01.3697756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEnvelopeFingerprint_StableAndDistinct","Output":"=== RUN TestEnvelopeFingerprint_StableAndDistinct\n"} +{"Time":"2026-10-09T10:40:01.37029+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEnvelopeFingerprint_StableAndDistinct","Output":"--- PASS: TestEnvelopeFingerprint_StableAndDistinct (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.37029+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestEnvelopeFingerprint_StableAndDistinct","Elapsed":0} +{"Time":"2026-10-09T10:40:01.37029+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_DiskCache_SecondFetchNoHTTP"} +{"Time":"2026-10-09T10:40:01.37029+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_DiskCache_SecondFetchNoHTTP","Output":"=== RUN TestFetchCanvasLayout_DiskCache_SecondFetchNoHTTP\n"} +{"Time":"2026-10-09T10:40:01.3791574+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_DiskCache_SecondFetchNoHTTP","Output":"--- PASS: TestFetchCanvasLayout_DiskCache_SecondFetchNoHTTP (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.3791574+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_DiskCache_SecondFetchNoHTTP","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.3791574+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NoCacheDir_AlwaysHitsNetwork"} +{"Time":"2026-10-09T10:40:01.3796713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NoCacheDir_AlwaysHitsNetwork","Output":"=== RUN TestFetchCanvasLayout_NoCacheDir_AlwaysHitsNetwork\n"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NoCacheDir_AlwaysHitsNetwork","Output":"--- PASS: TestFetchCanvasLayout_NoCacheDir_AlwaysHitsNetwork (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NoCacheDir_AlwaysHitsNetwork","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PortlessOnCall_ArmsNothing"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PortlessOnCall_ArmsNothing","Output":"=== RUN TestPartition_PortlessOnCall_ArmsNothing\n"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PortlessOnCall_ArmsNothing","Output":"--- PASS: TestPartition_PortlessOnCall_ArmsNothing (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_PortlessOnCall_ArmsNothing","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_BakedOnCall_ArmsEntrypoint"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_BakedOnCall_ArmsEntrypoint","Output":"=== RUN TestPartition_BakedOnCall_ArmsEntrypoint\n"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_BakedOnCall_ArmsEntrypoint","Output":"--- PASS: TestPartition_BakedOnCall_ArmsEntrypoint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestPartition_BakedOnCall_ArmsEntrypoint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_BlueContract"} +{"Time":"2026-10-09T10:40:01.3802038+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_BlueContract","Output":"=== RUN TestFetchComputeManifest_BlueContract\n"} +{"Time":"2026-10-09T10:40:01.3874657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_BlueContract","Output":"--- PASS: TestFetchComputeManifest_BlueContract (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.388411+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_BlueContract","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.388411+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_ZabCanvasPushedVersionContract"} +{"Time":"2026-10-09T10:40:01.388411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_ZabCanvasPushedVersionContract","Output":"=== RUN TestFetchComponent_ZabCanvasPushedVersionContract\n"} +{"Time":"2026-10-09T10:40:01.3942042+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_ZabCanvasPushedVersionContract","Output":"--- PASS: TestFetchComponent_ZabCanvasPushedVersionContract (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.3942042+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_ZabCanvasPushedVersionContract","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.3942042+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope"} +{"Time":"2026-10-09T10:40:01.3942042+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope","Output":"=== RUN TestFetchComponent_RejectsInvalidZabCanvasEnvelope\n"} +{"Time":"2026-10-09T10:40:01.3942042+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/identity_mismatch"} +{"Time":"2026-10-09T10:40:01.3942042+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/identity_mismatch","Output":"=== RUN TestFetchComponent_RejectsInvalidZabCanvasEnvelope/identity_mismatch\n"} +{"Time":"2026-10-09T10:40:01.3947455+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/identity_mismatch","Output":"--- PASS: TestFetchComponent_RejectsInvalidZabCanvasEnvelope/identity_mismatch (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3947455+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/identity_mismatch","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3947455+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/missing_nested_layout"} +{"Time":"2026-10-09T10:40:01.3947455+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/missing_nested_layout","Output":"=== RUN TestFetchComponent_RejectsInvalidZabCanvasEnvelope/missing_nested_layout\n"} +{"Time":"2026-10-09T10:40:01.3952692+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/missing_nested_layout","Output":"--- PASS: TestFetchComponent_RejectsInvalidZabCanvasEnvelope/missing_nested_layout (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3952692+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope/missing_nested_layout","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3952692+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope","Output":"--- PASS: TestFetchComponent_RejectsInvalidZabCanvasEnvelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3952692+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_RejectsInvalidZabCanvasEnvelope","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3952692+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_PreservesZabCanvasHTTPError"} +{"Time":"2026-10-09T10:40:01.3952692+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_PreservesZabCanvasHTTPError","Output":"=== RUN TestFetchComponent_PreservesZabCanvasHTTPError\n"} +{"Time":"2026-10-09T10:40:01.395795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_PreservesZabCanvasHTTPError","Output":"--- PASS: TestFetchComponent_PreservesZabCanvasHTTPError (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.395795+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComponent_PreservesZabCanvasHTTPError","Elapsed":0} +{"Time":"2026-10-09T10:40:01.395795+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_BlueContract"} +{"Time":"2026-10-09T10:40:01.395795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_BlueContract","Output":"=== RUN TestFetchBlueprint_BlueContract\n"} +{"Time":"2026-10-09T10:40:01.3968492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_BlueContract","Output":"--- PASS: TestFetchBlueprint_BlueContract (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3968492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_BlueContract","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3968492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_PinnedEndpoint"} +{"Time":"2026-10-09T10:40:01.3968492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_PinnedEndpoint","Output":"=== RUN TestFetchBlueprintGraph_PinnedEndpoint\n"} +{"Time":"2026-10-09T10:40:01.3973756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_PinnedEndpoint","Output":"--- PASS: TestFetchBlueprintGraph_PinnedEndpoint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3973756+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_PinnedEndpoint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3973756+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_ExecPinKind"} +{"Time":"2026-10-09T10:40:01.3973756+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_ExecPinKind","Output":"=== RUN TestFetchBlueprintGraph_ExecPinKind\n"} +{"Time":"2026-10-09T10:40:01.3980059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_ExecPinKind","Output":"--- PASS: TestFetchBlueprintGraph_ExecPinKind (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3980059+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_ExecPinKind","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3980059+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved"} +{"Time":"2026-10-09T10:40:01.3980059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved","Output":"=== RUN TestFetchBlueprintGraph_TypedErrorsUnresolved\n"} +{"Time":"2026-10-09T10:40:01.3980059+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-found"} +{"Time":"2026-10-09T10:40:01.3980059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-found","Output":"=== RUN TestFetchBlueprintGraph_TypedErrorsUnresolved/not-found\n"} +{"Time":"2026-10-09T10:40:01.3990733+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-found","Output":"--- PASS: TestFetchBlueprintGraph_TypedErrorsUnresolved/not-found (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3990733+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-found","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3990733+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/version-not-found"} +{"Time":"2026-10-09T10:40:01.3990733+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/version-not-found","Output":"=== RUN TestFetchBlueprintGraph_TypedErrorsUnresolved/version-not-found\n"} +{"Time":"2026-10-09T10:40:01.3995872+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/version-not-found","Output":"--- PASS: TestFetchBlueprintGraph_TypedErrorsUnresolved/version-not-found (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.3995872+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/version-not-found","Elapsed":0} +{"Time":"2026-10-09T10:40:01.3995872+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-published"} +{"Time":"2026-10-09T10:40:01.3995872+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-published","Output":"=== RUN TestFetchBlueprintGraph_TypedErrorsUnresolved/not-published\n"} +{"Time":"2026-10-09T10:40:01.4006556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-published","Output":"--- PASS: TestFetchBlueprintGraph_TypedErrorsUnresolved/not-published (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4006556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved/not-published","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4006556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved","Output":"--- PASS: TestFetchBlueprintGraph_TypedErrorsUnresolved (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4006556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprintGraph_TypedErrorsUnresolved","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4006556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_ResolvesBlueprintDefinitionRef"} +{"Time":"2026-10-09T10:40:01.4006556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_ResolvesBlueprintDefinitionRef","Output":"=== RUN TestFetchComputeManifest_ResolvesBlueprintDefinitionRef\n"} +{"Time":"2026-10-09T10:40:01.4017157+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_ResolvesBlueprintDefinitionRef","Output":"--- PASS: TestFetchComputeManifest_ResolvesBlueprintDefinitionRef (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4017157+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchComputeManifest_ResolvesBlueprintDefinitionRef","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4017157+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_DecodesDefinitionWireField"} +{"Time":"2026-10-09T10:40:01.4017157+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_DecodesDefinitionWireField","Output":"=== RUN TestBlueprintNode_DecodesDefinitionWireField\n"} +{"Time":"2026-10-09T10:40:01.4027742+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_DecodesDefinitionWireField","Output":"--- PASS: TestBlueprintNode_DecodesDefinitionWireField (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4027742+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestBlueprintNode_DecodesDefinitionWireField","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4027742+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_BackfillsDefaultsFromBundle"} +{"Time":"2026-10-09T10:40:01.4027742+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_BackfillsDefaultsFromBundle","Output":"=== RUN TestFetchCanvasLayout_BackfillsDefaultsFromBundle\n"} +{"Time":"2026-10-09T10:40:01.4032999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_BackfillsDefaultsFromBundle","Output":"--- PASS: TestFetchCanvasLayout_BackfillsDefaultsFromBundle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4032999+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_BackfillsDefaultsFromBundle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4032999+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout"} +{"Time":"2026-10-09T10:40:01.4032999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout","Output":"=== RUN TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout\n"} +{"Time":"2026-10-09T10:40:01.4413251+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout","Output":"2026/10/09 10:40:01 WARN lsml bundle address mismatch; dropping literal defaults requested=5c81247dd6da90bf5920f4c82782124d8cacf77515ac0f2b395c347436da0153 recomputed=3b0decaf67e3eb99497fbd82382347a948950e29658230a31175595accd3965e url=http://127.0.0.1:56541/api/v1/lsml-bundles/5c81247dd6da90bf5920f4c82782124d8cacf77515ac0f2b395c347436da0153\n"} +{"Time":"2026-10-09T10:40:01.4418591+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout","Output":"--- PASS: TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout (0.04s)\n"} +{"Time":"2026-10-09T10:40:01.4418591+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_SubstitutedBundleDoesNotReachTheLayout","Elapsed":0.04} +{"Time":"2026-10-09T10:40:01.4418591+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsBundleWithUndeclaredMembers"} +{"Time":"2026-10-09T10:40:01.4418591+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsBundleWithUndeclaredMembers","Output":"=== RUN TestFetchCanvasLayout_AcceptsBundleWithUndeclaredMembers\n"} +{"Time":"2026-10-09T10:40:01.4424057+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsBundleWithUndeclaredMembers","Output":"--- PASS: TestFetchCanvasLayout_AcceptsBundleWithUndeclaredMembers (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4424057+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsBundleWithUndeclaredMembers","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4424057+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsPrefixedAddress"} +{"Time":"2026-10-09T10:40:01.4424057+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsPrefixedAddress","Output":"=== RUN TestFetchCanvasLayout_AcceptsPrefixedAddress\n"} +{"Time":"2026-10-09T10:40:01.4434678+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsPrefixedAddress","Output":"--- PASS: TestFetchCanvasLayout_AcceptsPrefixedAddress (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4434678+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_AcceptsPrefixedAddress","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4434678+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_KeepsInlineDefaults"} +{"Time":"2026-10-09T10:40:01.4434678+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_KeepsInlineDefaults","Output":"=== RUN TestFetchCanvasLayout_KeepsInlineDefaults\n"} +{"Time":"2026-10-09T10:40:01.4439979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_KeepsInlineDefaults","Output":"--- PASS: TestFetchCanvasLayout_KeepsInlineDefaults (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4439979+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_KeepsInlineDefaults","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4439979+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_CarriesVariables"} +{"Time":"2026-10-09T10:40:01.4439979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_CarriesVariables","Output":"=== RUN TestFetchBlueprint_CarriesVariables\n"} +{"Time":"2026-10-09T10:40:01.4445186+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_CarriesVariables","Output":"--- PASS: TestFetchBlueprint_CarriesVariables (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4445186+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchBlueprint_CarriesVariables","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4445186+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_ReadsTokenLivePerRequest"} +{"Time":"2026-10-09T10:40:01.4445186+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_ReadsTokenLivePerRequest","Output":"=== RUN TestHTTPFetcher_ReadsTokenLivePerRequest\n"} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_ReadsTokenLivePerRequest","Output":"--- PASS: TestHTTPFetcher_ReadsTokenLivePerRequest (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_ReadsTokenLivePerRequest","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NoSilentAnonymousFallback"} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NoSilentAnonymousFallback","Output":"=== RUN TestHTTPFetcher_NoSilentAnonymousFallback\n"} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NoSilentAnonymousFallback","Output":"--- PASS: TestHTTPFetcher_NoSilentAnonymousFallback (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NoSilentAnonymousFallback","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NilTokenFuncSendsAnonymous"} +{"Time":"2026-10-09T10:40:01.4450477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NilTokenFuncSendsAnonymous","Output":"=== RUN TestHTTPFetcher_NilTokenFuncSendsAnonymous\n"} +{"Time":"2026-10-09T10:40:01.4455752+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NilTokenFuncSendsAnonymous","Output":"--- PASS: TestHTTPFetcher_NilTokenFuncSendsAnonymous (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4455752+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestHTTPFetcher_NilTokenFuncSendsAnonymous","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4455752+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_OldKeyEntryIsMiss"} +{"Time":"2026-10-09T10:40:01.4455752+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_OldKeyEntryIsMiss","Output":"=== RUN TestFetchCanvasLayout_OldKeyEntryIsMiss\n"} +{"Time":"2026-10-09T10:40:01.4498071+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_OldKeyEntryIsMiss","Output":"--- PASS: TestFetchCanvasLayout_OldKeyEntryIsMiss (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4498071+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_OldKeyEntryIsMiss","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4498071+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NewKeyRoundTrips"} +{"Time":"2026-10-09T10:40:01.4498071+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NewKeyRoundTrips","Output":"=== RUN TestFetchCanvasLayout_NewKeyRoundTrips\n"} +{"Time":"2026-10-09T10:40:01.458359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NewKeyRoundTrips","Output":"--- PASS: TestFetchCanvasLayout_NewKeyRoundTrips (0.01s)\n"} +{"Time":"2026-10-09T10:40:01.458359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestFetchCanvasLayout_NewKeyRoundTrips","Elapsed":0.01} +{"Time":"2026-10-09T10:40:01.458359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_M10Parity"} +{"Time":"2026-10-09T10:40:01.458359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_M10Parity","Output":"=== RUN TestLowerAnimateInitial_M10Parity\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_M10Parity","Output":"--- PASS: TestLowerAnimateInitial_M10Parity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_M10Parity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity","Output":"=== RUN TestLowerAnimateInitial_MappingParity\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/malformed_from"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/malformed_from","Output":"=== RUN TestLowerAnimateInitial_MappingParity/malformed_from\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/malformed_from","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/malformed_from (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/malformed_from","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/no_from"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/no_from","Output":"=== RUN TestLowerAnimateInitial_MappingParity/no_from\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/no_from","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/no_from (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/no_from","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/m10_directive"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/m10_directive","Output":"=== RUN TestLowerAnimateInitial_MappingParity/m10_directive\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/m10_directive","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/m10_directive (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/m10_directive","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_only"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_only","Output":"=== RUN TestLowerAnimateInitial_MappingParity/opacity_only\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_only","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/opacity_only (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_only","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_scalar"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_scalar","Output":"=== RUN TestLowerAnimateInitial_MappingParity/scale_scalar\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_scalar","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/scale_scalar (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_scalar","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_pair_→_sx"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_pair_→_sx","Output":"=== RUN TestLowerAnimateInitial_MappingParity/scale_pair_→_sx\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_pair_→_sx","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/scale_pair_→_sx (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/scale_pair_→_sx","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/translate_→_x/y"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/translate_→_x/y","Output":"=== RUN TestLowerAnimateInitial_MappingParity/translate_→_x/y\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/translate_→_x/y","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/translate_→_x/y (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/translate_→_x/y","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/all_keys,_ordered"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/all_keys,_ordered","Output":"=== RUN TestLowerAnimateInitial_MappingParity/all_keys,_ordered\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/all_keys,_ordered","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/all_keys,_ordered (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/all_keys,_ordered","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/empty_from"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/empty_from","Output":"=== RUN TestLowerAnimateInitial_MappingParity/empty_from\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/empty_from","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/empty_from (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/empty_from","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/rotate"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/rotate","Output":"=== RUN TestLowerAnimateInitial_MappingParity/rotate\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/rotate","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/rotate (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/rotate","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_non-number_skipped_(typeof_guard)"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_non-number_skipped_(typeof_guard)","Output":"=== RUN TestLowerAnimateInitial_MappingParity/opacity_non-number_skipped_(typeof_guard)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_non-number_skipped_(typeof_guard)","Output":"--- PASS: TestLowerAnimateInitial_MappingParity/opacity_non-number_skipped_(typeof_guard) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity/opacity_non-number_skipped_(typeof_guard)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity","Output":"--- PASS: TestLowerAnimateInitial_MappingParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_MappingParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RetroCompat"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RetroCompat","Output":"=== RUN TestLowerAnimateInitial_RetroCompat\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RetroCompat","Output":"--- PASS: TestLowerAnimateInitial_RetroCompat (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RetroCompat","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RoundTrip"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RoundTrip","Output":"=== RUN TestLowerAnimateInitial_RoundTrip\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RoundTrip","Output":"--- PASS: TestLowerAnimateInitial_RoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_RoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_LSMLHashUnperturbed"} +{"Time":"2026-10-09T10:40:01.4588892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_LSMLHashUnperturbed","Output":"=== RUN TestLowerAnimateInitial_LSMLHashUnperturbed\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_LSMLHashUnperturbed","Output":"--- PASS: TestLowerAnimateInitial_LSMLHashUnperturbed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimateInitial_LSMLHashUnperturbed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ParityWithBuildAnimationNode"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ParityWithBuildAnimationNode","Output":"=== RUN TestLowerAnimation_ParityWithBuildAnimationNode\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ParityWithBuildAnimationNode","Output":"--- PASS: TestLowerAnimation_ParityWithBuildAnimationNode (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ParityWithBuildAnimationNode","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_TargetNestedAndSized"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_TargetNestedAndSized","Output":"=== RUN TestLowerAnimation_TargetNestedAndSized\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_TargetNestedAndSized","Output":"--- PASS: TestLowerAnimation_TargetNestedAndSized (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_TargetNestedAndSized","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ServedBundle"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ServedBundle","Output":"=== RUN TestLowerAnimation_ServedBundle\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ServedBundle","Output":"--- PASS: TestLowerAnimation_ServedBundle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_ServedBundle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert","Output":"=== RUN TestLowerAnimation_FallsThroughInert\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/asset_missing_target"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/asset_missing_target","Output":"=== RUN TestLowerAnimation_FallsThroughInert/asset_missing_target\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/asset_missing_target","Output":"--- PASS: TestLowerAnimation_FallsThroughInert/asset_missing_target (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/asset_missing_target","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/target_node_absent_from_layout"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/target_node_absent_from_layout","Output":"=== RUN TestLowerAnimation_FallsThroughInert/target_node_absent_from_layout\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/target_node_absent_from_layout","Output":"--- PASS: TestLowerAnimation_FallsThroughInert/target_node_absent_from_layout (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/target_node_absent_from_layout","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/unknown_animation_id"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/unknown_animation_id","Output":"=== RUN TestLowerAnimation_FallsThroughInert/unknown_animation_id\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/unknown_animation_id","Output":"--- PASS: TestLowerAnimation_FallsThroughInert/unknown_animation_id (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/unknown_animation_id","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/missing_animation_id"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/missing_animation_id","Output":"=== RUN TestLowerAnimation_FallsThroughInert/missing_animation_id\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/missing_animation_id","Output":"--- PASS: TestLowerAnimation_FallsThroughInert/missing_animation_id (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/missing_animation_id","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/empty_catalogue"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/empty_catalogue","Output":"=== RUN TestLowerAnimation_FallsThroughInert/empty_catalogue\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/empty_catalogue","Output":"--- PASS: TestLowerAnimation_FallsThroughInert/empty_catalogue (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert/empty_catalogue","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert","Output":"--- PASS: TestLowerAnimation_FallsThroughInert (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_FallsThroughInert","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_OverlayDefaultsToNodeID"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_OverlayDefaultsToNodeID","Output":"=== RUN TestLowerAnimation_OverlayDefaultsToNodeID\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_OverlayDefaultsToNodeID","Output":"--- PASS: TestLowerAnimation_OverlayDefaultsToNodeID (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_OverlayDefaultsToNodeID","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_LSMLHashUnperturbed"} +{"Time":"2026-10-09T10:40:01.4594188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_LSMLHashUnperturbed","Output":"=== RUN TestLowerAnimation_LSMLHashUnperturbed\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_LSMLHashUnperturbed","Output":"--- PASS: TestLowerAnimation_LSMLHashUnperturbed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerAnimation_LSMLHashUnperturbed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Bundle"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Bundle","Output":"=== RUN TestLowerRenderProps_Bundle\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Bundle","Output":"--- PASS: TestLowerRenderProps_Bundle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Bundle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Pure"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Pure","Output":"=== RUN TestLowerRenderProps_Pure\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Pure","Output":"--- PASS: TestLowerRenderProps_Pure (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_Pure","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity","Output":"=== RUN TestSplitSizeFastPathParity\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/ordinary_object_with_nested_unrelated_values"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/ordinary_object_with_nested_unrelated_values","Output":"=== RUN TestSplitSizeFastPathParity/ordinary_object_with_nested_unrelated_values\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/ordinary_object_with_nested_unrelated_values","Output":"--- PASS: TestSplitSizeFastPathParity/ordinary_object_with_nested_unrelated_values (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/ordinary_object_with_nested_unrelated_values","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/duplicate_dimensions_keep_last_values"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/duplicate_dimensions_keep_last_values","Output":"=== RUN TestSplitSizeFastPathParity/duplicate_dimensions_keep_last_values\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/duplicate_dimensions_keep_last_values","Output":"--- PASS: TestSplitSizeFastPathParity/duplicate_dimensions_keep_last_values (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/duplicate_dimensions_keep_last_values","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/property_names_remain_case_sensitive"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/property_names_remain_case_sensitive","Output":"=== RUN TestSplitSizeFastPathParity/property_names_remain_case_sensitive\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/property_names_remain_case_sensitive","Output":"--- PASS: TestSplitSizeFastPathParity/property_names_remain_case_sensitive (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/property_names_remain_case_sensitive","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_property_name_uses_compatibility_path"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_property_name_uses_compatibility_path","Output":"=== RUN TestSplitSizeFastPathParity/escaped_property_name_uses_compatibility_path\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_property_name_uses_compatibility_path","Output":"--- PASS: TestSplitSizeFastPathParity/escaped_property_name_uses_compatibility_path (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_property_name_uses_compatibility_path","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_value_uses_compatibility_path"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_value_uses_compatibility_path","Output":"=== RUN TestSplitSizeFastPathParity/escaped_value_uses_compatibility_path\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_value_uses_compatibility_path","Output":"--- PASS: TestSplitSizeFastPathParity/escaped_value_uses_compatibility_path (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/escaped_value_uses_compatibility_path","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/unknown_escaped_value_uses_compatibility_path"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/unknown_escaped_value_uses_compatibility_path","Output":"=== RUN TestSplitSizeFastPathParity/unknown_escaped_value_uses_compatibility_path\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/unknown_escaped_value_uses_compatibility_path","Output":"--- PASS: TestSplitSizeFastPathParity/unknown_escaped_value_uses_compatibility_path (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/unknown_escaped_value_uses_compatibility_path","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_object"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_object","Output":"=== RUN TestSplitSizeFastPathParity/empty_object\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_object","Output":"--- PASS: TestSplitSizeFastPathParity/empty_object (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_object","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/null"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/null","Output":"=== RUN TestSplitSizeFastPathParity/null\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/null","Output":"--- PASS: TestSplitSizeFastPathParity/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/array"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/array","Output":"=== RUN TestSplitSizeFastPathParity/array\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/array","Output":"--- PASS: TestSplitSizeFastPathParity/array (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/array","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/scalar"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/scalar","Output":"=== RUN TestSplitSizeFastPathParity/scalar\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/scalar","Output":"--- PASS: TestSplitSizeFastPathParity/scalar (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/scalar","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member","Output":"=== RUN TestSplitSizeFastPathParity/malformed_member\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member","Output":"--- PASS: TestSplitSizeFastPathParity/malformed_member (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member_after_dimension"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member_after_dimension","Output":"=== RUN TestSplitSizeFastPathParity/malformed_member_after_dimension\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member_after_dimension","Output":"--- PASS: TestSplitSizeFastPathParity/malformed_member_after_dimension (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/malformed_member_after_dimension","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/trailing_data"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/trailing_data","Output":"=== RUN TestSplitSizeFastPathParity/trailing_data\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/trailing_data","Output":"--- PASS: TestSplitSizeFastPathParity/trailing_data (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/trailing_data","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_input"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_input","Output":"=== RUN TestSplitSizeFastPathParity/empty_input\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_input","Output":"--- PASS: TestSplitSizeFastPathParity/empty_input (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity/empty_input","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity","Output":"--- PASS: TestSplitSizeFastPathParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathOwnsRawMessages"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathOwnsRawMessages","Output":"=== RUN TestSplitSizeFastPathOwnsRawMessages\n"} +{"Time":"2026-10-09T10:40:01.4599511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathOwnsRawMessages","Output":"--- PASS: TestSplitSizeFastPathOwnsRawMessages (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestSplitSizeFastPathOwnsRawMessages","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity","Output":"=== RUN TestLowerTextStyleFastPathParity\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/ordinary_nested_values"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/ordinary_nested_values","Output":"=== RUN TestLowerTextStyleFastPathParity/ordinary_nested_values\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/ordinary_nested_values","Output":"--- PASS: TestLowerTextStyleFastPathParity/ordinary_nested_values (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/ordinary_nested_values","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/duplicate_mapped_key_keeps_last_value"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/duplicate_mapped_key_keeps_last_value","Output":"=== RUN TestLowerTextStyleFastPathParity/duplicate_mapped_key_keeps_last_value\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/duplicate_mapped_key_keeps_last_value","Output":"--- PASS: TestLowerTextStyleFastPathParity/duplicate_mapped_key_keeps_last_value (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/duplicate_mapped_key_keeps_last_value","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/property_names_remain_case_sensitive"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/property_names_remain_case_sensitive","Output":"=== RUN TestLowerTextStyleFastPathParity/property_names_remain_case_sensitive\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/property_names_remain_case_sensitive","Output":"--- PASS: TestLowerTextStyleFastPathParity/property_names_remain_case_sensitive (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/property_names_remain_case_sensitive","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_property_name_uses_compatibility_path"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_property_name_uses_compatibility_path","Output":"=== RUN TestLowerTextStyleFastPathParity/escaped_property_name_uses_compatibility_path\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_property_name_uses_compatibility_path","Output":"--- PASS: TestLowerTextStyleFastPathParity/escaped_property_name_uses_compatibility_path (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_property_name_uses_compatibility_path","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_value_uses_compatibility_path"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_value_uses_compatibility_path","Output":"=== RUN TestLowerTextStyleFastPathParity/escaped_value_uses_compatibility_path\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_value_uses_compatibility_path","Output":"--- PASS: TestLowerTextStyleFastPathParity/escaped_value_uses_compatibility_path (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/escaped_value_uses_compatibility_path","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/null"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/null","Output":"=== RUN TestLowerTextStyleFastPathParity/null\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/null","Output":"--- PASS: TestLowerTextStyleFastPathParity/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/array"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/array","Output":"=== RUN TestLowerTextStyleFastPathParity/array\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/array","Output":"--- PASS: TestLowerTextStyleFastPathParity/array (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/array","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/malformed"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/malformed","Output":"=== RUN TestLowerTextStyleFastPathParity/malformed\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/malformed","Output":"--- PASS: TestLowerTextStyleFastPathParity/malformed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity/malformed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity","Output":"--- PASS: TestLowerTextStyleFastPathParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/null"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/null\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/true"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/true\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/false"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/false\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/0"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/0\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/-2.5e3"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[]"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/[]\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{}"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/{}\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textTransform/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textTransform/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textTransform/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/null"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/null\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/true"} +{"Time":"2026-10-09T10:40:01.460477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/true\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/false"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/false\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/0"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/0\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[]"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[]\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{}"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{}\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textDecoration/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/null"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/null\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/true"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/true\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/false"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/false\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/0"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/0\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[]"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/[]\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{}"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/{}\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontSize/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontSize/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontSize/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/null"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/null\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/true"} +{"Time":"2026-10-09T10:40:01.4610006+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/true\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/false"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/false\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/0"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/0\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[]"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[]\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{}"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{}\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontWeight/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/null"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/null\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/true"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/true\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/false"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/false\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/0"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/0\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4615244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[]"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/[]\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{}"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/{}\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/color/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/color/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/color/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/null"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/null\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/true"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/true\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/false"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/false\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/0"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/0\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4620534+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[]"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[]\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{}"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{}\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/lineHeight/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/null"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/null\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/true"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/true\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/false"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/false\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/0"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/0\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[]"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[]\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{}"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{}\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontStyle/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/null"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/null\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/true"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/true\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/false"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/false\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/0"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/0\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4625828+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[]"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[]\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{}"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{}\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/fontFamily/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/null"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/null\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/true"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/true\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/false"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/false\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/0"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/0\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[]"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/[]\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{}"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/{}\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/textAlign/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/textAlign/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/textAlign/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/null"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/null","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/null\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/null","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/null (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/null","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/true"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/true","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/true\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/true","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/true (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/true","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/false"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/false","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/false\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/false","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/false (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/false","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/0"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/0","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/0\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/0","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/-2.5e3"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/-2.5e3","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/-2.5e3\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/-2.5e3","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/-2.5e3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/-2.5e3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"plain_text\""} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"plain_text\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"plain_text\"\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"plain_text\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"plain_text\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"plain_text\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"brace_}_bracket_]\""} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"brace_}_bracket_]\"","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"brace_}_bracket_]\"\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"brace_}_bracket_]\"","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"brace_}_bracket_]\" (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/\"brace_}_bracket_]\"","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[]"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[]\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[1,{\"nested\":[true,false]}]"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[1,{\"nested\":[true,false]}]","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[1,{\"nested\":[true,false]}]\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[1,{\"nested\":[true,false]}]","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[1,{\"nested\":[true,false]}] (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/[1,{\"nested\":[true,false]}]","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{}"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{}\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{\"nested\":{\"x\":1}}"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{\"nested\":{\"x\":1}}","Output":"=== RUN TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{\"nested\":{\"x\":1}}\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{\"nested\":{\"x\":1}}","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{\"nested\":{\"x\":1}} (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4630978+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity/letterSpacing/{\"nested\":{\"x\":1}}","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity","Output":"--- PASS: TestLowerTextStyleFastGeneratedValuesParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastGeneratedValuesParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathOwnsMappedRawMessages"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathOwnsMappedRawMessages","Output":"=== RUN TestLowerTextStyleFastPathOwnsMappedRawMessages\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathOwnsMappedRawMessages","Output":"--- PASS: TestLowerTextStyleFastPathOwnsMappedRawMessages (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTextStyleFastPathOwnsMappedRawMessages","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_ContentKeyTextToValue"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_ContentKeyTextToValue","Output":"=== RUN TestLowerText_ContentKeyTextToValue\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_ContentKeyTextToValue","Output":"--- PASS: TestLowerText_ContentKeyTextToValue (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_ContentKeyTextToValue","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_MetadataGeometryBecomesRuntimeBounds"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_MetadataGeometryBecomesRuntimeBounds","Output":"=== RUN TestLowerText_MetadataGeometryBecomesRuntimeBounds\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_MetadataGeometryBecomesRuntimeBounds","Output":"--- PASS: TestLowerText_MetadataGeometryBecomesRuntimeBounds (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerText_MetadataGeometryBecomesRuntimeBounds","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/stack"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/stack","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit/stack\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/stack","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit/stack (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/stack","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/grid"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/grid","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit/grid\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/grid","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit/grid (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/grid","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/media"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/media","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit/media\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/media","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit/media (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/media","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/repeat"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/repeat","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit/repeat\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/repeat","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit/repeat (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4636299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/repeat","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/instance"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/instance","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit/instance\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/instance","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit/instance (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/instance","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/my.component@1"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/my.component@1","Output":"=== RUN TestLowerRenderProps_LayoutKindSizeSplit/my.component@1\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/my.component@1","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit/my.component@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit/my.component@1","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit","Output":"--- PASS: TestLowerRenderProps_LayoutKindSizeSplit (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_LayoutKindSizeSplit","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_BoundFontSize"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_BoundFontSize","Output":"=== RUN TestLowerRenderProps_BoundFontSize\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_BoundFontSize","Output":"--- PASS: TestLowerRenderProps_BoundFontSize (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerRenderProps_BoundFontSize","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_M10ParityTS"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_M10ParityTS","Output":"=== RUN TestLowerTransitions_M10ParityTS\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_M10ParityTS","Output":"--- PASS: TestLowerTransitions_M10ParityTS (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_M10ParityTS","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes","Output":"=== RUN TestLowerTransitions_OracleShapes\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in_→_cubic-in"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in_→_cubic-in","Output":"=== RUN TestLowerTransitions_OracleShapes/ease-in_→_cubic-in\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in_→_cubic-in","Output":"--- PASS: TestLowerTransitions_OracleShapes/ease-in_→_cubic-in (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in_→_cubic-in","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in-out_→_cubic-in-out"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in-out_→_cubic-in-out","Output":"=== RUN TestLowerTransitions_OracleShapes/ease-in-out_→_cubic-in-out\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in-out_→_cubic-in-out","Output":"--- PASS: TestLowerTransitions_OracleShapes/ease-in-out_→_cubic-in-out (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/ease-in-out_→_cubic-in-out","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/unknown_easing_→_ease_omitted_(mapEase_default)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/unknown_easing_→_ease_omitted_(mapEase_default)","Output":"=== RUN TestLowerTransitions_OracleShapes/unknown_easing_→_ease_omitted_(mapEase_default)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/unknown_easing_→_ease_omitted_(mapEase_default)","Output":"--- PASS: TestLowerTransitions_OracleShapes/unknown_easing_→_ease_omitted_(mapEase_default) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/unknown_easing_→_ease_omitted_(mapEase_default)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/rotate_+_translate_fan-out_(oracle:_translate+rotate)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/rotate_+_translate_fan-out_(oracle:_translate+rotate)","Output":"=== RUN TestLowerTransitions_OracleShapes/rotate_+_translate_fan-out_(oracle:_translate+rotate)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/rotate_+_translate_fan-out_(oracle:_translate+rotate)","Output":"--- PASS: TestLowerTransitions_OracleShapes/rotate_+_translate_fan-out_(oracle:_translate+rotate) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/rotate_+_translate_fan-out_(oracle:_translate+rotate)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/transition_present,_no_animated_prop_→_omitted_(Object.keys_guard)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/transition_present,_no_animated_prop_→_omitted_(Object.keys_guard)","Output":"=== RUN TestLowerTransitions_OracleShapes/transition_present,_no_animated_prop_→_omitted_(Object.keys_guard)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/transition_present,_no_animated_prop_→_omitted_(Object.keys_guard)","Output":"--- PASS: TestLowerTransitions_OracleShapes/transition_present,_no_animated_prop_→_omitted_(Object.keys_guard) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/transition_present,_no_animated_prop_→_omitted_(Object.keys_guard)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_easing_(oracle:_no-easing)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_easing_(oracle:_no-easing)","Output":"=== RUN TestLowerTransitions_OracleShapes/tween_no_easing_(oracle:_no-easing)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_easing_(oracle:_no-easing)","Output":"--- PASS: TestLowerTransitions_OracleShapes/tween_no_easing_(oracle:_no-easing) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_easing_(oracle:_no-easing)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_duration_→_200_(oracle:_no-duration)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_duration_→_200_(oracle:_no-duration)","Output":"=== RUN TestLowerTransitions_OracleShapes/tween_no_duration_→_200_(oracle:_no-duration)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_duration_→_200_(oracle:_no-duration)","Output":"--- PASS: TestLowerTransitions_OracleShapes/tween_no_duration_→_200_(oracle:_no-duration) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/tween_no_duration_→_200_(oracle:_no-duration)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_with_params_(oracle:_spring)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_with_params_(oracle:_spring)","Output":"=== RUN TestLowerTransitions_OracleShapes/spring_with_params_(oracle:_spring)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_with_params_(oracle:_spring)","Output":"--- PASS: TestLowerTransitions_OracleShapes/spring_with_params_(oracle:_spring) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_with_params_(oracle:_spring)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_bare"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_bare","Output":"=== RUN TestLowerTransitions_OracleShapes/spring_bare\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_bare","Output":"--- PASS: TestLowerTransitions_OracleShapes/spring_bare (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/spring_bare","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/from_only,_no_transition_→_omitted_(oracle:_from-only-no-transition_=_undefined)"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/from_only,_no_transition_→_omitted_(oracle:_from-only-no-transition_=_undefined)","Output":"=== RUN TestLowerTransitions_OracleShapes/from_only,_no_transition_→_omitted_(oracle:_from-only-no-transition_=_undefined)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/from_only,_no_transition_→_omitted_(oracle:_from-only-no-transition_=_undefined)","Output":"--- PASS: TestLowerTransitions_OracleShapes/from_only,_no_transition_→_omitted_(oracle:_from-only-no-transition_=_undefined) (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes/from_only,_no_transition_→_omitted_(oracle:_from-only-no-transition_=_undefined)","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes","Output":"--- PASS: TestLowerTransitions_OracleShapes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_OracleShapes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat","Output":"=== RUN TestLowerTransitions_RetroCompat\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/per-prop_passthrough"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/per-prop_passthrough","Output":"=== RUN TestLowerTransitions_RetroCompat/per-prop_passthrough\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/per-prop_passthrough","Output":"--- PASS: TestLowerTransitions_RetroCompat/per-prop_passthrough (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/per-prop_passthrough","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/unknown_shape_passthrough"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/unknown_shape_passthrough","Output":"=== RUN TestLowerTransitions_RetroCompat/unknown_shape_passthrough\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/unknown_shape_passthrough","Output":"--- PASS: TestLowerTransitions_RetroCompat/unknown_shape_passthrough (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/unknown_shape_passthrough","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/no_transitions"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/no_transitions","Output":"=== RUN TestLowerTransitions_RetroCompat/no_transitions\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/no_transitions","Output":"--- PASS: TestLowerTransitions_RetroCompat/no_transitions (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/no_transitions","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/from-only_envelope_keeps_mount-play,_drops_transitions"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/from-only_envelope_keeps_mount-play,_drops_transitions","Output":"=== RUN TestLowerTransitions_RetroCompat/from-only_envelope_keeps_mount-play,_drops_transitions\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/from-only_envelope_keeps_mount-play,_drops_transitions","Output":"--- PASS: TestLowerTransitions_RetroCompat/from-only_envelope_keeps_mount-play,_drops_transitions (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat/from-only_envelope_keeps_mount-play,_drops_transitions","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat","Output":"--- PASS: TestLowerTransitions_RetroCompat (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RetroCompat","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RoundTrip"} +{"Time":"2026-10-09T10:40:01.4641478+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RoundTrip","Output":"=== RUN TestLowerTransitions_RoundTrip\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RoundTrip","Output":"--- PASS: TestLowerTransitions_RoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_RoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_LSMLHashUnperturbed"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_LSMLHashUnperturbed","Output":"=== RUN TestLowerTransitions_LSMLHashUnperturbed\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_LSMLHashUnperturbed","Output":"--- PASS: TestLowerTransitions_LSMLHashUnperturbed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerTransitions_LSMLHashUnperturbed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_M10ServedBundle"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_M10ServedBundle","Output":"=== RUN TestLowerWipeCover_M10ServedBundle\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_M10ServedBundle","Output":"--- PASS: TestLowerWipeCover_M10ServedBundle (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_M10ServedBundle","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_ParityWithBuildWipeCoverNode"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_ParityWithBuildWipeCoverNode","Output":"=== RUN TestLowerWipeCover_ParityWithBuildWipeCoverNode\n"} +{"Time":"2026-10-09T10:40:01.4646791+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_ParityWithBuildWipeCoverNode","Output":"--- PASS: TestLowerWipeCover_ParityWithBuildWipeCoverNode (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_ParityWithBuildWipeCoverNode","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_KeyframesRoundTrip"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_KeyframesRoundTrip","Output":"=== RUN TestLowerWipeCover_KeyframesRoundTrip\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_KeyframesRoundTrip","Output":"--- PASS: TestLowerWipeCover_KeyframesRoundTrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_KeyframesRoundTrip","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_LSMLHashUnperturbed"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_LSMLHashUnperturbed","Output":"=== RUN TestLowerWipeCover_LSMLHashUnperturbed\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_LSMLHashUnperturbed","Output":"--- PASS: TestLowerWipeCover_LSMLHashUnperturbed (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_LSMLHashUnperturbed","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough","Output":"=== RUN TestLowerWipeCover_MalformedFallsThrough\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/zero_timing"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/zero_timing","Output":"=== RUN TestLowerWipeCover_MalformedFallsThrough/zero_timing\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/zero_timing","Output":"--- PASS: TestLowerWipeCover_MalformedFallsThrough/zero_timing (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/zero_timing","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/non-integer_timing"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/non-integer_timing","Output":"=== RUN TestLowerWipeCover_MalformedFallsThrough/non-integer_timing\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/non-integer_timing","Output":"--- PASS: TestLowerWipeCover_MalformedFallsThrough/non-integer_timing (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/non-integer_timing","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/missing_leaf"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/missing_leaf","Output":"=== RUN TestLowerWipeCover_MalformedFallsThrough/missing_leaf\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/missing_leaf","Output":"--- PASS: TestLowerWipeCover_MalformedFallsThrough/missing_leaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough/missing_leaf","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough","Output":"--- PASS: TestLowerWipeCover_MalformedFallsThrough (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestLowerWipeCover_MalformedFallsThrough","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CarriesNamedPorts"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CarriesNamedPorts","Output":"=== RUN TestCompile_CarriesNamedPorts\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CarriesNamedPorts","Output":"--- PASS: TestCompile_CarriesNamedPorts (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_CarriesNamedPorts","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NamedPortsPrefixedPerBlueprint"} +{"Time":"2026-10-09T10:40:01.4651948+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NamedPortsPrefixedPerBlueprint","Output":"=== RUN TestCompile_NamedPortsPrefixedPerBlueprint\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NamedPortsPrefixedPerBlueprint","Output":"--- PASS: TestCompile_NamedPortsPrefixedPerBlueprint (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_NamedPortsPrefixedPerBlueprint","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGraphNode_NamedPortsWireCompat"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGraphNode_NamedPortsWireCompat","Output":"=== RUN TestGraphNode_NamedPortsWireCompat\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGraphNode_NamedPortsWireCompat","Output":"--- PASS: TestGraphNode_NamedPortsWireCompat (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestGraphNode_NamedPortsWireCompat","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_MapsEntryAndBinding"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_MapsEntryAndBinding","Output":"=== RUN TestCompile_OnPlatformEvent_MapsEntryAndBinding\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_MapsEntryAndBinding","Output":"--- PASS: TestCompile_OnPlatformEvent_MapsEntryAndBinding (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_MapsEntryAndBinding","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_InvalidChannelRejected"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_InvalidChannelRejected","Output":"=== RUN TestCompile_OnPlatformEvent_InvalidChannelRejected\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_InvalidChannelRejected","Output":"--- PASS: TestCompile_OnPlatformEvent_InvalidChannelRejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_InvalidChannelRejected","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_DeterministicLeaf"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_DeterministicLeaf","Output":"=== RUN TestCompile_OnPlatformEvent_DeterministicLeaf\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_DeterministicLeaf","Output":"--- PASS: TestCompile_OnPlatformEvent_DeterministicLeaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompile_OnPlatformEvent_DeterministicLeaf","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_RejectsReservedKey"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_RejectsReservedKey","Output":"=== RUN TestValidateBlueprintKeys_RejectsReservedKey\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_RejectsReservedKey","Output":"--- PASS: TestValidateBlueprintKeys_RejectsReservedKey (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_RejectsReservedKey","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_AllowsEmptyAndNormalKeys"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_AllowsEmptyAndNormalKeys","Output":"=== RUN TestValidateBlueprintKeys_AllowsEmptyAndNormalKeys\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_AllowsEmptyAndNormalKeys","Output":"--- PASS: TestValidateBlueprintKeys_AllowsEmptyAndNormalKeys (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestValidateBlueprintKeys_AllowsEmptyAndNormalKeys","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestReservedKeyMatchesAPIToken"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestReservedKeyMatchesAPIToken","Output":"=== RUN TestReservedKeyMatchesAPIToken\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestReservedKeyMatchesAPIToken","Output":"--- PASS: TestReservedKeyMatchesAPIToken (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4657317+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestReservedKeyMatchesAPIToken","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_FoldsDescriptor"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_FoldsDescriptor","Output":"=== RUN TestResolveSourceReads_FoldsDescriptor\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_FoldsDescriptor","Output":"--- PASS: TestResolveSourceReads_FoldsDescriptor (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_FoldsDescriptor","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared","Output":"=== RUN TestResolveSourceReads_RejectsUndeclared\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/unknown_source_id"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/unknown_source_id","Output":"=== RUN TestResolveSourceReads_RejectsUndeclared/unknown_source_id\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/unknown_source_id","Output":"--- PASS: TestResolveSourceReads_RejectsUndeclared/unknown_source_id (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/unknown_source_id","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/empty_source_id"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/empty_source_id","Output":"=== RUN TestResolveSourceReads_RejectsUndeclared/empty_source_id\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/empty_source_id","Output":"--- PASS: TestResolveSourceReads_RejectsUndeclared/empty_source_id (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared/empty_source_id","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared","Output":"--- PASS: TestResolveSourceReads_RejectsUndeclared (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_RejectsUndeclared","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_IgnoresOtherNodes"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_IgnoresOtherNodes","Output":"=== RUN TestResolveSourceReads_IgnoresOtherNodes\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_IgnoresOtherNodes","Output":"--- PASS: TestResolveSourceReads_IgnoresOtherNodes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestResolveSourceReads_IgnoresOtherNodes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLProducesSolarBundleAndDefaults"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLProducesSolarBundleAndDefaults","Output":"=== RUN TestCompileStaticLSMLProducesSolarBundleAndDefaults\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLProducesSolarBundleAndDefaults","Output":"--- PASS: TestCompileStaticLSMLProducesSolarBundleAndDefaults (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLProducesSolarBundleAndDefaults","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLRejectsMissingRenderTree"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLRejectsMissingRenderTree","Output":"=== RUN TestCompileStaticLSMLRejectsMissingRenderTree\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLRejectsMissingRenderTree","Output":"--- PASS: TestCompileStaticLSMLRejectsMissingRenderTree (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLRejectsMissingRenderTree","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLKeepsValidChildrenAroundMalformedEntries"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLKeepsValidChildrenAroundMalformedEntries","Output":"=== RUN TestCompileStaticLSMLKeepsValidChildrenAroundMalformedEntries\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLKeepsValidChildrenAroundMalformedEntries","Output":"--- PASS: TestCompileStaticLSMLKeepsValidChildrenAroundMalformedEntries (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLKeepsValidChildrenAroundMalformedEntries","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONFieldsMatchesEncodingJSON"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONFieldsMatchesEncodingJSON","Output":"=== RUN TestScanStaticJSONFieldsMatchesEncodingJSON\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONFieldsMatchesEncodingJSON","Output":"--- PASS: TestScanStaticJSONFieldsMatchesEncodingJSON (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONFieldsMatchesEncodingJSON","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONArrayElementsMatchesEncodingJSON"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONArrayElementsMatchesEncodingJSON","Output":"=== RUN TestScanStaticJSONArrayElementsMatchesEncodingJSON\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONArrayElementsMatchesEncodingJSON","Output":"--- PASS: TestScanStaticJSONArrayElementsMatchesEncodingJSON (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestScanStaticJSONArrayElementsMatchesEncodingJSON","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLFastNodeDecoderPreservesDuplicateAndEscapedKeys"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLFastNodeDecoderPreservesDuplicateAndEscapedKeys","Output":"=== RUN TestCompileStaticLSMLFastNodeDecoderPreservesDuplicateAndEscapedKeys\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLFastNodeDecoderPreservesDuplicateAndEscapedKeys","Output":"--- PASS: TestCompileStaticLSMLFastNodeDecoderPreservesDuplicateAndEscapedKeys (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4662476+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLFastNodeDecoderPreservesDuplicateAndEscapedKeys","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticRenderBundleOwnsInputLayoutBytes"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticRenderBundleOwnsInputLayoutBytes","Output":"=== RUN TestCompileStaticRenderBundleOwnsInputLayoutBytes\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticRenderBundleOwnsInputLayoutBytes","Output":"--- PASS: TestCompileStaticRenderBundleOwnsInputLayoutBytes (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticRenderBundleOwnsInputLayoutBytes","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLPreservesEditableBindAnimate"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLPreservesEditableBindAnimate","Output":"=== RUN TestCompileStaticLSMLPreservesEditableBindAnimate\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLPreservesEditableBindAnimate","Output":"--- PASS: TestCompileStaticLSMLPreservesEditableBindAnimate (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestCompileStaticLSMLPreservesEditableBindAnimate","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment","Output":"=== RUN TestRewriteJSONFastPathPreservesUnchangedFragment\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/defensive"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/defensive","Output":"=== RUN TestRewriteJSONFastPathPreservesUnchangedFragment/defensive\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/defensive","Output":"--- PASS: TestRewriteJSONFastPathPreservesUnchangedFragment/defensive (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/defensive","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/parent_validated"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/parent_validated","Output":"=== RUN TestRewriteJSONFastPathPreservesUnchangedFragment/parent_validated\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/parent_validated","Output":"--- PASS: TestRewriteJSONFastPathPreservesUnchangedFragment/parent_validated (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment/parent_validated","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment","Output":"--- PASS: TestRewriteJSONFastPathPreservesUnchangedFragment (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathPreservesUnchangedFragment","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/defensive"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/defensive","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/defensive\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/defensive","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/defensive (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/defensive","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/parent_validated"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/parent_validated","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/parent_validated\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/parent_validated","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/parent_validated (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash/parent_validated","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_slash","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/defensive"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/defensive","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/defensive\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/defensive","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/defensive (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/defensive","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/parent_validated"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/parent_validated","Output":"=== RUN TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/parent_validated\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/parent_validated","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/parent_validated (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix/parent_validated","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences/escaped_prefix","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences","Output":"--- PASS: TestRewriteJSONFastPathFallsBackForEscapedAssetReferences (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathFallsBackForEscapedAssetReferences","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathStillRejectsInvalidJSON"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathStillRejectsInvalidJSON","Output":"=== RUN TestRewriteJSONFastPathStillRejectsInvalidJSON\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathStillRejectsInvalidJSON","Output":"--- PASS: TestRewriteJSONFastPathStillRejectsInvalidJSON (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestRewriteJSONFastPathStillRejectsInvalidJSON","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath","Output":"=== RUN TestStaticRenderBundleMatchesSerializedPath\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/minimal"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/minimal","Output":"=== RUN TestStaticRenderBundleMatchesSerializedPath/minimal\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/minimal","Output":"--- PASS: TestStaticRenderBundleMatchesSerializedPath/minimal (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/minimal","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/assets_and_editable_transitions"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/assets_and_editable_transitions","Output":"=== RUN TestStaticRenderBundleMatchesSerializedPath/assets_and_editable_transitions\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/assets_and_editable_transitions","Output":"--- PASS: TestStaticRenderBundleMatchesSerializedPath/assets_and_editable_transitions (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/assets_and_editable_transitions","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/compiled_passthrough"} +{"Time":"2026-10-09T10:40:01.4667867+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/compiled_passthrough","Output":"=== RUN TestStaticRenderBundleMatchesSerializedPath/compiled_passthrough\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/compiled_passthrough","Output":"--- PASS: TestStaticRenderBundleMatchesSerializedPath/compiled_passthrough (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath/compiled_passthrough","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath","Output":"--- PASS: TestStaticRenderBundleMatchesSerializedPath (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleMatchesSerializedPath","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleDefaultsHaveIndependentOwnership"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleDefaultsHaveIndependentOwnership","Output":"=== RUN TestStaticRenderBundleDefaultsHaveIndependentOwnership\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleDefaultsHaveIndependentOwnership","Output":"--- PASS: TestStaticRenderBundleDefaultsHaveIndependentOwnership (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleDefaultsHaveIndependentOwnership","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleErrorParity"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleErrorParity","Output":"=== RUN TestStaticRenderBundleErrorParity\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleErrorParity","Output":"--- PASS: TestStaticRenderBundleErrorParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestStaticRenderBundleErrorParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap","Output":"=== RUN TestAdaptStaticNodeJSONMatchesDecodedMap\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/duplicate_and_escaped_keys"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/duplicate_and_escaped_keys","Output":"=== RUN TestAdaptStaticNodeJSONMatchesDecodedMap/duplicate_and_escaped_keys\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/duplicate_and_escaped_keys","Output":"--- PASS: TestAdaptStaticNodeJSONMatchesDecodedMap/duplicate_and_escaped_keys (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/duplicate_and_escaped_keys","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/invalid_UTF-8_property_key"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/invalid_UTF-8_property_key","Output":"=== RUN TestAdaptStaticNodeJSONMatchesDecodedMap/invalid_UTF-8_property_key\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/invalid_UTF-8_property_key","Output":"--- PASS: TestAdaptStaticNodeJSONMatchesDecodedMap/invalid_UTF-8_property_key (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap/invalid_UTF-8_property_key","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap","Output":"--- PASS: TestAdaptStaticNodeJSONMatchesDecodedMap (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"TestAdaptStaticNodeJSONMatchesDecodedMap","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity","Output":"=== RUN FuzzScanStaticJSONObjectFieldsParity\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#0"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#0","Output":"=== RUN FuzzScanStaticJSONObjectFieldsParity/seed#0\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#0","Output":"--- PASS: FuzzScanStaticJSONObjectFieldsParity/seed#0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#1"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#1","Output":"=== RUN FuzzScanStaticJSONObjectFieldsParity/seed#1\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#1","Output":"--- PASS: FuzzScanStaticJSONObjectFieldsParity/seed#1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#1","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#2"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#2","Output":"=== RUN FuzzScanStaticJSONObjectFieldsParity/seed#2\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#2","Output":"--- PASS: FuzzScanStaticJSONObjectFieldsParity/seed#2 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#2","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#3"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#3","Output":"=== RUN FuzzScanStaticJSONObjectFieldsParity/seed#3\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#3","Output":"--- PASS: FuzzScanStaticJSONObjectFieldsParity/seed#3 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity/seed#3","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity","Output":"--- PASS: FuzzScanStaticJSONObjectFieldsParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONObjectFieldsParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity"} +{"Time":"2026-10-09T10:40:01.4673045+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity","Output":"=== RUN FuzzScanStaticJSONArrayElementsParity\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#0"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#0","Output":"=== RUN FuzzScanStaticJSONArrayElementsParity/seed#0\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#0","Output":"--- PASS: FuzzScanStaticJSONArrayElementsParity/seed#0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#1"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#1","Output":"=== RUN FuzzScanStaticJSONArrayElementsParity/seed#1\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#1","Output":"--- PASS: FuzzScanStaticJSONArrayElementsParity/seed#1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#1","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#2"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#2","Output":"=== RUN FuzzScanStaticJSONArrayElementsParity/seed#2\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#2","Output":"--- PASS: FuzzScanStaticJSONArrayElementsParity/seed#2 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity/seed#2","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity","Output":"--- PASS: FuzzScanStaticJSONArrayElementsParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzScanStaticJSONArrayElementsParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity","Output":"=== RUN FuzzAdaptStaticNodeJSONParity\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#0"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#0","Output":"=== RUN FuzzAdaptStaticNodeJSONParity/seed#0\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#0","Output":"--- PASS: FuzzAdaptStaticNodeJSONParity/seed#0 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#0","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#1"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#1","Output":"=== RUN FuzzAdaptStaticNodeJSONParity/seed#1\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#1","Output":"--- PASS: FuzzAdaptStaticNodeJSONParity/seed#1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity/seed#1","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity","Output":"--- PASS: FuzzAdaptStaticNodeJSONParity (0.00s)\n"} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Test":"FuzzAdaptStaticNodeJSONParity","Elapsed":0} +{"Time":"2026-10-09T10:40:01.4678442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:01.4732205+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/compiler\t0.945s\n"} +{"Time":"2026-10-09T10:40:01.5126296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/compiler","Elapsed":0.984} +{"Time":"2026-10-09T10:40:01.9901593+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/config"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeDefaultsToBespoke"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeDefaultsToBespoke","Output":"=== RUN TestLoad_LSDPModeDefaultsToBespoke\n"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeDefaultsToBespoke","Output":"--- PASS: TestLoad_LSDPModeDefaultsToBespoke (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeDefaultsToBespoke","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP","Output":"=== RUN TestLoad_LSDPModeParsesDualAndLSDP\n"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/dual"} +{"Time":"2026-10-09T10:40:02.3186189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/dual","Output":"=== RUN TestLoad_LSDPModeParsesDualAndLSDP/dual\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/dual","Output":"--- PASS: TestLoad_LSDPModeParsesDualAndLSDP/dual (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/dual","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/DUAL"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/DUAL","Output":"=== RUN TestLoad_LSDPModeParsesDualAndLSDP/DUAL\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/DUAL","Output":"--- PASS: TestLoad_LSDPModeParsesDualAndLSDP/DUAL (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/DUAL","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/lsdp"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/lsdp","Output":"=== RUN TestLoad_LSDPModeParsesDualAndLSDP/lsdp\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/lsdp","Output":"--- PASS: TestLoad_LSDPModeParsesDualAndLSDP/lsdp (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP/lsdp","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP","Output":"--- PASS: TestLoad_LSDPModeParsesDualAndLSDP (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeParsesDualAndLSDP","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeRejectsUnknown"} +{"Time":"2026-10-09T10:40:02.3191483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeRejectsUnknown","Output":"=== RUN TestLoad_LSDPModeRejectsUnknown\n"} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeRejectsUnknown","Output":"--- PASS: TestLoad_LSDPModeRejectsUnknown (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_LSDPModeRejectsUnknown","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileDefaultsToEmbeddedLocal"} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileDefaultsToEmbeddedLocal","Output":"=== RUN TestLoad_ProfileDefaultsToEmbeddedLocal\n"} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileDefaultsToEmbeddedLocal","Output":"--- PASS: TestLoad_ProfileDefaultsToEmbeddedLocal (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileDefaultsToEmbeddedLocal","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRetiredAntenne"} +{"Time":"2026-10-09T10:40:02.3196772+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRetiredAntenne","Output":"=== RUN TestLoad_ProfileRejectsRetiredAntenne\n"} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRetiredAntenne","Output":"--- PASS: TestLoad_ProfileRejectsRetiredAntenne (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRetiredAntenne","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalCollapsesToLoopback"} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalCollapsesToLoopback","Output":"=== RUN TestLoad_ProfileEmbeddedLocalCollapsesToLoopback\n"} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalCollapsesToLoopback","Output":"--- PASS: TestLoad_ProfileEmbeddedLocalCollapsesToLoopback (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalCollapsesToLoopback","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalRespectsExplicitListen"} +{"Time":"2026-10-09T10:40:02.3202034+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalRespectsExplicitListen","Output":"=== RUN TestLoad_ProfileEmbeddedLocalRespectsExplicitListen\n"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalRespectsExplicitListen","Output":"--- PASS: TestLoad_ProfileEmbeddedLocalRespectsExplicitListen (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileEmbeddedLocalRespectsExplicitListen","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners","Output":"=== RUN TestLoad_ProfileRejectsNonLoopbackListeners\n"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-listen"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-listen","Output":"=== RUN TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-listen\n"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-listen","Output":"--- PASS: TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-listen (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-listen","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/public-listen"} +{"Time":"2026-10-09T10:40:02.3207323+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/public-listen","Output":"=== RUN TestLoad_ProfileRejectsNonLoopbackListeners/public-listen\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/public-listen","Output":"--- PASS: TestLoad_ProfileRejectsNonLoopbackListeners/public-listen (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/public-listen","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-internal"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-internal","Output":"=== RUN TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-internal\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-internal","Output":"--- PASS: TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-internal (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners/wildcard-internal","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners","Output":"--- PASS: TestLoad_ProfileRejectsNonLoopbackListeners (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsNonLoopbackListeners","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRemotePublicBaseURL"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRemotePublicBaseURL","Output":"=== RUN TestLoad_ProfileRejectsRemotePublicBaseURL\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRemotePublicBaseURL","Output":"--- PASS: TestLoad_ProfileRejectsRemotePublicBaseURL (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsRemotePublicBaseURL","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsLegacyDatabaseURL"} +{"Time":"2026-10-09T10:40:02.3212609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsLegacyDatabaseURL","Output":"=== RUN TestLoad_ProfileRejectsLegacyDatabaseURL\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsLegacyDatabaseURL","Output":"--- PASS: TestLoad_ProfileRejectsLegacyDatabaseURL (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsLegacyDatabaseURL","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresStoreAndBases"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresStoreAndBases","Output":"=== RUN TestLoad_EmbeddedLocalRequiresStoreAndBases\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresStoreAndBases","Output":"--- PASS: TestLoad_EmbeddedLocalRequiresStoreAndBases (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresStoreAndBases","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge","Output":"=== RUN TestLoad_EmbeddedLocalRequiresEachEdge\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_CANVAS_BASE_URL"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_CANVAS_BASE_URL","Output":"=== RUN TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_CANVAS_BASE_URL\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_CANVAS_BASE_URL","Output":"--- PASS: TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_CANVAS_BASE_URL (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_CANVAS_BASE_URL","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3217894+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_BLUE_BASE_URL"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_BLUE_BASE_URL","Output":"=== RUN TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_BLUE_BASE_URL\n"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_BLUE_BASE_URL","Output":"--- PASS: TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_BLUE_BASE_URL (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_BLUE_BASE_URL","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_ZABGATE_URL"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_ZABGATE_URL","Output":"=== RUN TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_ZABGATE_URL\n"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_ZABGATE_URL","Output":"--- PASS: TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_ZABGATE_URL (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge/missing_ORION_ZABGATE_URL","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge","Output":"--- PASS: TestLoad_EmbeddedLocalRequiresEachEdge (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresEachEdge","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalMirrorRootOptional"} +{"Time":"2026-10-09T10:40:02.3223164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalMirrorRootOptional","Output":"=== RUN TestLoad_EmbeddedLocalMirrorRootOptional\n"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalMirrorRootOptional","Output":"--- PASS: TestLoad_EmbeddedLocalMirrorRootOptional (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalMirrorRootOptional","Elapsed":0} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalBundleOptional"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalBundleOptional","Output":"=== RUN TestLoad_EmbeddedLocalBundleOptional\n"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalBundleOptional","Output":"--- PASS: TestLoad_EmbeddedLocalBundleOptional (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalBundleOptional","Elapsed":0} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresHandshakeSecret"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresHandshakeSecret","Output":"=== RUN TestLoad_EmbeddedLocalRequiresHandshakeSecret\n"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresHandshakeSecret","Output":"--- PASS: TestLoad_EmbeddedLocalRequiresHandshakeSecret (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalRequiresHandshakeSecret","Elapsed":0} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalCarriesSecretAndUser"} +{"Time":"2026-10-09T10:40:02.322841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalCarriesSecretAndUser","Output":"=== RUN TestLoad_EmbeddedLocalCarriesSecretAndUser\n"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalCarriesSecretAndUser","Output":"--- PASS: TestLoad_EmbeddedLocalCarriesSecretAndUser (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_EmbeddedLocalCarriesSecretAndUser","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsUnknown"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsUnknown","Output":"=== RUN TestLoad_ProfileRejectsUnknown\n"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsUnknown","Output":"--- PASS: TestLoad_ProfileRejectsUnknown (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileRejectsUnknown","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileAbsentEqualsExplicitLocal"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileAbsentEqualsExplicitLocal","Output":"=== RUN TestLoad_ProfileAbsentEqualsExplicitLocal\n"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileAbsentEqualsExplicitLocal","Output":"--- PASS: TestLoad_ProfileAbsentEqualsExplicitLocal (0.00s)\n"} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Test":"TestLoad_ProfileAbsentEqualsExplicitLocal","Elapsed":0} +{"Time":"2026-10-09T10:40:02.3233694+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:02.3259954+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/config","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/config\t0.335s\n"} +{"Time":"2026-10-09T10:40:02.3495052+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/config","Elapsed":0.359} +{"Time":"2026-10-09T10:40:03.2296533+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/conformance"} +{"Time":"2026-10-09T10:40:04.0217677+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_Matrix"} +{"Time":"2026-10-09T10:40:04.0217677+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_Matrix","Output":"=== RUN TestConformance_Matrix\n"} +{"Time":"2026-10-09T10:40:04.0350795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_Matrix","Output":" conformance_test.go:93: conformance: 87/87 manifest nodes covered, 0 on allowlist\n"} +{"Time":"2026-10-09T10:40:04.0350795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_Matrix","Output":"--- PASS: TestConformance_Matrix (0.01s)\n"} +{"Time":"2026-10-09T10:40:04.0350795+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_Matrix","Elapsed":0.01} +{"Time":"2026-10-09T10:40:04.0350795+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllDBNodesServed"} +{"Time":"2026-10-09T10:40:04.0350795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllDBNodesServed","Output":"=== RUN TestConformance_AllDBNodesServed\n"} +{"Time":"2026-10-09T10:40:04.036424+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllDBNodesServed","Output":" conformance_test.go:153: conformance: 7/7 core.db.* nodes served (6 pure builders + 1 exec op)\n"} +{"Time":"2026-10-09T10:40:04.036424+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllDBNodesServed","Output":"--- PASS: TestConformance_AllDBNodesServed (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.036424+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllDBNodesServed","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0369686+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistRatchet"} +{"Time":"2026-10-09T10:40:04.0369686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistRatchet","Output":"=== RUN TestConformance_AllowlistRatchet\n"} +{"Time":"2026-10-09T10:40:04.0369686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistRatchet","Output":"--- PASS: TestConformance_AllowlistRatchet (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0369686+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistRatchet","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0369686+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistEntriesAreRealManifestIDs"} +{"Time":"2026-10-09T10:40:04.0369686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistEntriesAreRealManifestIDs","Output":"=== RUN TestConformance_AllowlistEntriesAreRealManifestIDs\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistEntriesAreRealManifestIDs","Output":"--- PASS: TestConformance_AllowlistEntriesAreRealManifestIDs (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_AllowlistEntriesAreRealManifestIDs","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ComputeClassificationMatchesRegistry"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ComputeClassificationMatchesRegistry","Output":"=== RUN TestConformance_ComputeClassificationMatchesRegistry\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ComputeClassificationMatchesRegistry","Output":"--- PASS: TestConformance_ComputeClassificationMatchesRegistry (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ComputeClassificationMatchesRegistry","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ExecOpClassificationMatchesRuntime"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ExecOpClassificationMatchesRuntime","Output":"=== RUN TestConformance_ExecOpClassificationMatchesRuntime\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ExecOpClassificationMatchesRuntime","Output":"--- PASS: TestConformance_ExecOpClassificationMatchesRuntime (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_ExecOpClassificationMatchesRuntime","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_RatchetProof_RejectGrowth"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_RatchetProof_RejectGrowth","Output":"=== RUN TestConformance_RatchetProof_RejectGrowth\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_RatchetProof_RejectGrowth","Output":" conformance_test.go:253: ratchet proof: a 1-entry list against ceiling 0 correctly trips (growth blocked)\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_RatchetProof_RejectGrowth","Output":"--- PASS: TestConformance_RatchetProof_RejectGrowth (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestConformance_RatchetProof_RejectGrowth","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed"} +{"Time":"2026-10-09T10:40:04.0380414+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.http.request@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.http.request@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.http.request@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.http.request@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.http.request@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.http.request@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.order@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.order@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.order@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.order@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.order@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.order@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.limit@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.limit@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.limit@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.limit@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.limit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.limit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-start@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-start@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-start@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-start@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-start@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-start@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.branch@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.branch@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.branch@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.branch@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.branch@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.branch@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-loop@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-loop@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-loop@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-loop@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-loop@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-loop@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-each@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-each@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-each@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-each@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-each@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.for-each@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.while@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.while@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.while@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.while@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.while@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.while@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.show.emit@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.show.emit@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.show.emit@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.show.emit@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.show.emit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.show.emit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.get@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.get@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.variable.get@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.get@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.variable.get@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.get@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-event@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-event@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-event@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-event@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-event@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-event@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.on-call@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.on-call@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.operator.on-call@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.on-call@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.operator.on-call@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.on-call@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.await-value@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.await-value@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.operator.await-value@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.await-value@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.operator.await-value@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.operator.await-value@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.query@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.query@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.query@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.query@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.query@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.query@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.where@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.where@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.where@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.where@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.where@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.where@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.select@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.select@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.select@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.select@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.sequence@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.sequence@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.sequence@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.sequence@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.sequence@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.sequence@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.delay@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.delay@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.delay@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.delay@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.delay@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.delay@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.set@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.set@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.variable.set@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.set@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.variable.set@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.variable.set@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.source.read@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.source.read@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.source.read@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.source.read@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.source.read@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.source.read@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.from@1"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.from@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.from@1\n"} +{"Time":"2026-10-09T10:40:04.0386025+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.from@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.from@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.from@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.join@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.join@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.db.join@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.join@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.db.join@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.db.join@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-tick@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-tick@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-tick@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-tick@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-tick@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-tick@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-platform-event@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-platform-event@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-platform-event@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-platform-event@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-platform-event@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.event.on-platform-event@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.gate@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.gate@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.flow.gate@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.gate@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.flow.gate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.flow.gate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.print@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.print@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.print@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.print@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.print@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.print@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.output@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.output@1","Output":"=== RUN TestExecPortParity_RuntimeStringsExistInSeed/core.output@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.output@1","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed/core.output@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed/core.output@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed","Output":"--- PASS: TestExecPortParity_RuntimeStringsExistInSeed (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_RuntimeStringsExistInSeed","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.branch@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.branch@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.branch@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.branch@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.branch@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.branch@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-each@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-each@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-each@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-each@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-each@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-each@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.while@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.while@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.while@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.while@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.while@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.while@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.db.query@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.db.query@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.db.query@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.db.query@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.db.query@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.db.query@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-start@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-start@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.event.on-start@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-start@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.event.on-start@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-start@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-event@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-event@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.event.on-event@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-event@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.event.on-event@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-event@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.sequence@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.sequence@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.sequence@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.sequence@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.sequence@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.sequence@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-loop@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-loop@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-loop@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-loop@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-loop@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.for-loop@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.show.emit@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.show.emit@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.show.emit@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.show.emit@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.show.emit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.show.emit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-platform-event@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-platform-event@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.event.on-platform-event@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-platform-event@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.event.on-platform-event@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-platform-event@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.on-call@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.on-call@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.operator.on-call@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.on-call@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.operator.on-call@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.on-call@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.await-value@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.await-value@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.operator.await-value@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.await-value@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.operator.await-value@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.operator.await-value@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.print@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.print@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.print@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.print@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.print@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.print@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-tick@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-tick@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.event.on-tick@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-tick@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.event.on-tick@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.event.on-tick@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.delay@1"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.delay@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.delay@1\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.delay@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.delay@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.delay@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0391556+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.variable.set@1"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.variable.set@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.variable.set@1\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.variable.set@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.variable.set@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.variable.set@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.output@1"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.output@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.output@1\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.output@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.output@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.output@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.http.request@1"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.http.request@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.http.request@1\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.http.request@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.http.request@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.http.request@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.gate@1"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.gate@1","Output":"=== RUN TestExecPortParity_EverySeedExecPinHonoured/core.flow.gate@1\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.gate@1","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured/core.flow.gate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured/core.flow.gate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured","Output":"--- PASS: TestExecPortParity_EverySeedExecPinHonoured (0.00s)\n"} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Test":"TestExecPortParity_EverySeedExecPinHonoured","Elapsed":0} +{"Time":"2026-10-09T10:40:04.0396811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:04.0425565+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/conformance\t0.812s\n"} +{"Time":"2026-10-09T10:40:04.0722932+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/conformance","Elapsed":0.843} +{"Time":"2026-10-09T10:40:05.0999303+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/effects"} +{"Time":"2026-10-09T10:40:05.9921996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_200Envelope"} +{"Time":"2026-10-09T10:40:05.9921996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_200Envelope","Output":"=== RUN TestLocalQueryContract_200Envelope\n"} +{"Time":"2026-10-09T10:40:05.9942866+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_200Envelope","Output":"--- PASS: TestLocalQueryContract_200Envelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9942866+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_200Envelope","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9942866+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_400Issues"} +{"Time":"2026-10-09T10:40:05.9942866+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_400Issues","Output":"=== RUN TestLocalQueryContract_400Issues\n"} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_400Issues","Output":"--- PASS: TestLocalQueryContract_400Issues (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestLocalQueryContract_400Issues","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestParseDataSources_CSV"} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestParseDataSources_CSV","Output":"=== RUN TestParseDataSources_CSV\n"} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestParseDataSources_CSV","Output":"--- PASS: TestParseDataSources_CSV (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestParseDataSources_CSV","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_WireShape"} +{"Time":"2026-10-09T10:40:05.9953755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_WireShape","Output":"=== RUN TestDBQuery_WireShape\n"} +{"Time":"2026-10-09T10:40:05.9964248+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_WireShape","Output":"--- PASS: TestDBQuery_WireShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9964248+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_WireShape","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9964248+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_400CarriesIssues"} +{"Time":"2026-10-09T10:40:05.9964248+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_400CarriesIssues","Output":"=== RUN TestDBQuery_400CarriesIssues\n"} +{"Time":"2026-10-09T10:40:05.9974956+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_400CarriesIssues","Output":"--- PASS: TestDBQuery_400CarriesIssues (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9974956+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_400CarriesIssues","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9974956+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_TokenFuncReadLive"} +{"Time":"2026-10-09T10:40:05.9974956+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_TokenFuncReadLive","Output":"=== RUN TestDBQuery_TokenFuncReadLive\n"} +{"Time":"2026-10-09T10:40:05.9985618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_TokenFuncReadLive","Output":"--- PASS: TestDBQuery_TokenFuncReadLive (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9985618+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestDBQuery_TokenFuncReadLive","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9985618+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_WireShape"} +{"Time":"2026-10-09T10:40:05.9985618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_WireShape","Output":"=== RUN TestSchema_WireShape\n"} +{"Time":"2026-10-09T10:40:05.9996154+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_WireShape","Output":"--- PASS: TestSchema_WireShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:05.9996154+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_WireShape","Elapsed":0} +{"Time":"2026-10-09T10:40:05.9996154+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_Non200IsError"} +{"Time":"2026-10-09T10:40:05.9996154+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_Non200IsError","Output":"=== RUN TestSchema_Non200IsError\n"} +{"Time":"2026-10-09T10:40:06.0001532+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_Non200IsError","Output":"--- PASS: TestSchema_Non200IsError (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0001532+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSchema_Non200IsError","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0001532+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSearchableColumns_NonPrimaryStringText"} +{"Time":"2026-10-09T10:40:06.0001532+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSearchableColumns_NonPrimaryStringText","Output":"=== RUN TestSearchableColumns_NonPrimaryStringText\n"} +{"Time":"2026-10-09T10:40:06.0001532+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSearchableColumns_NonPrimaryStringText","Output":"--- PASS: TestSearchableColumns_NonPrimaryStringText (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestSearchableColumns_NonPrimaryStringText","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestResultShape_AllColumns"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestResultShape_AllColumns","Output":"=== RUN TestResultShape_AllColumns\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestResultShape_AllColumns","Output":"--- PASS: TestResultShape_AllColumns (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestResultShape_AllColumns","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_BurstThenDeny"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_BurstThenDeny","Output":"=== RUN TestStreamEgressLimiter_BurstThenDeny\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_BurstThenDeny","Output":"--- PASS: TestStreamEgressLimiter_BurstThenDeny (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_BurstThenDeny","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Isolation"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Isolation","Output":"=== RUN TestStreamEgressLimiter_Isolation\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Isolation","Output":"--- PASS: TestStreamEgressLimiter_Isolation (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Isolation","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Refill"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Refill","Output":"=== RUN TestStreamEgressLimiter_Refill\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Refill","Output":"--- PASS: TestStreamEgressLimiter_Refill (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Refill","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_RefillCapsAtBurst"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_RefillCapsAtBurst","Output":"=== RUN TestStreamEgressLimiter_RefillCapsAtBurst\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_RefillCapsAtBurst","Output":"--- PASS: TestStreamEgressLimiter_RefillCapsAtBurst (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_RefillCapsAtBurst","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Disabled"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Disabled","Output":"=== RUN TestStreamEgressLimiter_Disabled\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Disabled","Output":"--- PASS: TestStreamEgressLimiter_Disabled (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_Disabled","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_ConcurrentSharedKey"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_ConcurrentSharedKey","Output":"=== RUN TestStreamEgressLimiter_ConcurrentSharedKey\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_ConcurrentSharedKey","Output":"--- PASS: TestStreamEgressLimiter_ConcurrentSharedKey (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestStreamEgressLimiter_ConcurrentSharedKey","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPv4MappedIPv6MetadataBlocked"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPv4MappedIPv6MetadataBlocked","Output":"=== RUN TestEgress_IPv4MappedIPv6MetadataBlocked\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPv4MappedIPv6MetadataBlocked","Output":"--- PASS: TestEgress_IPv4MappedIPv6MetadataBlocked (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPv4MappedIPv6MetadataBlocked","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectToUnlistedHostBlocked"} +{"Time":"2026-10-09T10:40:06.0006858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectToUnlistedHostBlocked","Output":"=== RUN TestEgress_RedirectToUnlistedHostBlocked\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectToUnlistedHostBlocked","Output":"--- PASS: TestEgress_RedirectToUnlistedHostBlocked (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectToUnlistedHostBlocked","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectSchemeDowngradeBlocked"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectSchemeDowngradeBlocked","Output":"=== RUN TestEgress_RedirectSchemeDowngradeBlocked\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectSchemeDowngradeBlocked","Output":"--- PASS: TestEgress_RedirectSchemeDowngradeBlocked (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectSchemeDowngradeBlocked","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_ProductionConstructorNeverSetsInsecureFlag"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_ProductionConstructorNeverSetsInsecureFlag","Output":"=== RUN TestEgress_ProductionConstructorNeverSetsInsecureFlag\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_ProductionConstructorNeverSetsInsecureFlag","Output":"--- PASS: TestEgress_ProductionConstructorNeverSetsInsecureFlag (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_ProductionConstructorNeverSetsInsecureFlag","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyHostDenied"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyHostDenied","Output":"=== RUN TestEgress_EmptyHostDenied\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyHostDenied","Output":"--- PASS: TestEgress_EmptyHostDenied (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyHostDenied","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_AllIPsPrivate_ReturnsErrEgressBlocked"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_AllIPsPrivate_ReturnsErrEgressBlocked","Output":"=== RUN TestEgress_AllIPsPrivate_ReturnsErrEgressBlocked\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_AllIPsPrivate_ReturnsErrEgressBlocked","Output":"--- PASS: TestEgress_AllIPsPrivate_ReturnsErrEgressBlocked (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_AllIPsPrivate_ReturnsErrEgressBlocked","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostWithExplicitPortPassesURLCheck"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostWithExplicitPortPassesURLCheck","Output":"=== RUN TestEgress_HostWithExplicitPortPassesURLCheck\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostWithExplicitPortPassesURLCheck","Output":"--- PASS: TestEgress_HostWithExplicitPortPassesURLCheck (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostWithExplicitPortPassesURLCheck","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_MaxRedirectsBlocked"} +{"Time":"2026-10-09T10:40:06.0017318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_MaxRedirectsBlocked","Output":"=== RUN TestEgress_MaxRedirectsBlocked\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_MaxRedirectsBlocked","Output":"--- PASS: TestEgress_MaxRedirectsBlocked (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_MaxRedirectsBlocked","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyAllowlistDeniesAll"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyAllowlistDeniesAll","Output":"=== RUN TestEgress_EmptyAllowlistDeniesAll\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyAllowlistDeniesAll","Output":"--- PASS: TestEgress_EmptyAllowlistDeniesAll (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_EmptyAllowlistDeniesAll","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_SchemePolicy"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_SchemePolicy","Output":"=== RUN TestEgress_SchemePolicy\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_SchemePolicy","Output":"--- PASS: TestEgress_SchemePolicy (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_SchemePolicy","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostAllowlist"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostAllowlist","Output":"=== RUN TestEgress_HostAllowlist\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostAllowlist","Output":"--- PASS: TestEgress_HostAllowlist (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_HostAllowlist","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_BlockedIPRanges"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_BlockedIPRanges","Output":"=== RUN TestEgress_BlockedIPRanges\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_BlockedIPRanges","Output":"--- PASS: TestEgress_BlockedIPRanges (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_BlockedIPRanges","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_PostDNSRebindingBlocked"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_PostDNSRebindingBlocked","Output":"=== RUN TestEgress_PostDNSRebindingBlocked\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_PostDNSRebindingBlocked","Output":"--- PASS: TestEgress_PostDNSRebindingBlocked (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_PostDNSRebindingBlocked","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPLiteralBlockedAtDial"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPLiteralBlockedAtDial","Output":"=== RUN TestEgress_IPLiteralBlockedAtDial\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPLiteralBlockedAtDial","Output":"--- PASS: TestEgress_IPLiteralBlockedAtDial (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_IPLiteralBlockedAtDial","Elapsed":0} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectRecheck"} +{"Time":"2026-10-09T10:40:06.004887+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectRecheck","Output":"=== RUN TestEgress_RedirectRecheck\n"} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectRecheck","Output":"--- PASS: TestEgress_RedirectRecheck (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestEgress_RedirectRecheck","Elapsed":0} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_DeliversOffCaller"} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_DeliversOffCaller","Output":"=== RUN TestRunner_DeliversOffCaller\n"} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_DeliversOffCaller","Output":"--- PASS: TestRunner_DeliversOffCaller (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_DeliversOffCaller","Elapsed":0} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_TimeoutIsEffectSemantics"} +{"Time":"2026-10-09T10:40:06.005411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_TimeoutIsEffectSemantics","Output":"=== RUN TestRunner_TimeoutIsEffectSemantics\n"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_TimeoutIsEffectSemantics","Output":"--- PASS: TestRunner_TimeoutIsEffectSemantics (0.02s)\n"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_TimeoutIsEffectSemantics","Elapsed":0.02} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_QueueFullRefusesSubmit"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_QueueFullRefusesSubmit","Output":"=== RUN TestRunner_QueueFullRefusesSubmit\n"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_QueueFullRefusesSubmit","Output":"--- PASS: TestRunner_QueueFullRefusesSubmit (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_QueueFullRefusesSubmit","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_SubmitAfterStopRefused"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_SubmitAfterStopRefused","Output":"=== RUN TestRunner_SubmitAfterStopRefused\n"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_SubmitAfterStopRefused","Output":"--- PASS: TestRunner_SubmitAfterStopRefused (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestRunner_SubmitAfterStopRefused","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterCachesByExactScope"} +{"Time":"2026-10-09T10:40:06.0260979+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterCachesByExactScope","Output":"=== RUN TestServiceTokenExchangeMinterCachesByExactScope\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterCachesByExactScope","Output":"--- PASS: TestServiceTokenExchangeMinterCachesByExactScope (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterCachesByExactScope","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterFailsClosedWithoutFamily"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterFailsClosedWithoutFamily","Output":"=== RUN TestServiceTokenExchangeMinterFailsClosedWithoutFamily\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterFailsClosedWithoutFamily","Output":"--- PASS: TestServiceTokenExchangeMinterFailsClosedWithoutFamily (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceTokenExchangeMinterFailsClosedWithoutFamily","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_FillsAndEscapes"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_FillsAndEscapes","Output":"=== RUN TestBuildPath_FillsAndEscapes\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_FillsAndEscapes","Output":"--- PASS: TestBuildPath_FillsAndEscapes (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_FillsAndEscapes","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_EscapesInjection"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_EscapesInjection","Output":"=== RUN TestBuildPath_EscapesInjection\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_EscapesInjection","Output":"--- PASS: TestBuildPath_EscapesInjection (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_EscapesInjection","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_MissingParam"} +{"Time":"2026-10-09T10:40:06.0282921+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_MissingParam","Output":"=== RUN TestBuildPath_MissingParam\n"} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_MissingParam","Output":"--- PASS: TestBuildPath_MissingParam (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestBuildPath_MissingParam","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_NoTokenFailsClosed"} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_NoTokenFailsClosed","Output":"=== RUN TestServiceCall_NoTokenFailsClosed\n"} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_NoTokenFailsClosed","Output":"--- PASS: TestServiceCall_NoTokenFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_NoTokenFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_Non2xxSurfacesStatus"} +{"Time":"2026-10-09T10:40:06.0288185+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_Non2xxSurfacesStatus","Output":"=== RUN TestServiceCall_Non2xxSurfacesStatus\n"} +{"Time":"2026-10-09T10:40:06.0298814+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_Non2xxSurfacesStatus","Output":"--- PASS: TestServiceCall_Non2xxSurfacesStatus (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0298814+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_Non2xxSurfacesStatus","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0298814+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_DoesNotForwardCallerAuth"} +{"Time":"2026-10-09T10:40:06.0298814+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_DoesNotForwardCallerAuth","Output":"=== RUN TestServiceCall_DoesNotForwardCallerAuth\n"} +{"Time":"2026-10-09T10:40:06.0304218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_DoesNotForwardCallerAuth","Output":"--- PASS: TestServiceCall_DoesNotForwardCallerAuth (0.00s)\n"} +{"Time":"2026-10-09T10:40:06.0309509+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Test":"TestServiceCall_DoesNotForwardCallerAuth","Elapsed":0} +{"Time":"2026-10-09T10:40:06.0309509+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:06.035139+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/effects","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/effects\t0.935s\n"} +{"Time":"2026-10-09T10:40:06.0556775+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/effects","Elapsed":0.956} +{"Time":"2026-10-09T10:40:07.6432708+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/lsdp"} +{"Time":"2026-10-09T10:40:08.7591879+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeafSetBootstrapStateUsesNeutralValues"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeafSetBootstrapStateUsesNeutralValues","Output":"=== RUN TestBoundLeafSetBootstrapStateUsesNeutralValues\n"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeafSetBootstrapStateUsesNeutralValues","Output":"--- PASS: TestBoundLeafSetBootstrapStateUsesNeutralValues (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeafSetBootstrapStateUsesNeutralValues","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ParityWithCompiledBundle"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ParityWithCompiledBundle","Output":"=== RUN TestBoundLeavesFromLSML_ParityWithCompiledBundle\n"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ParityWithCompiledBundle","Output":"--- PASS: TestBoundLeavesFromLSML_ParityWithCompiledBundle (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ParityWithCompiledBundle","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_RepeatTemplateAbsoluteLitPath"} +{"Time":"2026-10-09T10:40:08.7597007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_RepeatTemplateAbsoluteLitPath","Output":"=== RUN TestBoundLeavesFromLSML_RepeatTemplateAbsoluteLitPath\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_RepeatTemplateAbsoluteLitPath","Output":"--- PASS: TestBoundLeavesFromLSML_RepeatTemplateAbsoluteLitPath (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_RepeatTemplateAbsoluteLitPath","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_GatesUnboundLeaves"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_GatesUnboundLeaves","Output":"=== RUN TestMirrorForLSML_GatesUnboundLeaves\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_GatesUnboundLeaves","Output":"--- PASS: TestMirrorForLSML_GatesUnboundLeaves (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_GatesUnboundLeaves","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_RepeatTemplateEndToEnd"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_RepeatTemplateEndToEnd","Output":"=== RUN TestMirrorForLSML_RepeatTemplateEndToEnd\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_RepeatTemplateEndToEnd","Output":"--- PASS: TestMirrorForLSML_RepeatTemplateEndToEnd (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_RepeatTemplateEndToEnd","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_NilBundleDisablesGate"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_NilBundleDisablesGate","Output":"=== RUN TestMirrorForLSML_NilBundleDisablesGate\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_NilBundleDisablesGate","Output":"--- PASS: TestMirrorForLSML_NilBundleDisablesGate (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMirrorForLSML_NilBundleDisablesGate","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ToleratesNonStringBindValue"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ToleratesNonStringBindValue","Output":"=== RUN TestBoundLeavesFromLSML_ToleratesNonStringBindValue\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ToleratesNonStringBindValue","Output":"--- PASS: TestBoundLeavesFromLSML_ToleratesNonStringBindValue (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ToleratesNonStringBindValue","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen","Output":"=== RUN TestBoundLeavesFromLSML_ObservableFailOpen\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent","Output":"=== RUN TestBoundLeavesFromLSML_ObservableFailOpen/absent\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent","Output":"--- PASS: TestBoundLeavesFromLSML_ObservableFailOpen/absent (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/malformed"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/malformed","Output":"=== RUN TestBoundLeavesFromLSML_ObservableFailOpen/malformed\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/malformed","Output":"--- PASS: TestBoundLeavesFromLSML_ObservableFailOpen/malformed (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/malformed","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent_and_malformed_messages_differ"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent_and_malformed_messages_differ","Output":"=== RUN TestBoundLeavesFromLSML_ObservableFailOpen/absent_and_malformed_messages_differ\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent_and_malformed_messages_differ","Output":"--- PASS: TestBoundLeavesFromLSML_ObservableFailOpen/absent_and_malformed_messages_differ (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/absent_and_malformed_messages_differ","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/legitimately_empty_(well-formed,_no_bindings)_does_not_warn"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/legitimately_empty_(well-formed,_no_bindings)_does_not_warn","Output":"=== RUN TestBoundLeavesFromLSML_ObservableFailOpen/legitimately_empty_(well-formed,_no_bindings)_does_not_warn\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/legitimately_empty_(well-formed,_no_bindings)_does_not_warn","Output":"--- PASS: TestBoundLeavesFromLSML_ObservableFailOpen/legitimately_empty_(well-formed,_no_bindings)_does_not_warn (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen/legitimately_empty_(well-formed,_no_bindings)_does_not_warn","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen","Output":"--- PASS: TestBoundLeavesFromLSML_ObservableFailOpen (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeavesFromLSML_ObservableFailOpen","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_SnapshotEmitsOnlyBound"} +{"Time":"2026-10-09T10:40:08.7602181+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_SnapshotEmitsOnlyBound","Output":"=== RUN TestBoundLeaves_SnapshotEmitsOnlyBound\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_SnapshotEmitsOnlyBound","Output":"--- PASS: TestBoundLeaves_SnapshotEmitsOnlyBound (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_SnapshotEmitsOnlyBound","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_WhereEmptyArrayRegression"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_WhereEmptyArrayRegression","Output":"=== RUN TestBoundLeaves_WhereEmptyArrayRegression\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_WhereEmptyArrayRegression","Output":"--- PASS: TestBoundLeaves_WhereEmptyArrayRegression (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_WhereEmptyArrayRegression","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RepeatItemDescendantsSurvive"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RepeatItemDescendantsSurvive","Output":"=== RUN TestBoundLeaves_RepeatItemDescendantsSurvive\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RepeatItemDescendantsSurvive","Output":"--- PASS: TestBoundLeaves_RepeatItemDescendantsSurvive (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RepeatItemDescendantsSurvive","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DisabledWhenNoBindings"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DisabledWhenNoBindings","Output":"=== RUN TestBoundLeaves_DisabledWhenNoBindings\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DisabledWhenNoBindings","Output":"--- PASS: TestBoundLeaves_DisabledWhenNoBindings (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DisabledWhenNoBindings","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_AnimateBindingsAreRenderable"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_AnimateBindingsAreRenderable","Output":"=== RUN TestBoundLeaves_AnimateBindingsAreRenderable\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_AnimateBindingsAreRenderable","Output":"--- PASS: TestBoundLeaves_AnimateBindingsAreRenderable (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_AnimateBindingsAreRenderable","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DeltaEmitsOnlyBound"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DeltaEmitsOnlyBound","Output":"=== RUN TestBoundLeaves_DeltaEmitsOnlyBound\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DeltaEmitsOnlyBound","Output":"--- PASS: TestBoundLeaves_DeltaEmitsOnlyBound (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_DeltaEmitsOnlyBound","Elapsed":0} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RealDecoderRendersBoard"} +{"Time":"2026-10-09T10:40:08.7607434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RealDecoderRendersBoard","Output":"=== RUN TestBoundLeaves_RealDecoderRendersBoard\n"} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RealDecoderRendersBoard","Output":"--- PASS: TestBoundLeaves_RealDecoderRendersBoard (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestBoundLeaves_RealDecoderRendersBoard","Elapsed":0} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationMirrorSingleWriterHandoff"} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationMirrorSingleWriterHandoff","Output":"=== RUN TestGenerationMirrorSingleWriterHandoff\n"} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationMirrorSingleWriterHandoff","Output":"--- PASS: TestGenerationMirrorSingleWriterHandoff (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationMirrorSingleWriterHandoff","Elapsed":0} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions"} +{"Time":"2026-10-09T10:40:08.762855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"=== RUN TestGenerationRegistryEvictsOldVersions\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8040739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"2026/10/09 10:40:08 WARN lsml bundle absent for stateless mirror — bound-leaf gate disabled (fail-open) component=lsdp scene_id=scene\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Output":"--- PASS: TestGenerationRegistryEvictsOldVersions (0.04s)\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationRegistryEvictsOldVersions","Elapsed":0.04} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationHandlerRequiresExactIdentity"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationHandlerRequiresExactIdentity","Output":"=== RUN TestGenerationHandlerRequiresExactIdentity\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationHandlerRequiresExactIdentity","Output":"--- PASS: TestGenerationHandlerRequiresExactIdentity (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestGenerationHandlerRequiresExactIdentity","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_EmbeddedLocalHandshake"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_EmbeddedLocalHandshake","Output":"=== RUN TestIdentityFromRequest_EmbeddedLocalHandshake\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_EmbeddedLocalHandshake","Output":"--- PASS: TestIdentityFromRequest_EmbeddedLocalHandshake (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_EmbeddedLocalHandshake","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust","Output":"=== RUN TestIdentityFromRequest_AntenneHeaderTrust\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/explicit-header-source"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/explicit-header-source","Output":"=== RUN TestIdentityFromRequest_AntenneHeaderTrust/explicit-header-source\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/explicit-header-source","Output":"--- PASS: TestIdentityFromRequest_AntenneHeaderTrust/explicit-header-source (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/explicit-header-source","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8045986+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/nil-defaults-to-header"} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/nil-defaults-to-header","Output":"=== RUN TestIdentityFromRequest_AntenneHeaderTrust/nil-defaults-to-header\n"} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/nil-defaults-to-header","Output":"--- PASS: TestIdentityFromRequest_AntenneHeaderTrust/nil-defaults-to-header (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust/nil-defaults-to-header","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust","Output":"--- PASS: TestIdentityFromRequest_AntenneHeaderTrust (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestIdentityFromRequest_AntenneHeaderTrust","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterReactiveUpdateGetsKeyframe"} +{"Time":"2026-10-09T10:40:08.8051318+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterReactiveUpdateGetsKeyframe","Output":"=== RUN TestLSDP_LateJoinAfterReactiveUpdateGetsKeyframe\n"} +{"Time":"2026-10-09T10:40:08.8093042+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterReactiveUpdateGetsKeyframe","Output":"--- PASS: TestLSDP_LateJoinAfterReactiveUpdateGetsKeyframe (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8093042+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterReactiveUpdateGetsKeyframe","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8093042+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterSceneSwitchGetsKeyframe"} +{"Time":"2026-10-09T10:40:08.8093042+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterSceneSwitchGetsKeyframe","Output":"=== RUN TestLSDP_LateJoinAfterSceneSwitchGetsKeyframe\n"} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterSceneSwitchGetsKeyframe","Output":"--- PASS: TestLSDP_LateJoinAfterSceneSwitchGetsKeyframe (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_LateJoinAfterSceneSwitchGetsKeyframe","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestNativeSurfaceIncludesAllAuthoredBindingGroups"} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestNativeSurfaceIncludesAllAuthoredBindingGroups","Output":"=== RUN TestNativeSurfaceIncludesAllAuthoredBindingGroups\n"} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestNativeSurfaceIncludesAllAuthoredBindingGroups","Output":"--- PASS: TestNativeSurfaceIncludesAllAuthoredBindingGroups (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestNativeSurfaceIncludesAllAuthoredBindingGroups","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppEmitsFrame"} +{"Time":"2026-10-09T10:40:08.8129334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppEmitsFrame","Output":"=== RUN TestLSDP_OverlayAppEmitsFrame\n"} +{"Time":"2026-10-09T10:40:08.8145254+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppEmitsFrame","Output":"--- PASS: TestLSDP_OverlayAppEmitsFrame (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8150591+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppEmitsFrame","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8150591+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppPartialUpdate"} +{"Time":"2026-10-09T10:40:08.8150591+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppPartialUpdate","Output":"=== RUN TestLSDP_OverlayAppPartialUpdate\n"} +{"Time":"2026-10-09T10:40:08.8162844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppPartialUpdate","Output":"--- PASS: TestLSDP_OverlayAppPartialUpdate (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8162844+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppPartialUpdate","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8162844+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppDeliveredWithoutActiveScene"} +{"Time":"2026-10-09T10:40:08.8162844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppDeliveredWithoutActiveScene","Output":"=== RUN TestLSDP_OverlayAppDeliveredWithoutActiveScene\n"} +{"Time":"2026-10-09T10:40:08.8174095+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppDeliveredWithoutActiveScene","Output":"--- PASS: TestLSDP_OverlayAppDeliveredWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8174095+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppDeliveredWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8174095+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppSurvivesSceneSwitch"} +{"Time":"2026-10-09T10:40:08.8174095+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppSurvivesSceneSwitch","Output":"=== RUN TestLSDP_OverlayAppSurvivesSceneSwitch\n"} +{"Time":"2026-10-09T10:40:08.8179313+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppSurvivesSceneSwitch","Output":"--- PASS: TestLSDP_OverlayAppSurvivesSceneSwitch (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8179313+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_OverlayAppSurvivesSceneSwitch","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8179313+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestStreamRule_OverlayAppSetReachesRealWire"} +{"Time":"2026-10-09T10:40:08.8179313+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestStreamRule_OverlayAppSetReachesRealWire","Output":"=== RUN TestStreamRule_OverlayAppSetReachesRealWire\n"} +{"Time":"2026-10-09T10:40:08.8200513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestStreamRule_OverlayAppSetReachesRealWire","Output":"--- PASS: TestStreamRule_OverlayAppSetReachesRealWire (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8200513+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestStreamRule_OverlayAppSetReachesRealWire","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8200513+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AssignSlotPipeline"} +{"Time":"2026-10-09T10:40:08.8200513+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AssignSlotPipeline","Output":"=== RUN TestE2E_AssignSlotPipeline\n"} +{"Time":"2026-10-09T10:40:08.8227536+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AssignSlotPipeline","Output":"--- PASS: TestE2E_AssignSlotPipeline (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.8227536+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AssignSlotPipeline","Elapsed":0} +{"Time":"2026-10-09T10:40:08.8227536+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_FailClosedOnNon2xx"} +{"Time":"2026-10-09T10:40:08.8227536+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_FailClosedOnNon2xx","Output":"=== RUN TestE2E_FailClosedOnNon2xx\n"} +{"Time":"2026-10-09T10:40:08.9782709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_FailClosedOnNon2xx","Output":"--- PASS: TestE2E_FailClosedOnNon2xx (0.16s)\n"} +{"Time":"2026-10-09T10:40:08.9782709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_FailClosedOnNon2xx","Elapsed":0.16} +{"Time":"2026-10-09T10:40:08.9782709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_PersistsAcrossSceneSwitch"} +{"Time":"2026-10-09T10:40:08.9782709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_PersistsAcrossSceneSwitch","Output":"=== RUN TestE2E_PersistsAcrossSceneSwitch\n"} +{"Time":"2026-10-09T10:40:08.981959+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_PersistsAcrossSceneSwitch","Output":"--- PASS: TestE2E_PersistsAcrossSceneSwitch (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.9825372+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_PersistsAcrossSceneSwitch","Elapsed":0} +{"Time":"2026-10-09T10:40:08.9825372+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_LiveReassignWithoutSceneSwitch"} +{"Time":"2026-10-09T10:40:08.9825372+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_LiveReassignWithoutSceneSwitch","Output":"=== RUN TestE2E_LiveReassignWithoutSceneSwitch\n"} +{"Time":"2026-10-09T10:40:08.9861808+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_LiveReassignWithoutSceneSwitch","Output":"--- PASS: TestE2E_LiveReassignWithoutSceneSwitch (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.9861808+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_LiveReassignWithoutSceneSwitch","Elapsed":0} +{"Time":"2026-10-09T10:40:08.9861808+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_IsolatedPerStream"} +{"Time":"2026-10-09T10:40:08.9861808+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_IsolatedPerStream","Output":"=== RUN TestE2E_IsolatedPerStream\n"} +{"Time":"2026-10-09T10:40:08.9893684+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_IsolatedPerStream","Output":"--- PASS: TestE2E_IsolatedPerStream (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.9893684+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_IsolatedPerStream","Elapsed":0} +{"Time":"2026-10-09T10:40:08.9893684+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AntiInjectionTemplateThroughWire"} +{"Time":"2026-10-09T10:40:08.9893684+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AntiInjectionTemplateThroughWire","Output":"=== RUN TestE2E_AntiInjectionTemplateThroughWire\n"} +{"Time":"2026-10-09T10:40:08.9910094+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AntiInjectionTemplateThroughWire","Output":"--- PASS: TestE2E_AntiInjectionTemplateThroughWire (0.00s)\n"} +{"Time":"2026-10-09T10:40:08.9915368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestE2E_AntiInjectionTemplateThroughWire","Elapsed":0} +{"Time":"2026-10-09T10:40:08.9915368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSwitchDoesNotTouchAntenne"} +{"Time":"2026-10-09T10:40:08.9915368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSwitchDoesNotTouchAntenne","Output":"=== RUN TestLSDP_PreviewSwitchDoesNotTouchAntenne\n"} +{"Time":"2026-10-09T10:40:09.3940201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSwitchDoesNotTouchAntenne","Output":"--- PASS: TestLSDP_PreviewSwitchDoesNotTouchAntenne (0.40s)\n"} +{"Time":"2026-10-09T10:40:09.3940201+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSwitchDoesNotTouchAntenne","Elapsed":0.4} +{"Time":"2026-10-09T10:40:09.3940201+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_ProjectionMetadataLiveAndReplay"} +{"Time":"2026-10-09T10:40:09.3940201+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_ProjectionMetadataLiveAndReplay","Output":"=== RUN TestLSDP_ProjectionMetadataLiveAndReplay\n"} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_ProjectionMetadataLiveAndReplay","Output":"--- PASS: TestLSDP_ProjectionMetadataLiveAndReplay (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_ProjectionMetadataLiveAndReplay","Elapsed":0} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMapProjectionMetadata_LegacyDeltaStaysAbsent"} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMapProjectionMetadata_LegacyDeltaStaysAbsent","Output":"=== RUN TestMapProjectionMetadata_LegacyDeltaStaysAbsent\n"} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMapProjectionMetadata_LegacyDeltaStaysAbsent","Output":"--- PASS: TestMapProjectionMetadata_LegacyDeltaStaysAbsent (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestMapProjectionMetadata_LegacyDeltaStaysAbsent","Elapsed":0} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SceneRosterDelivered"} +{"Time":"2026-10-09T10:40:09.395064+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SceneRosterDelivered","Output":"=== RUN TestLSDP_SceneRosterDelivered\n"} +{"Time":"2026-10-09T10:40:09.3956008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SceneRosterDelivered","Output":"--- PASS: TestLSDP_SceneRosterDelivered (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.3956008+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SceneRosterDelivered","Elapsed":0} +{"Time":"2026-10-09T10:40:09.3956008+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotEmitsOnlyScalars"} +{"Time":"2026-10-09T10:40:09.3956008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotEmitsOnlyScalars","Output":"=== RUN TestLSDP_SnapshotEmitsOnlyScalars\n"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotEmitsOnlyScalars","Output":"--- PASS: TestLSDP_SnapshotEmitsOnlyScalars (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotEmitsOnlyScalars","Elapsed":0} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DeltaEmitsOnlyScalars"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DeltaEmitsOnlyScalars","Output":"=== RUN TestLSDP_DeltaEmitsOnlyScalars\n"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DeltaEmitsOnlyScalars","Output":"--- PASS: TestLSDP_DeltaEmitsOnlyScalars (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DeltaEmitsOnlyScalars","Elapsed":0} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_AllNonScalarDeltaIsDropped"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_AllNonScalarDeltaIsDropped","Output":"=== RUN TestLSDP_AllNonScalarDeltaIsDropped\n"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_AllNonScalarDeltaIsDropped","Output":"--- PASS: TestLSDP_AllNonScalarDeltaIsDropped (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_AllNonScalarDeltaIsDropped","Elapsed":0} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_RealDecoderAcceptsFilteredSnapshot"} +{"Time":"2026-10-09T10:40:09.3964461+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_RealDecoderAcceptsFilteredSnapshot","Output":"=== RUN TestLSDP_RealDecoderAcceptsFilteredSnapshot\n"} +{"Time":"2026-10-09T10:40:09.3975943+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_RealDecoderAcceptsFilteredSnapshot","Output":"--- PASS: TestLSDP_RealDecoderAcceptsFilteredSnapshot (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.3975943+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_RealDecoderAcceptsFilteredSnapshot","Elapsed":0} +{"Time":"2026-10-09T10:40:09.3975943+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSecurity_NoLocalAuth"} +{"Time":"2026-10-09T10:40:09.3975943+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSecurity_NoLocalAuth","Output":"=== RUN TestSecurity_NoLocalAuth\n"} +{"Time":"2026-10-09T10:40:09.3998002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSecurity_NoLocalAuth","Output":"--- PASS: TestSecurity_NoLocalAuth (0.00s)\n"} +{"Time":"2026-10-09T10:40:09.3998002+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSecurity_NoLocalAuth","Elapsed":0} +{"Time":"2026-10-09T10:40:09.3998002+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSessionDoesNotLeakToAntenne"} +{"Time":"2026-10-09T10:40:09.3998002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSessionDoesNotLeakToAntenne","Output":"=== RUN TestLSDP_PreviewSessionDoesNotLeakToAntenne\n"} +{"Time":"2026-10-09T10:40:10.2020674+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSessionDoesNotLeakToAntenne","Output":"--- PASS: TestLSDP_PreviewSessionDoesNotLeakToAntenne (0.80s)\n"} +{"Time":"2026-10-09T10:40:10.2020674+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_PreviewSessionDoesNotLeakToAntenne","Elapsed":0.8} +{"Time":"2026-10-09T10:40:10.2020674+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentEmitsDelta"} +{"Time":"2026-10-09T10:40:10.2020674+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentEmitsDelta","Output":"=== RUN TestLSDP_SlotAssignmentEmitsDelta\n"} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentEmitsDelta","Output":"--- PASS: TestLSDP_SlotAssignmentEmitsDelta (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentEmitsDelta","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotClearedRemovesDerivedState"} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotClearedRemovesDerivedState","Output":"=== RUN TestLSDP_SlotClearedRemovesDerivedState\n"} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotClearedRemovesDerivedState","Output":"--- PASS: TestLSDP_SlotClearedRemovesDerivedState (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotClearedRemovesDerivedState","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentPersistsAcrossSceneSwitch"} +{"Time":"2026-10-09T10:40:10.2038247+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentPersistsAcrossSceneSwitch","Output":"=== RUN TestLSDP_SlotAssignmentPersistsAcrossSceneSwitch\n"} +{"Time":"2026-10-09T10:40:10.204894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentPersistsAcrossSceneSwitch","Output":"--- PASS: TestLSDP_SlotAssignmentPersistsAcrossSceneSwitch (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.204894+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentPersistsAcrossSceneSwitch","Elapsed":0} +{"Time":"2026-10-09T10:40:10.204894+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentIsolatedPerStream"} +{"Time":"2026-10-09T10:40:10.204894+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentIsolatedPerStream","Output":"=== RUN TestLSDP_SlotAssignmentIsolatedPerStream\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentIsolatedPerStream","Output":"--- PASS: TestLSDP_SlotAssignmentIsolatedPerStream (0.02s)\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SlotAssignmentIsolatedPerStream","Elapsed":0.02} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_KnownIdentityNoLongerCountedAsGap"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_KnownIdentityNoLongerCountedAsGap","Output":"=== RUN TestSceneMirror_SnapshotIdentityGap_KnownIdentityNoLongerCountedAsGap\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_KnownIdentityNoLongerCountedAsGap","Output":"--- PASS: TestSceneMirror_SnapshotIdentityGap_KnownIdentityNoLongerCountedAsGap (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_KnownIdentityNoLongerCountedAsGap","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NoGapWhenNothingKnownYet"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NoGapWhenNothingKnownYet","Output":"=== RUN TestSceneMirror_SnapshotIdentityGap_NoGapWhenNothingKnownYet\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NoGapWhenNothingKnownYet","Output":"--- PASS: TestSceneMirror_SnapshotIdentityGap_NoGapWhenNothingKnownYet (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NoGapWhenNothingKnownYet","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NilMetricsSinkIsNoOp"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NilMetricsSinkIsNoOp","Output":"=== RUN TestSceneMirror_SnapshotIdentityGap_NilMetricsSinkIsNoOp\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NilMetricsSinkIsNoOp","Output":"--- PASS: TestSceneMirror_SnapshotIdentityGap_NilMetricsSinkIsNoOp (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestSceneMirror_SnapshotIdentityGap_NilMetricsSinkIsNoOp","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotForwardCarriesKnownProjectionIdentity"} +{"Time":"2026-10-09T10:40:10.2277244+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotForwardCarriesKnownProjectionIdentity","Output":"=== RUN TestLSDP_SnapshotForwardCarriesKnownProjectionIdentity\n"} +{"Time":"2026-10-09T10:40:10.2287794+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotForwardCarriesKnownProjectionIdentity","Output":"--- PASS: TestLSDP_SnapshotForwardCarriesKnownProjectionIdentity (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2287794+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_SnapshotForwardCarriesKnownProjectionIdentity","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2287794+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_EmitsReceiveOnlyCredsOnSlotAssignment"} +{"Time":"2026-10-09T10:40:10.2287794+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_EmitsReceiveOnlyCredsOnSlotAssignment","Output":"=== RUN TestViewer_EmitsReceiveOnlyCredsOnSlotAssignment\n"} +{"Time":"2026-10-09T10:40:10.2293018+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_EmitsReceiveOnlyCredsOnSlotAssignment","Output":"--- PASS: TestViewer_EmitsReceiveOnlyCredsOnSlotAssignment (0.00s)\n"} +{"Time":"2026-10-09T10:40:10.2293018+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_EmitsReceiveOnlyCredsOnSlotAssignment","Elapsed":0} +{"Time":"2026-10-09T10:40:10.2293018+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_DedupesRoomsAcrossPeers"} +{"Time":"2026-10-09T10:40:10.2293018+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_DedupesRoomsAcrossPeers","Output":"=== RUN TestViewer_DedupesRoomsAcrossPeers\n"} +{"Time":"2026-10-09T10:40:10.235565+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_DedupesRoomsAcrossPeers","Output":"--- PASS: TestViewer_DedupesRoomsAcrossPeers (0.01s)\n"} +{"Time":"2026-10-09T10:40:10.235565+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_DedupesRoomsAcrossPeers","Elapsed":0.01} +{"Time":"2026-10-09T10:40:10.235565+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllThreeCanvasSlots"} +{"Time":"2026-10-09T10:40:10.235565+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllThreeCanvasSlots","Output":"=== RUN TestViewer_ArmsAllThreeCanvasSlots\n"} +{"Time":"2026-10-09T10:40:10.2424728+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllThreeCanvasSlots","Output":"--- PASS: TestViewer_ArmsAllThreeCanvasSlots (0.01s)\n"} +{"Time":"2026-10-09T10:40:10.2424728+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllThreeCanvasSlots","Elapsed":0.01} +{"Time":"2026-10-09T10:40:10.2424728+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_RotationReEmitsFreshToken"} +{"Time":"2026-10-09T10:40:10.2424728+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_RotationReEmitsFreshToken","Output":"=== RUN TestViewer_RotationReEmitsFreshToken\n"} +{"Time":"2026-10-09T10:40:10.2481274+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_RotationReEmitsFreshToken","Output":"--- PASS: TestViewer_RotationReEmitsFreshToken (0.01s)\n"} +{"Time":"2026-10-09T10:40:10.2481274+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_RotationReEmitsFreshToken","Elapsed":0.01} +{"Time":"2026-10-09T10:40:10.2481274+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllPeersConcurrentlyUnderLatency"} +{"Time":"2026-10-09T10:40:10.2481274+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllPeersConcurrentlyUnderLatency","Output":"=== RUN TestViewer_ArmsAllPeersConcurrentlyUnderLatency\n"} +{"Time":"2026-10-09T10:40:14.2587836+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllPeersConcurrentlyUnderLatency","Output":"--- PASS: TestViewer_ArmsAllPeersConcurrentlyUnderLatency (4.01s)\n"} +{"Time":"2026-10-09T10:40:14.2587836+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_ArmsAllPeersConcurrentlyUnderLatency","Elapsed":4.01} +{"Time":"2026-10-09T10:40:14.2587836+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_PersistsAcrossSceneSwitch"} +{"Time":"2026-10-09T10:40:14.2587836+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_PersistsAcrossSceneSwitch","Output":"=== RUN TestViewer_PersistsAcrossSceneSwitch\n"} +{"Time":"2026-10-09T10:40:14.2653366+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_PersistsAcrossSceneSwitch","Output":"--- PASS: TestViewer_PersistsAcrossSceneSwitch (0.01s)\n"} +{"Time":"2026-10-09T10:40:14.2659877+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_PersistsAcrossSceneSwitch","Elapsed":0.01} +{"Time":"2026-10-09T10:40:14.2659877+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_IsolatedPerStream"} +{"Time":"2026-10-09T10:40:14.2659877+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_IsolatedPerStream","Output":"=== RUN TestViewer_IsolatedPerStream\n"} +{"Time":"2026-10-09T10:40:14.2727767+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_IsolatedPerStream","Output":"--- PASS: TestViewer_IsolatedPerStream (0.01s)\n"} +{"Time":"2026-10-09T10:40:14.2727767+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_IsolatedPerStream","Elapsed":0.01} +{"Time":"2026-10-09T10:40:14.2727767+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_NeverLogsToken"} +{"Time":"2026-10-09T10:40:14.2727767+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_NeverLogsToken","Output":"=== RUN TestViewer_NeverLogsToken\n"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_NeverLogsToken","Output":"--- PASS: TestViewer_NeverLogsToken (0.01s)\n"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestViewer_NeverLogsToken","Elapsed":0.01} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NoScopedTokenSkipsRequest"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NoScopedTokenSkipsRequest","Output":"=== RUN TestZabCamCredsFetcher_NoScopedTokenSkipsRequest\n"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NoScopedTokenSkipsRequest","Output":"--- PASS: TestZabCamCredsFetcher_NoScopedTokenSkipsRequest (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NoScopedTokenSkipsRequest","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NilMinterSkipsRequest"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NilMinterSkipsRequest","Output":"=== RUN TestZabCamCredsFetcher_NilMinterSkipsRequest\n"} +{"Time":"2026-10-09T10:40:14.2780482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NilMinterSkipsRequest","Output":"--- PASS: TestZabCamCredsFetcher_NilMinterSkipsRequest (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2786654+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_NilMinterSkipsRequest","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2786654+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_ScopedTokenIsRequiredAndSent"} +{"Time":"2026-10-09T10:40:14.2786654+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_ScopedTokenIsRequiredAndSent","Output":"=== RUN TestZabCamCredsFetcher_ScopedTokenIsRequiredAndSent\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_ScopedTokenIsRequiredAndSent","Output":"--- PASS: TestZabCamCredsFetcher_ScopedTokenIsRequiredAndSent (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestZabCamCredsFetcher_ScopedTokenIsRequiredAndSent","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestAllowLoopbackBrowserOriginRewritesOnlyLoopbackRequests"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestAllowLoopbackBrowserOriginRewritesOnlyLoopbackRequests","Output":"=== RUN TestAllowLoopbackBrowserOriginRewritesOnlyLoopbackRequests\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestAllowLoopbackBrowserOriginRewritesOnlyLoopbackRequests","Output":"--- PASS: TestAllowLoopbackBrowserOriginRewritesOnlyLoopbackRequests (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestAllowLoopbackBrowserOriginRewritesOnlyLoopbackRequests","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_CachesLSMLBoundLeavesByBundleContent"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_CachesLSMLBoundLeavesByBundleContent","Output":"=== RUN TestWire_CachesLSMLBoundLeavesByBundleContent\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_CachesLSMLBoundLeavesByBundleContent","Output":"--- PASS: TestWire_CachesLSMLBoundLeavesByBundleContent (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_CachesLSMLBoundLeavesByBundleContent","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_ReusesSeededSceneVersionOnReactivation"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_ReusesSeededSceneVersionOnReactivation","Output":"=== RUN TestWire_ReusesSeededSceneVersionOnReactivation\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_ReusesSeededSceneVersionOnReactivation","Output":"--- PASS: TestWire_ReusesSeededSceneVersionOnReactivation (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestWire_ReusesSeededSceneVersionOnReactivation","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DualSnapshotDeltaResume"} +{"Time":"2026-10-09T10:40:14.2791922+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DualSnapshotDeltaResume","Output":"=== RUN TestLSDP_DualSnapshotDeltaResume\n"} +{"Time":"2026-10-09T10:40:14.2831057+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DualSnapshotDeltaResume","Output":"--- PASS: TestLSDP_DualSnapshotDeltaResume (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2831057+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_DualSnapshotDeltaResume","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2831057+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_TokenIgnored"} +{"Time":"2026-10-09T10:40:14.2831057+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_TokenIgnored","Output":"=== RUN TestLSDP_TokenIgnored\n"} +{"Time":"2026-10-09T10:40:14.2847598+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_TokenIgnored","Output":"--- PASS: TestLSDP_TokenIgnored (0.00s)\n"} +{"Time":"2026-10-09T10:40:14.2847598+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Test":"TestLSDP_TokenIgnored","Elapsed":0} +{"Time":"2026-10-09T10:40:14.2847598+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:14.2893599+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/lsdp\t6.646s\n"} +{"Time":"2026-10-09T10:40:14.3091784+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdp","Elapsed":6.666} +{"Time":"2026-10-09T10:40:15.7732818+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueAnimation"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueAnimation","Output":"=== RUN TestRealNativeBlueAnimation\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueAnimation","Output":" animation_native_test.go:20: requires real native receiver, source and animation phase\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueAnimation","Output":"--- SKIP: TestRealNativeBlueAnimation (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueAnimation","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeVisual"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeVisual","Output":"=== RUN TestRealNativeVisual\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeVisual","Output":" blue_native_test.go:68: driven by the offline CEF visual proof\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeVisual","Output":"--- SKIP: TestRealNativeVisual (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeVisual","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativePatchArraysEscapesAndAtomicFailure"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativePatchArraysEscapesAndAtomicFailure","Output":"=== RUN TestNativePatchArraysEscapesAndAtomicFailure\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativePatchArraysEscapesAndAtomicFailure","Output":"--- PASS: TestNativePatchArraysEscapesAndAtomicFailure (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativePatchArraysEscapesAndAtomicFailure","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSceneMutationRejectsIdentityAndStaleLease"} +{"Time":"2026-10-09T10:40:16.9926112+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSceneMutationRejectsIdentityAndStaleLease","Output":"=== RUN TestSceneMutationRejectsIdentityAndStaleLease\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSceneMutationRejectsIdentityAndStaleLease","Output":"--- PASS: TestSceneMutationRejectsIdentityAndStaleLease (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSceneMutationRejectsIdentityAndStaleLease","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativeAnimationRequiresDeclaredAssetAndTarget"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativeAnimationRequiresDeclaredAssetAndTarget","Output":"=== RUN TestNativeAnimationRequiresDeclaredAssetAndTarget\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativeAnimationRequiresDeclaredAssetAndTarget","Output":"--- PASS: TestNativeAnimationRequiresDeclaredAssetAndTarget (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestNativeAnimationRequiresDeclaredAssetAndTarget","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestTreeAndObjectOperations"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestTreeAndObjectOperations","Output":"=== RUN TestTreeAndObjectOperations\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestTreeAndObjectOperations","Output":"--- PASS: TestTreeAndObjectOperations (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestTreeAndObjectOperations","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet","Output":"=== RUN TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet","Output":"--- PASS: TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeProducers"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeProducers","Output":"=== RUN TestRealNativeProducers\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeProducers","Output":" producer_test.go:52: requires actual native receiver and real LSML\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeProducers","Output":"--- SKIP: TestRealNativeProducers (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeProducers","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestEndpoint"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestEndpoint","Output":"=== RUN TestEndpoint\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestEndpoint","Output":"--- PASS: TestEndpoint (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestEndpoint","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealSharedNative"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealSharedNative","Output":"=== RUN TestRealSharedNative\n"} +{"Time":"2026-10-09T10:40:16.9931382+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealSharedNative","Output":" reception_test.go:25: requires actual shared Rust receiver\n"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealSharedNative","Output":"--- SKIP: TestRealSharedNative (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealSharedNative","Elapsed":0} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeTransportRecovery"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeTransportRecovery","Output":"=== RUN TestRealNativeTransportRecovery\n"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeTransportRecovery","Output":" recovery_native_test.go:30: requires actual native receiver\n"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeTransportRecovery","Output":"--- SKIP: TestRealNativeTransportRecovery (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeTransportRecovery","Elapsed":0} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRecoversWithoutDroppingOrChangingTransaction"} +{"Time":"2026-10-09T10:40:16.993665+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRecoversWithoutDroppingOrChangingTransaction","Output":"=== RUN TestProducerRecoversWithoutDroppingOrChangingTransaction\n"} +{"Time":"2026-10-09T10:40:16.9983322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRecoversWithoutDroppingOrChangingTransaction","Output":"--- PASS: TestProducerRecoversWithoutDroppingOrChangingTransaction (0.00s)\n"} +{"Time":"2026-10-09T10:40:16.9983322+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRecoversWithoutDroppingOrChangingTransaction","Elapsed":0} +{"Time":"2026-10-09T10:40:16.9983322+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerDoesNotRebaseUnknownCommittedInsertion"} +{"Time":"2026-10-09T10:40:16.9983322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerDoesNotRebaseUnknownCommittedInsertion","Output":"=== RUN TestProducerDoesNotRebaseUnknownCommittedInsertion\n"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerDoesNotRebaseUnknownCommittedInsertion","Output":"--- PASS: TestProducerDoesNotRebaseUnknownCommittedInsertion (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerDoesNotRebaseUnknownCommittedInsertion","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerCloseCancelsReconnect"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerCloseCancelsReconnect","Output":"=== RUN TestProducerCloseCancelsReconnect\n"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerCloseCancelsReconnect","Output":"--- PASS: TestProducerCloseCancelsReconnect (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerCloseCancelsReconnect","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerProtocolFailureIsTerminal"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerProtocolFailureIsTerminal","Output":"=== RUN TestProducerProtocolFailureIsTerminal\n"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerProtocolFailureIsTerminal","Output":"--- PASS: TestProducerProtocolFailureIsTerminal (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerProtocolFailureIsTerminal","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRebasesRepeatedProvenConcurrentRejections"} +{"Time":"2026-10-09T10:40:17.0000584+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRebasesRepeatedProvenConcurrentRejections","Output":"=== RUN TestProducerRebasesRepeatedProvenConcurrentRejections\n"} +{"Time":"2026-10-09T10:40:17.0006062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRebasesRepeatedProvenConcurrentRejections","Output":"--- PASS: TestProducerRebasesRepeatedProvenConcurrentRejections (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0006062+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRebasesRepeatedProvenConcurrentRejections","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0006062+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates"} +{"Time":"2026-10-09T10:40:17.0006062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates","Output":"=== RUN TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates","Output":"--- PASS: TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute","Output":"=== RUN TestProducerNeverReleasesAnUnconfirmedRoute\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"incomplete\"}"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"incomplete\"}","Output":"=== RUN TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"incomplete\"}\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"incomplete\"}","Output":"--- PASS: TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"incomplete\"} (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"incomplete\"}","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"completed\",\"id\":\"another-route\"}"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"completed\",\"id\":\"another-route\"}","Output":"=== RUN TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"completed\",\"id\":\"another-route\"}\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"completed\",\"id\":\"another-route\"}","Output":"--- PASS: TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"completed\",\"id\":\"another-route\"} (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"completed\",\"id\":\"another-route\"}","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"rejected\"}"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"rejected\"}","Output":"=== RUN TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"rejected\"}\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"rejected\"}","Output":"--- PASS: TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"rejected\"} (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute/{\"status\":\"rejected\"}","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute","Output":"--- PASS: TestProducerNeverReleasesAnUnconfirmedRoute (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerNeverReleasesAnUnconfirmedRoute","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeRouteRetention"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeRouteRetention","Output":"=== RUN TestRealNativeRouteRetention\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeRouteRetention","Output":" route_retention_test.go:85: requires disposable native receiver with bounded routing budget\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeRouteRetention","Output":"--- SKIP: TestRealNativeRouteRetention (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeRouteRetention","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute"} +{"Time":"2026-10-09T10:40:17.0055194+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute","Output":"=== RUN TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute","Output":"--- PASS: TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueStructuralMutation"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueStructuralMutation","Output":"=== RUN TestRealNativeBlueStructuralMutation\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueStructuralMutation","Output":" surface_native_test.go:21: requires real native receiver and original LSML\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueStructuralMutation","Output":"--- SKIP: TestRealNativeBlueStructuralMutation (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestRealNativeBlueStructuralMutation","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority","Output":"=== RUN TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority","Output":"--- PASS: TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority (0.00s)\n"} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Test":"TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority","Elapsed":0} +{"Time":"2026-10-09T10:40:17.0070855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:17.0112336+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/lsdpreception\t1.238s\n"} +{"Time":"2026-10-09T10:40:17.0288212+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/lsdpreception","Elapsed":1.256} +{"Time":"2026-10-09T10:40:17.9790279+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/obs"} +{"Time":"2026-10-09T10:40:18.7792668+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestInboxDroppedMetric"} +{"Time":"2026-10-09T10:40:18.7792668+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestInboxDroppedMetric","Output":"=== RUN TestInboxDroppedMetric\n"} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestInboxDroppedMetric","Output":"--- PASS: TestInboxDroppedMetric (0.00s)\n"} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestInboxDroppedMetric","Elapsed":0} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestTaskCPUSecondsMetric"} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestTaskCPUSecondsMetric","Output":"=== RUN TestTaskCPUSecondsMetric\n"} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestTaskCPUSecondsMetric","Output":"--- PASS: TestTaskCPUSecondsMetric (0.00s)\n"} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/obs","Test":"TestTaskCPUSecondsMetric","Elapsed":0} +{"Time":"2026-10-09T10:40:18.7797861+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/obs","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:18.7829707+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/obs","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/obs\t0.803s\n"} +{"Time":"2026-10-09T10:40:18.7931335+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/obs","Elapsed":0.814} +{"Time":"2026-10-09T10:40:19.3481416+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/protocol"} +{"Time":"2026-10-09T10:40:19.7279502+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Snapshot"} +{"Time":"2026-10-09T10:40:19.7279502+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Snapshot","Output":"=== RUN TestGolden_Snapshot\n"} +{"Time":"2026-10-09T10:40:19.7279502+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Snapshot","Output":"--- PASS: TestGolden_Snapshot (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7279502+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Snapshot","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7279502+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Delta"} +{"Time":"2026-10-09T10:40:19.7279502+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Delta","Output":"=== RUN TestGolden_Delta\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Delta","Output":"--- PASS: TestGolden_Delta (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Delta","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_SceneChanged"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_SceneChanged","Output":"=== RUN TestGolden_SceneChanged\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_SceneChanged","Output":"--- PASS: TestGolden_SceneChanged (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_SceneChanged","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Error"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Error","Output":"=== RUN TestGolden_Error\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Error","Output":"--- PASS: TestGolden_Error (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_Error","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames","Output":"=== RUN TestGolden_DecodesIncomingFrames\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-null"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-null","Output":"=== RUN TestGolden_DecodesIncomingFrames/subscribe-null\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-null","Output":"--- PASS: TestGolden_DecodesIncomingFrames/subscribe-null (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-null","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-with-cursor"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-with-cursor","Output":"=== RUN TestGolden_DecodesIncomingFrames/subscribe-with-cursor\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-with-cursor","Output":"--- PASS: TestGolden_DecodesIncomingFrames/subscribe-with-cursor (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/subscribe-with-cursor","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/input"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/input","Output":"=== RUN TestGolden_DecodesIncomingFrames/input\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/input","Output":"--- PASS: TestGolden_DecodesIncomingFrames/input (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/input","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/unsubscribe"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/unsubscribe","Output":"=== RUN TestGolden_DecodesIncomingFrames/unsubscribe\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/unsubscribe","Output":"--- PASS: TestGolden_DecodesIncomingFrames/unsubscribe (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/unsubscribe","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/ping"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/ping","Output":"=== RUN TestGolden_DecodesIncomingFrames/ping\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/ping","Output":"--- PASS: TestGolden_DecodesIncomingFrames/ping (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames/ping","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames","Output":"--- PASS: TestGolden_DecodesIncomingFrames (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestGolden_DecodesIncomingFrames","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestVersionMismatch_PinsTheCanonicalErrorPath"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestVersionMismatch_PinsTheCanonicalErrorPath","Output":"=== RUN TestVersionMismatch_PinsTheCanonicalErrorPath\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestVersionMismatch_PinsTheCanonicalErrorPath","Output":"--- PASS: TestVersionMismatch_PinsTheCanonicalErrorPath (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestVersionMismatch_PinsTheCanonicalErrorPath","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SetsTypeAndV"} +{"Time":"2026-10-09T10:40:19.7284973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SetsTypeAndV","Output":"=== RUN TestEncode_SetsTypeAndV\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SetsTypeAndV","Output":"--- PASS: TestEncode_SetsTypeAndV (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SetsTypeAndV","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SubscribedWriterAck"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SubscribedWriterAck","Output":"=== RUN TestEncode_SubscribedWriterAck\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SubscribedWriterAck","Output":"--- PASS: TestEncode_SubscribedWriterAck (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_SubscribedWriterAck","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_DispatchesByType"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_DispatchesByType","Output":"=== RUN TestDecode_DispatchesByType\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_DispatchesByType","Output":"--- PASS: TestDecode_DispatchesByType (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_DispatchesByType","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_VersionMismatch"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_VersionMismatch","Output":"=== RUN TestDecode_VersionMismatch\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_VersionMismatch","Output":"--- PASS: TestDecode_VersionMismatch (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_VersionMismatch","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_UnknownType"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_UnknownType","Output":"=== RUN TestDecode_UnknownType\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_UnknownType","Output":"--- PASS: TestDecode_UnknownType (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestDecode_UnknownType","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoHTMLEscaping"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoHTMLEscaping","Output":"=== RUN TestEncode_NoHTMLEscaping\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoHTMLEscaping","Output":"--- PASS: TestEncode_NoHTMLEscaping (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoHTMLEscaping","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoTrailingNewline"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoTrailingNewline","Output":"=== RUN TestEncode_NoTrailingNewline\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoTrailingNewline","Output":"--- PASS: TestEncode_NoTrailingNewline (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestEncode_NoTrailingNewline","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_NullSince"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_NullSince","Output":"=== RUN TestRoundTrip_Subscribe_NullSince\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_NullSince","Output":"--- PASS: TestRoundTrip_Subscribe_NullSince (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_NullSince","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_SinceSequenceSet"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_SinceSequenceSet","Output":"=== RUN TestRoundTrip_Subscribe_SinceSequenceSet\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_SinceSequenceSet","Output":"--- PASS: TestRoundTrip_Subscribe_SinceSequenceSet (0.00s)\n"} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Test":"TestRoundTrip_Subscribe_SinceSequenceSet","Elapsed":0} +{"Time":"2026-10-09T10:40:19.7290246+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:19.7318714+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/protocol\t0.384s\n"} +{"Time":"2026-10-09T10:40:19.7408896+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/protocol","Elapsed":0.393} +{"Time":"2026-10-09T10:40:20.7190719+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/providers"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_ParsesAsCanonicalEnvelope"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_ParsesAsCanonicalEnvelope","Output":"=== RUN TestBuildEvent_ParsesAsCanonicalEnvelope\n"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_ParsesAsCanonicalEnvelope","Output":"--- PASS: TestBuildEvent_ParsesAsCanonicalEnvelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_ParsesAsCanonicalEnvelope","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestParseEventPreservesStrictJSONNumbers"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestParseEventPreservesStrictJSONNumbers","Output":"=== RUN TestParseEventPreservesStrictJSONNumbers\n"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestParseEventPreservesStrictJSONNumbers","Output":"--- PASS: TestParseEventPreservesStrictJSONNumbers (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestParseEventPreservesStrictJSONNumbers","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_TamperedPayloadFailsDigest"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_TamperedPayloadFailsDigest","Output":"=== RUN TestBuildEvent_TamperedPayloadFailsDigest\n"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_TamperedPayloadFailsDigest","Output":"--- PASS: TestBuildEvent_TamperedPayloadFailsDigest (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestBuildEvent_TamperedPayloadFailsDigest","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActivePlatform_UsesCanonicalLeafAndOrdering"} +{"Time":"2026-10-09T10:40:21.5435871+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActivePlatform_UsesCanonicalLeafAndOrdering","Output":"=== RUN TestInjectActivePlatform_UsesCanonicalLeafAndOrdering\n"} +{"Time":"2026-10-09T10:40:21.5446482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActivePlatform_UsesCanonicalLeafAndOrdering","Output":"--- PASS: TestInjectActivePlatform_UsesCanonicalLeafAndOrdering (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5446482+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActivePlatform_UsesCanonicalLeafAndOrdering","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5446482+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActive_IsActiveOnly"} +{"Time":"2026-10-09T10:40:21.5446482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActive_IsActiveOnly","Output":"=== RUN TestInjectActive_IsActiveOnly\n"} +{"Time":"2026-10-09T10:40:21.5451751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActive_IsActiveOnly","Output":"--- PASS: TestInjectActive_IsActiveOnly (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5451751+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestInjectActive_IsActiveOnly","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5451751+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestIsolation_OnAirOnlyProviderNeverArmedInPreview"} +{"Time":"2026-10-09T10:40:21.5451751+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestIsolation_OnAirOnlyProviderNeverArmedInPreview","Output":"=== RUN TestIsolation_OnAirOnlyProviderNeverArmedInPreview\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestIsolation_OnAirOnlyProviderNeverArmedInPreview","Output":"--- PASS: TestIsolation_OnAirOnlyProviderNeverArmedInPreview (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestIsolation_OnAirOnlyProviderNeverArmedInPreview","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_EachProviderParsesAsCanonicalEnvelope"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_EachProviderParsesAsCanonicalEnvelope","Output":"=== RUN TestRegistry_EachProviderParsesAsCanonicalEnvelope\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_EachProviderParsesAsCanonicalEnvelope","Output":"--- PASS: TestRegistry_EachProviderParsesAsCanonicalEnvelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_EachProviderParsesAsCanonicalEnvelope","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_CapabilitiesAreUnique"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_CapabilitiesAreUnique","Output":"=== RUN TestRegistry_CapabilitiesAreUnique\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_CapabilitiesAreUnique","Output":"--- PASS: TestRegistry_CapabilitiesAreUnique (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestRegistry_CapabilitiesAreUnique","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestPolicy_GatesHTTPEgressOnDeploymentPosture"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestPolicy_GatesHTTPEgressOnDeploymentPosture","Output":"=== RUN TestPolicy_GatesHTTPEgressOnDeploymentPosture\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestPolicy_GatesHTTPEgressOnDeploymentPosture","Output":"--- PASS: TestPolicy_GatesHTTPEgressOnDeploymentPosture (0.00s)\n"} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Test":"TestPolicy_GatesHTTPEgressOnDeploymentPosture","Elapsed":0} +{"Time":"2026-10-09T10:40:21.5462197+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:21.5499929+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/providers","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/providers\t0.831s\n"} +{"Time":"2026-10-09T10:40:21.5678348+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/providers","Elapsed":0.849} +{"Time":"2026-10-09T10:40:24.2668926+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/runtime"} +{"Time":"2026-10-09T10:40:25.2330672+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCanary_CompilesEmitsExecAndRunsLive"} +{"Time":"2026-10-09T10:40:25.2330672+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCanary_CompilesEmitsExecAndRunsLive","Output":"=== RUN TestCanary_CompilesEmitsExecAndRunsLive\n"} +{"Time":"2026-10-09T10:40:25.238327+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCanary_CompilesEmitsExecAndRunsLive","Output":"--- PASS: TestCanary_CompilesEmitsExecAndRunsLive (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.238327+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCanary_CompilesEmitsExecAndRunsLive","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.238327+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestChainedReference_SecondQueryReachesDBWithThreadedMatchID"} +{"Time":"2026-10-09T10:40:25.238327+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestChainedReference_SecondQueryReachesDBWithThreadedMatchID","Output":"=== RUN TestChainedReference_SecondQueryReachesDBWithThreadedMatchID\n"} +{"Time":"2026-10-09T10:40:25.2456305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestChainedReference_SecondQueryReachesDBWithThreadedMatchID","Output":"--- PASS: TestChainedReference_SecondQueryReachesDBWithThreadedMatchID (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.2456305+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestChainedReference_SecondQueryReachesDBWithThreadedMatchID","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.2456305+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestQueryDescriptor_GoldenParity"} +{"Time":"2026-10-09T10:40:25.2456305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestQueryDescriptor_GoldenParity","Output":"=== RUN TestQueryDescriptor_GoldenParity\n"} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestQueryDescriptor_GoldenParity","Output":"--- PASS: TestQueryDescriptor_GoldenParity (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestQueryDescriptor_GoldenParity","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBFrom"} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBFrom","Output":"=== RUN TestPure_DBFrom\n"} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBFrom","Output":"--- PASS: TestPure_DBFrom (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBFrom","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBWhere"} +{"Time":"2026-10-09T10:40:25.2535946+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBWhere","Output":"=== RUN TestPure_DBWhere\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBWhere","Output":"--- PASS: TestPure_DBWhere (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBWhere","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBJoin"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBJoin","Output":"=== RUN TestPure_DBJoin\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBJoin","Output":"--- PASS: TestPure_DBJoin (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBJoin","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBSelect"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBSelect","Output":"=== RUN TestPure_DBSelect\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBSelect","Output":"--- PASS: TestPure_DBSelect (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBSelect","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBOrder"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBOrder","Output":"=== RUN TestPure_DBOrder\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBOrder","Output":"--- PASS: TestPure_DBOrder (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBOrder","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBLimit"} +{"Time":"2026-10-09T10:40:25.2541305+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBLimit","Output":"=== RUN TestPure_DBLimit\n"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBLimit","Output":"--- PASS: TestPure_DBLimit (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBLimit","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBTotality_MalformedPlan"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBTotality_MalformedPlan","Output":"=== RUN TestPure_DBTotality_MalformedPlan\n"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBTotality_MalformedPlan","Output":"--- PASS: TestPure_DBTotality_MalformedPlan (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBTotality_MalformedPlan","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBChain_ParityWithQueryMeShape"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBChain_ParityWithQueryMeShape","Output":"=== RUN TestPure_DBChain_ParityWithQueryMeShape\n"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBChain_ParityWithQueryMeShape","Output":"--- PASS: TestPure_DBChain_ParityWithQueryMeShape (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DBChain_ParityWithQueryMeShape","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDBFromWired_TableThreadsToQueryBody"} +{"Time":"2026-10-09T10:40:25.2546779+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDBFromWired_TableThreadsToQueryBody","Output":"=== RUN TestDBFromWired_TableThreadsToQueryBody\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDBFromWired_TableThreadsToQueryBody","Output":"--- PASS: TestDBFromWired_TableThreadsToQueryBody (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDBFromWired_TableThreadsToQueryBody","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric","Output":"=== RUN TestCompare_EqualValueAndNumeric\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_match"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_match","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_string_match\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_match","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_string_match (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_match","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_mismatch"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_mismatch","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_string_mismatch\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_mismatch","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_string_mismatch (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_string_mismatch","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_mismatch"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_mismatch","Output":"=== RUN TestCompare_EqualValueAndNumeric/ne_string_mismatch\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_mismatch","Output":"--- PASS: TestCompare_EqualValueAndNumeric/ne_string_mismatch (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_mismatch","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_match"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_match","Output":"=== RUN TestCompare_EqualValueAndNumeric/ne_string_match\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_match","Output":"--- PASS: TestCompare_EqualValueAndNumeric/ne_string_match (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_string_match","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_equal"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_equal","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_num_equal\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_equal","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_num_equal (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_equal","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_differ"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_differ","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_num_differ\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_differ","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_num_differ (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_differ","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_int_float"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_int_float","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_int_float\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_int_float","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_int_float (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_int_float","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_differ"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_differ","Output":"=== RUN TestCompare_EqualValueAndNumeric/ne_num_differ\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_differ","Output":"--- PASS: TestCompare_EqualValueAndNumeric/ne_num_differ (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_differ","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_int_float"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_int_float","Output":"=== RUN TestCompare_EqualValueAndNumeric/ne_int_float\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_int_float","Output":"--- PASS: TestCompare_EqualValueAndNumeric/ne_int_float (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_int_float","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_vs_string"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_vs_string","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_num_vs_string\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_vs_string","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_num_vs_string (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_num_vs_string","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_vs_string"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_vs_string","Output":"=== RUN TestCompare_EqualValueAndNumeric/ne_num_vs_string\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_vs_string","Output":"--- PASS: TestCompare_EqualValueAndNumeric/ne_num_vs_string (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/ne_num_vs_string","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_bool\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_bool (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool_differ"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool_differ","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_bool_differ\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool_differ","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_bool_differ (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_bool_differ","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_null"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_null","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_null\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_null","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_null (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_null","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_spaced_bool"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_spaced_bool","Output":"=== RUN TestCompare_EqualValueAndNumeric/eq_spaced_bool\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_spaced_bool","Output":"--- PASS: TestCompare_EqualValueAndNumeric/eq_spaced_bool (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric/eq_spaced_bool","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric","Output":"--- PASS: TestCompare_EqualValueAndNumeric (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualValueAndNumeric","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualReadsXYPorts"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualReadsXYPorts","Output":"=== RUN TestCompare_EqualReadsXYPorts\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualReadsXYPorts","Output":"--- PASS: TestCompare_EqualReadsXYPorts (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_EqualReadsXYPorts","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_OrderComparatorsStayNumeric"} +{"Time":"2026-10-09T10:40:25.2614849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_OrderComparatorsStayNumeric","Output":"=== RUN TestCompare_OrderComparatorsStayNumeric\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_OrderComparatorsStayNumeric","Output":"--- PASS: TestCompare_OrderComparatorsStayNumeric (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompare_OrderComparatorsStayNumeric","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMax_SignedZero"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMax_SignedZero","Output":"=== RUN TestProbe_AggregateMax_SignedZero\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMax_SignedZero","Output":"--- PASS: TestProbe_AggregateMax_SignedZero (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMax_SignedZero","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateAvgSingle"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateAvgSingle","Output":"=== RUN TestProbe_AggregateAvgSingle\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateAvgSingle","Output":"--- PASS: TestProbe_AggregateAvgSingle (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateAvgSingle","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMinMaxTieNoZero"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMinMaxTieNoZero","Output":"=== RUN TestProbe_AggregateMinMaxTieNoZero\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMinMaxTieNoZero","Output":"--- PASS: TestProbe_AggregateMinMaxTieNoZero (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_AggregateMinMaxTieNoZero","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_NonFinite_Propagation"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_NonFinite_Propagation","Output":"=== RUN TestProbe_NonFinite_Propagation\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_NonFinite_Propagation","Output":"--- PASS: TestProbe_NonFinite_Propagation (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_NonFinite_Propagation","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NullIntermediatePaths"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NullIntermediatePaths","Output":"=== RUN TestProbe_GetField_NullIntermediatePaths\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NullIntermediatePaths","Output":"--- PASS: TestProbe_GetField_NullIntermediatePaths (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NullIntermediatePaths","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_ConfigPathNull"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_ConfigPathNull","Output":"=== RUN TestProbe_GetField_ConfigPathNull\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_ConfigPathNull","Output":"--- PASS: TestProbe_GetField_ConfigPathNull (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_ConfigPathNull","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_WhitespaceListIndex"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_WhitespaceListIndex","Output":"=== RUN TestProbe_GetField_WhitespaceListIndex\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_WhitespaceListIndex","Output":"--- PASS: TestProbe_GetField_WhitespaceListIndex (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_WhitespaceListIndex","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NegativeIndexEdge"} +{"Time":"2026-10-09T10:40:25.2620137+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NegativeIndexEdge","Output":"=== RUN TestProbe_GetField_NegativeIndexEdge\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NegativeIndexEdge","Output":"--- PASS: TestProbe_GetField_NegativeIndexEdge (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_GetField_NegativeIndexEdge","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_ConfigPathNull"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_ConfigPathNull","Output":"=== RUN TestProbe_SetField_ConfigPathNull\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_ConfigPathNull","Output":"--- PASS: TestProbe_SetField_ConfigPathNull (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_ConfigPathNull","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_DeepNested"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_DeepNested","Output":"=== RUN TestProbe_SetField_DeepNested\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_DeepNested","Output":"--- PASS: TestProbe_SetField_DeepNested (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_SetField_DeepNested","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ToInteger_NegZeroTrunc"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ToInteger_NegZeroTrunc","Output":"=== RUN TestProbe_ToInteger_NegZeroTrunc\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ToInteger_NegZeroTrunc","Output":"--- PASS: TestProbe_ToInteger_NegZeroTrunc (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ToInteger_NegZeroTrunc","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_NullTemplate"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_NullTemplate","Output":"=== RUN TestProbe_StringFormat_NullTemplate\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_NullTemplate","Output":"--- PASS: TestProbe_StringFormat_NullTemplate (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_NullTemplate","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_BraceEscapes"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_BraceEscapes","Output":"=== RUN TestProbe_StringFormat_BraceEscapes\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_BraceEscapes","Output":"--- PASS: TestProbe_StringFormat_BraceEscapes (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringFormat_BraceEscapes","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_Logic_NegZeroFalsy"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_Logic_NegZeroFalsy","Output":"=== RUN TestProbe_Logic_NegZeroFalsy\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_Logic_NegZeroFalsy","Output":"--- PASS: TestProbe_Logic_NegZeroFalsy (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_Logic_NegZeroFalsy","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_LargeInt"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_LargeInt","Output":"=== RUN TestProbe_ListAt_LargeInt\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_LargeInt","Output":"--- PASS: TestProbe_ListAt_LargeInt (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_LargeInt","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_NegativeIndex"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_NegativeIndex","Output":"=== RUN TestProbe_ListAt_NegativeIndex\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_NegativeIndex","Output":"--- PASS: TestProbe_ListAt_NegativeIndex (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ListAt_NegativeIndex","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ConfigStrNilMap"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ConfigStrNilMap","Output":"=== RUN TestProbe_ConfigStrNilMap\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ConfigStrNilMap","Output":"--- PASS: TestProbe_ConfigStrNilMap (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_ConfigStrNilMap","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_MinMaxCoercions"} +{"Time":"2026-10-09T10:40:25.2625443+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_MinMaxCoercions","Output":"=== RUN TestProbe_MinMaxCoercions\n"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_MinMaxCoercions","Output":"--- PASS: TestProbe_MinMaxCoercions (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_MinMaxCoercions","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringSplit_MultiChar"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringSplit_MultiChar","Output":"=== RUN TestProbe_StringSplit_MultiChar\n"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringSplit_MultiChar","Output":"--- PASS: TestProbe_StringSplit_MultiChar (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_StringSplit_MultiChar","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_WiredNullVsMissing"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_WiredNullVsMissing","Output":"=== RUN TestProbe_WiredNullVsMissing\n"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_WiredNullVsMissing","Output":"--- PASS: TestProbe_WiredNullVsMissing (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestProbe_WiredNullVsMissing","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_Logic"} +{"Time":"2026-10-09T10:40:25.2630604+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_Logic","Output":"=== RUN TestPure_Logic\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_Logic","Output":"--- PASS: TestPure_Logic (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_Logic","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathAbs"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathAbs","Output":"=== RUN TestPure_MathAbs\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathAbs","Output":"--- PASS: TestPure_MathAbs (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathAbs","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax_SignedZero"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax_SignedZero","Output":"=== RUN TestPure_MathMinMax_SignedZero\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax_SignedZero","Output":"--- PASS: TestPure_MathMinMax_SignedZero (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax_SignedZero","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax","Output":"=== RUN TestPure_MathMinMax\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax","Output":"--- PASS: TestPure_MathMinMax (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathMinMax","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathClamp"} +{"Time":"2026-10-09T10:40:25.2635816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathClamp","Output":"=== RUN TestPure_MathClamp\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathClamp","Output":"--- PASS: TestPure_MathClamp (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathClamp","Elapsed":0} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathLerp"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathLerp","Output":"=== RUN TestPure_MathLerp\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathLerp","Output":"--- PASS: TestPure_MathLerp (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathLerp","Elapsed":0} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathRound"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathRound","Output":"=== RUN TestPure_MathRound\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathRound","Output":"--- PASS: TestPure_MathRound (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathRound","Elapsed":0} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathFloorCeil"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathFloorCeil","Output":"=== RUN TestPure_MathFloorCeil\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathFloorCeil","Output":"--- PASS: TestPure_MathFloorCeil (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_MathFloorCeil","Elapsed":0} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringConcat"} +{"Time":"2026-10-09T10:40:25.264116+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringConcat","Output":"=== RUN TestPure_StringConcat\n"} +{"Time":"2026-10-09T10:40:25.2646512+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringConcat","Output":"--- PASS: TestPure_StringConcat (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2646512+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringConcat","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2646512+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringFormat"} +{"Time":"2026-10-09T10:40:25.2646512+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringFormat","Output":"=== RUN TestPure_StringFormat\n"} +{"Time":"2026-10-09T10:40:25.2651709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringFormat","Output":"--- PASS: TestPure_StringFormat (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2651709+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringFormat","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2651709+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringLength"} +{"Time":"2026-10-09T10:40:25.2651709+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringLength","Output":"=== RUN TestPure_StringLength\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringLength","Output":"--- PASS: TestPure_StringLength (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringLength","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringSplit"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringSplit","Output":"=== RUN TestPure_StringSplit\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringSplit","Output":"--- PASS: TestPure_StringSplit (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringSplit","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringUpperLower"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringUpperLower","Output":"=== RUN TestPure_StringUpperLower\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringUpperLower","Output":"--- PASS: TestPure_StringUpperLower (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_StringUpperLower","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToString"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToString","Output":"=== RUN TestPure_CastToString\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToString","Output":"--- PASS: TestPure_CastToString (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToString","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToInteger"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToInteger","Output":"=== RUN TestPure_CastToInteger\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToInteger","Output":"--- PASS: TestPure_CastToInteger (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToInteger","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToFloat"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToFloat","Output":"=== RUN TestPure_CastToFloat\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToFloat","Output":"--- PASS: TestPure_CastToFloat (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToFloat","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToBoolean"} +{"Time":"2026-10-09T10:40:25.2656913+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToBoolean","Output":"=== RUN TestPure_CastToBoolean\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToBoolean","Output":"--- PASS: TestPure_CastToBoolean (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_CastToBoolean","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataGetField"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataGetField","Output":"=== RUN TestPure_DataGetField\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataGetField","Output":"--- PASS: TestPure_DataGetField (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataGetField","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataSetField"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataSetField","Output":"=== RUN TestPure_DataSetField\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataSetField","Output":"--- PASS: TestPure_DataSetField (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataSetField","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListLength"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListLength","Output":"=== RUN TestPure_DataListLength\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListLength","Output":"--- PASS: TestPure_DataListLength (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListLength","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAt"} +{"Time":"2026-10-09T10:40:25.2662192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAt","Output":"=== RUN TestPure_DataListAt\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAt","Output":"--- PASS: TestPure_DataListAt (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAt","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAppend"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAppend","Output":"=== RUN TestPure_DataListAppend\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAppend","Output":"--- PASS: TestPure_DataListAppend (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataListAppend","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataAggregate"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataAggregate","Output":"=== RUN TestPure_DataAggregate\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataAggregate","Output":"--- PASS: TestPure_DataAggregate (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_DataAggregate","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_ClampShuffledEdges"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_ClampShuffledEdges","Output":"=== RUN TestPure_NamedPorts_ClampShuffledEdges\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_ClampShuffledEdges","Output":"--- PASS: TestPure_NamedPorts_ClampShuffledEdges (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_ClampShuffledEdges","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_LerpShuffledEdges"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_LerpShuffledEdges","Output":"=== RUN TestPure_NamedPorts_LerpShuffledEdges\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_LerpShuffledEdges","Output":"--- PASS: TestPure_NamedPorts_LerpShuffledEdges (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_LerpShuffledEdges","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_GetFieldConfigCarried"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_GetFieldConfigCarried","Output":"=== RUN TestPure_NamedPorts_GetFieldConfigCarried\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_GetFieldConfigCarried","Output":"--- PASS: TestPure_NamedPorts_GetFieldConfigCarried (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPure_NamedPorts_GetFieldConfigCarried","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead","Output":"=== RUN TestCompute_SourceRead\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/returns_the_resolved_source_object_verbatim"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/returns_the_resolved_source_object_verbatim","Output":"=== RUN TestCompute_SourceRead/returns_the_resolved_source_object_verbatim\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/returns_the_resolved_source_object_verbatim","Output":"--- PASS: TestCompute_SourceRead/returns_the_resolved_source_object_verbatim (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/returns_the_resolved_source_object_verbatim","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/ignores_inputs_(seed_declares_none)"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/ignores_inputs_(seed_declares_none)","Output":"=== RUN TestCompute_SourceRead/ignores_inputs_(seed_declares_none)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/ignores_inputs_(seed_declares_none)","Output":"--- PASS: TestCompute_SourceRead/ignores_inputs_(seed_declares_none) (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/ignores_inputs_(seed_declares_none)","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/total:_missing___resolved_source_yields_null,_never_errors"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/total:_missing___resolved_source_yields_null,_never_errors","Output":"=== RUN TestCompute_SourceRead/total:_missing___resolved_source_yields_null,_never_errors\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/total:_missing___resolved_source_yields_null,_never_errors","Output":"--- PASS: TestCompute_SourceRead/total:_missing___resolved_source_yields_null,_never_errors (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead/total:_missing___resolved_source_yields_null,_never_errors","Elapsed":0} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead","Output":"--- PASS: TestCompute_SourceRead (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.266734+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestCompute_SourceRead","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes","Output":"=== RUN TestConformance_EveryComputeNodeExecutes\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-boolean@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-boolean@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.cast.to-boolean@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-boolean@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.cast.to-boolean@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-boolean@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-float@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-float@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.cast.to-float@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-float@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.cast.to-float@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-float@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-integer@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-integer@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.cast.to-integer@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-integer@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.cast.to-integer@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-integer@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-string@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-string@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.cast.to-string@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-string@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.cast.to-string@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.cast.to-string@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.equal@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.equal@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.compare.equal@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.equal@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.compare.equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-equal@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-equal@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.compare.greater-equal@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-equal@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.compare.greater-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-than@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-than@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.compare.greater-than@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-than@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.compare.greater-than@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.greater-than@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-equal@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-equal@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.compare.less-equal@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-equal@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.compare.less-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-than@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-than@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.compare.less-than@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-than@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.compare.less-than@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.less-than@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.not-equal@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.not-equal@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.compare.not-equal@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.not-equal@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.compare.not-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.compare.not-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.aggregate@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.aggregate@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.data.aggregate@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.aggregate@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.data.aggregate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.aggregate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.get-field@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.get-field@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.data.get-field@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.get-field@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.data.get-field@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.get-field@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-append@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-append@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.data.list-append@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-append@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.data.list-append@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-append@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-at@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-at@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.data.list-at@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-at@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.data.list-at@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-at@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-length@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-length@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.data.list-length@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-length@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.data.list-length@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.list-length@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.set-field@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.set-field@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.data.set-field@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.set-field@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.data.set-field@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.data.set-field@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.from@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.from@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.db.from@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.from@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.db.from@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.from@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.join@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.join@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.db.join@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.join@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.db.join@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.join@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.limit@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.limit@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.db.limit@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.limit@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.db.limit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.limit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.order@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.order@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.db.order@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.order@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.db.order@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.order@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.select@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.select@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.db.select@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.select@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.db.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.where@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.where@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.db.where@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.where@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.db.where@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.db.where@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.flow.select@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.flow.select@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.flow.select@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.flow.select@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.flow.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.flow.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.and@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.and@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.logic.and@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.and@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.logic.and@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.and@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.not@1"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.not@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.logic.not@1\n"} +{"Time":"2026-10-09T10:40:25.2674477+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.not@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.logic.not@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.not@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.or@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.or@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.logic.or@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.or@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.logic.or@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.or@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.xor@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.xor@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.logic.xor@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.xor@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.logic.xor@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.logic.xor@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.abs@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.abs@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.abs@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.abs@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.abs@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.abs@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.add@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.add@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.add@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.add@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.add@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.add@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.ceil@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.ceil@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.ceil@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.ceil@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.ceil@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.ceil@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.clamp@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.clamp@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.clamp@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.clamp@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.clamp@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.clamp@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.div@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.div@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.div@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.div@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.div@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.div@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.floor@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.floor@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.floor@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.floor@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.floor@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.floor@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.lerp@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.lerp@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.lerp@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.lerp@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.lerp@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.lerp@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.max@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.max@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.max@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.max@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.max@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.max@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.min@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.min@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.min@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.min@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.min@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.min@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mod@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mod@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.mod@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mod@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.mod@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mod@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mul@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mul@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.mul@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mul@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.mul@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.mul@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.round@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.round@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.round@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.round@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.round@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.round@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.sub@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.sub@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.math.sub@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.sub@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.math.sub@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.math.sub@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.output@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.output@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.output@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.output@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.output@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.output@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.source.read@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.source.read@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.source.read@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.source.read@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.source.read@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.source.read@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.concat@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.concat@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.string.concat@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.concat@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.string.concat@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.concat@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.format@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.format@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.string.format@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.format@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.string.format@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.format@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.length@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.length@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.string.length@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.length@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.string.length@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.length@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.lower@1"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.lower@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.string.lower@1\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.lower@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.string.lower@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.lower@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2679885+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.split@1"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.split@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.string.split@1\n"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.split@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.string.split@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.split@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.upper@1"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.upper@1","Output":"=== RUN TestConformance_EveryComputeNodeExecutes/core.string.upper@1\n"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.upper@1","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes/core.string.upper@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes/core.string.upper@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes","Output":"--- PASS: TestConformance_EveryComputeNodeExecutes (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryComputeNodeExecutes","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes","Output":"=== RUN TestConformance_EveryExecOpExecutes\n"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/animation.play"} +{"Time":"2026-10-09T10:40:25.2685176+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/animation.play","Output":"=== RUN TestConformance_EveryExecOpExecutes/animation.play\n"} +{"Time":"2026-10-09T10:40:25.2706188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/animation.play","Output":"--- PASS: TestConformance_EveryExecOpExecutes/animation.play (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2706188+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/animation.play","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2706188+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/assign-slot"} +{"Time":"2026-10-09T10:40:25.2706188+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/assign-slot","Output":"=== RUN TestConformance_EveryExecOpExecutes/assign-slot\n"} +{"Time":"2026-10-09T10:40:25.2733254+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/assign-slot","Output":"--- PASS: TestConformance_EveryExecOpExecutes/assign-slot (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2733254+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/assign-slot","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2733254+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/branch"} +{"Time":"2026-10-09T10:40:25.2733254+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/branch","Output":"=== RUN TestConformance_EveryExecOpExecutes/branch\n"} +{"Time":"2026-10-09T10:40:25.2759315+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/branch","Output":"--- PASS: TestConformance_EveryExecOpExecutes/branch (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2759315+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/branch","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2759315+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/db.query"} +{"Time":"2026-10-09T10:40:25.2759315+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/db.query","Output":"=== RUN TestConformance_EveryExecOpExecutes/db.query\n"} +{"Time":"2026-10-09T10:40:25.2785252+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/db.query","Output":"--- PASS: TestConformance_EveryExecOpExecutes/db.query (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2785252+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/db.query","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2785252+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/delay"} +{"Time":"2026-10-09T10:40:25.2785252+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/delay","Output":"=== RUN TestConformance_EveryExecOpExecutes/delay\n"} +{"Time":"2026-10-09T10:40:25.2809199+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/delay","Output":"--- PASS: TestConformance_EveryExecOpExecutes/delay (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2809199+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/delay","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2809199+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-each"} +{"Time":"2026-10-09T10:40:25.2809199+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-each","Output":"=== RUN TestConformance_EveryExecOpExecutes/for-each\n"} +{"Time":"2026-10-09T10:40:25.2836618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-each","Output":"--- PASS: TestConformance_EveryExecOpExecutes/for-each (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2836618+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-each","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2836618+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-loop"} +{"Time":"2026-10-09T10:40:25.2836618+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-loop","Output":"=== RUN TestConformance_EveryExecOpExecutes/for-loop\n"} +{"Time":"2026-10-09T10:40:25.2856879+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-loop","Output":"--- PASS: TestConformance_EveryExecOpExecutes/for-loop (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2856879+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/for-loop","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2856879+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/gate"} +{"Time":"2026-10-09T10:40:25.2856879+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/gate","Output":"=== RUN TestConformance_EveryExecOpExecutes/gate\n"} +{"Time":"2026-10-09T10:40:25.2879583+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/gate","Output":"--- PASS: TestConformance_EveryExecOpExecutes/gate (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2879583+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/gate","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2879583+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/http.request"} +{"Time":"2026-10-09T10:40:25.2879583+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/http.request","Output":"=== RUN TestConformance_EveryExecOpExecutes/http.request\n"} +{"Time":"2026-10-09T10:40:25.290542+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/http.request","Output":"--- PASS: TestConformance_EveryExecOpExecutes/http.request (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.290542+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/http.request","Elapsed":0} +{"Time":"2026-10-09T10:40:25.290542+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/operator.await"} +{"Time":"2026-10-09T10:40:25.290542+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/operator.await","Output":"=== RUN TestConformance_EveryExecOpExecutes/operator.await\n"} +{"Time":"2026-10-09T10:40:25.2932218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/operator.await","Output":"--- PASS: TestConformance_EveryExecOpExecutes/operator.await (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2932218+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/operator.await","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2932218+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/overlay-app.set"} +{"Time":"2026-10-09T10:40:25.2932218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/overlay-app.set","Output":"=== RUN TestConformance_EveryExecOpExecutes/overlay-app.set\n"} +{"Time":"2026-10-09T10:40:25.2958043+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/overlay-app.set","Output":"--- PASS: TestConformance_EveryExecOpExecutes/overlay-app.set (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2958043+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/overlay-app.set","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2958043+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/print"} +{"Time":"2026-10-09T10:40:25.2958043+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/print","Output":"=== RUN TestConformance_EveryExecOpExecutes/print\n"} +{"Time":"2026-10-09T10:40:25.2984124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/print","Output":"--- PASS: TestConformance_EveryExecOpExecutes/print (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.2984124+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/print","Elapsed":0} +{"Time":"2026-10-09T10:40:25.2984124+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/sequence"} +{"Time":"2026-10-09T10:40:25.2984124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/sequence","Output":"=== RUN TestConformance_EveryExecOpExecutes/sequence\n"} +{"Time":"2026-10-09T10:40:25.3009661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/sequence","Output":"--- PASS: TestConformance_EveryExecOpExecutes/sequence (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3009661+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/sequence","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3009661+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/service.call"} +{"Time":"2026-10-09T10:40:25.3009661+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/service.call","Output":"=== RUN TestConformance_EveryExecOpExecutes/service.call\n"} +{"Time":"2026-10-09T10:40:25.3036421+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/service.call","Output":"--- PASS: TestConformance_EveryExecOpExecutes/service.call (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3036421+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/service.call","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3036421+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/show.emit"} +{"Time":"2026-10-09T10:40:25.3036421+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/show.emit","Output":"=== RUN TestConformance_EveryExecOpExecutes/show.emit\n"} +{"Time":"2026-10-09T10:40:25.3062697+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/show.emit","Output":"--- PASS: TestConformance_EveryExecOpExecutes/show.emit (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3062697+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/show.emit","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3062697+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/variable.set"} +{"Time":"2026-10-09T10:40:25.3062697+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/variable.set","Output":"=== RUN TestConformance_EveryExecOpExecutes/variable.set\n"} +{"Time":"2026-10-09T10:40:25.3088666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/variable.set","Output":"--- PASS: TestConformance_EveryExecOpExecutes/variable.set (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3088666+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/variable.set","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3088666+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/while"} +{"Time":"2026-10-09T10:40:25.3088666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/while","Output":"=== RUN TestConformance_EveryExecOpExecutes/while\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/while","Output":"--- PASS: TestConformance_EveryExecOpExecutes/while (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes/while","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes","Output":"--- PASS: TestConformance_EveryExecOpExecutes (0.04s)\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestConformance_EveryExecOpExecutes","Elapsed":0.04} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeWalksDirtyConeOnly"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeWalksDirtyConeOnly","Output":"=== RUN TestScene_RecomputeWalksDirtyConeOnly\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeWalksDirtyConeOnly","Output":"--- PASS: TestScene_RecomputeWalksDirtyConeOnly (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeWalksDirtyConeOnly","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeIdempotentWriteSeedsNothing"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeIdempotentWriteSeedsNothing","Output":"=== RUN TestScene_RecomputeIdempotentWriteSeedsNothing\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeIdempotentWriteSeedsNothing","Output":"--- PASS: TestScene_RecomputeIdempotentWriteSeedsNothing (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeIdempotentWriteSeedsNothing","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeUnchangedValueStopsPropagation"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeUnchangedValueStopsPropagation","Output":"=== RUN TestScene_RecomputeUnchangedValueStopsPropagation\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeUnchangedValueStopsPropagation","Output":"--- PASS: TestScene_RecomputeUnchangedValueStopsPropagation (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_RecomputeUnchangedValueStopsPropagation","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDraftSwitch_ChatChangesDraft"} +{"Time":"2026-10-09T10:40:25.3114334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDraftSwitch_ChatChangesDraft","Output":"=== RUN TestDraftSwitch_ChatChangesDraft\n"} +{"Time":"2026-10-09T10:40:25.3339541+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDraftSwitch_ChatChangesDraft","Output":"--- PASS: TestDraftSwitch_ChatChangesDraft (0.02s)\n"} +{"Time":"2026-10-09T10:40:25.3339541+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestDraftSwitch_ChatChangesDraft","Elapsed":0.02} +{"Time":"2026-10-09T10:40:25.3339541+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior"} +{"Time":"2026-10-09T10:40:25.3339541+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior\n"} +{"Time":"2026-10-09T10:40:25.3345309+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1"} +{"Time":"2026-10-09T10:40:25.3345309+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.animation.play@1\n"} +{"Time":"2026-10-09T10:40:25.3851536+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Output":"2026/10/09 10:40:25 ERROR Blue animation delivery failed node=op error=\"EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured\"\n"} +{"Time":"2026-10-09T10:40:25.3851536+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Output":"2026/10/09 10:40:25 ERROR Blue animation delivery failed node=op error=\"EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured\"\n"} +{"Time":"2026-10-09T10:40:25.3856782+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Output":"2026/10/09 10:40:25 ERROR Blue animation delivery failed node=op error=\"EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured\"\n"} +{"Time":"2026-10-09T10:40:25.3856782+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.animation.play@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.3856782+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.animation.play@1 (0.05s)\n"} +{"Time":"2026-10-09T10:40:25.3856782+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.animation.play@1","Elapsed":0.05} +{"Time":"2026-10-09T10:40:25.3856782+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1"} +{"Time":"2026-10-09T10:40:25.3856782+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1\n"} +{"Time":"2026-10-09T10:40:25.3867432+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.cast.to-boolean@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3867432+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.387266+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-boolean@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.387266+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1"} +{"Time":"2026-10-09T10:40:25.387266+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1\n"} +{"Time":"2026-10-09T10:40:25.3878002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.cast.to-float@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3878002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3878002+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-float@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3878002+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1"} +{"Time":"2026-10-09T10:40:25.3878002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1\n"} +{"Time":"2026-10-09T10:40:25.3883527+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.cast.to-integer@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3883527+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3888761+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-integer@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3888761+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1"} +{"Time":"2026-10-09T10:40:25.3888761+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1\n"} +{"Time":"2026-10-09T10:40:25.3894036+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.cast.to-string@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3894036+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3894036+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.cast.to-string@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3894036+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1"} +{"Time":"2026-10-09T10:40:25.3894036+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1\n"} +{"Time":"2026-10-09T10:40:25.3899411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.compare.equal@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3899411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3899411+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3899411+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1"} +{"Time":"2026-10-09T10:40:25.3899411+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1\n"} +{"Time":"2026-10-09T10:40:25.3910059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.compare.greater-equal@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3910059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3910059+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3910059+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1"} +{"Time":"2026-10-09T10:40:25.3910059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1\n"} +{"Time":"2026-10-09T10:40:25.3915368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.compare.greater-than@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3915368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3915368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.greater-than@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3915368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1"} +{"Time":"2026-10-09T10:40:25.3915368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1\n"} +{"Time":"2026-10-09T10:40:25.3920663+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.compare.less-equal@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3925992+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3925992+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3925992+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1"} +{"Time":"2026-10-09T10:40:25.3925992+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1\n"} +{"Time":"2026-10-09T10:40:25.3931675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.compare.less-than@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3931675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3931675+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.less-than@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3931675+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1"} +{"Time":"2026-10-09T10:40:25.3931675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1\n"} +{"Time":"2026-10-09T10:40:25.3942155+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.compare.not-equal@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3942155+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3942155+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.compare.not-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3942155+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1"} +{"Time":"2026-10-09T10:40:25.3942155+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1\n"} +{"Time":"2026-10-09T10:40:25.39474+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.data.aggregate@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.39474+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.39474+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.aggregate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.39474+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1"} +{"Time":"2026-10-09T10:40:25.3953338+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1\n"} +{"Time":"2026-10-09T10:40:25.3958636+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.data.get-field@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3963739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3963739+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.get-field@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3963739+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1"} +{"Time":"2026-10-09T10:40:25.3963739+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1\n"} +{"Time":"2026-10-09T10:40:25.3974629+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.data.list-append@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3974629+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3974629+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-append@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3974629+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1"} +{"Time":"2026-10-09T10:40:25.3974629+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1\n"} +{"Time":"2026-10-09T10:40:25.3985964+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.data.list-at@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3985964+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3985964+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-at@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3985964+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1"} +{"Time":"2026-10-09T10:40:25.3985964+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1\n"} +{"Time":"2026-10-09T10:40:25.3991239+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.data.list-length@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.3991239+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.3991239+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.list-length@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.3991239+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1"} +{"Time":"2026-10-09T10:40:25.3991239+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1\n"} +{"Time":"2026-10-09T10:40:25.4001633+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.data.set-field@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4001633+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4001633+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.data.set-field@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4001633+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.from@1"} +{"Time":"2026-10-09T10:40:25.4001633+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.from@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.from@1\n"} +{"Time":"2026-10-09T10:40:25.4008529+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.from@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.from@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4008529+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.from@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.from@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4008529+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.from@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4008529+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.join@1"} +{"Time":"2026-10-09T10:40:25.4008529+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.join@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.join@1\n"} +{"Time":"2026-10-09T10:40:25.4013774+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.join@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.join@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4013774+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.join@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.join@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4013774+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.join@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4013774+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.limit@1"} +{"Time":"2026-10-09T10:40:25.4013774+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.limit@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.limit@1\n"} +{"Time":"2026-10-09T10:40:25.4019069+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.limit@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.limit@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4024657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.limit@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.limit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4024657+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.limit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4024657+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.order@1"} +{"Time":"2026-10-09T10:40:25.4024657+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.order@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.order@1\n"} +{"Time":"2026-10-09T10:40:25.4029784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.order@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.order@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4029784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.order@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.order@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4029784+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.order@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4029784+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.query@1"} +{"Time":"2026-10-09T10:40:25.4029784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.query@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.query@1\n"} +{"Time":"2026-10-09T10:40:25.4104543+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.query@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.query@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4104543+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.query@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.query@1 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.4104543+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.query@1","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.4104543+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.select@1"} +{"Time":"2026-10-09T10:40:25.4104543+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.select@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.select@1\n"} +{"Time":"2026-10-09T10:40:25.4110322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.select@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.select@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4110322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.select@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4110322+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4110322+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.where@1"} +{"Time":"2026-10-09T10:40:25.4110322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.where@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.db.where@1\n"} +{"Time":"2026-10-09T10:40:25.411553+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.where@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.db.where@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.411553+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.where@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.db.where@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.411553+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.db.where@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.411553+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1"} +{"Time":"2026-10-09T10:40:25.411553+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1\n"} +{"Time":"2026-10-09T10:40:25.4142647+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.event.on-event@1 kind=entry PASS\n"} +{"Time":"2026-10-09T10:40:25.4142647+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4142647+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-event@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4142647+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1"} +{"Time":"2026-10-09T10:40:25.4142647+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1\n"} +{"Time":"2026-10-09T10:40:25.4168877+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.event.on-platform-event@1 kind=entry PASS\n"} +{"Time":"2026-10-09T10:40:25.4168877+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4168877+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-platform-event@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4168877+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1"} +{"Time":"2026-10-09T10:40:25.4168877+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1\n"} +{"Time":"2026-10-09T10:40:25.4199023+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.event.on-start@1 kind=entry PASS\n"} +{"Time":"2026-10-09T10:40:25.4199023+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4199023+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-start@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4199023+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1"} +{"Time":"2026-10-09T10:40:25.4199023+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1\n"} +{"Time":"2026-10-09T10:40:25.4235252+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.event.on-tick@1 kind=entry PASS\n"} +{"Time":"2026-10-09T10:40:25.4235252+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4240572+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.event.on-tick@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4240572+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1"} +{"Time":"2026-10-09T10:40:25.4240572+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1\n"} +{"Time":"2026-10-09T10:40:25.4271971+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.branch@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4271971+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4271971+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.branch@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4271971+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1"} +{"Time":"2026-10-09T10:40:25.4271971+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1\n"} +{"Time":"2026-10-09T10:40:25.4580586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.delay@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4580586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1 (0.03s)\n"} +{"Time":"2026-10-09T10:40:25.4580586+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.delay@1","Elapsed":0.03} +{"Time":"2026-10-09T10:40:25.4580586+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1"} +{"Time":"2026-10-09T10:40:25.4580586+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1\n"} +{"Time":"2026-10-09T10:40:25.4611802+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.for-each@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4611802+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4611802+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-each@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4611802+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1"} +{"Time":"2026-10-09T10:40:25.4611802+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1\n"} +{"Time":"2026-10-09T10:40:25.4644087+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.for-loop@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4644087+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4644087+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.for-loop@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4644087+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1"} +{"Time":"2026-10-09T10:40:25.4644087+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1\n"} +{"Time":"2026-10-09T10:40:25.4675152+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.gate@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4675152+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4675152+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.gate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4675152+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.select@1"} +{"Time":"2026-10-09T10:40:25.4675152+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.select@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.select@1\n"} +{"Time":"2026-10-09T10:40:25.4680307+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.select@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.select@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4680307+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.select@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4680307+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4680307+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1"} +{"Time":"2026-10-09T10:40:25.4680307+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1\n"} +{"Time":"2026-10-09T10:40:25.4725292+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.sequence@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4725292+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4725292+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.sequence@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4725292+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.while@1"} +{"Time":"2026-10-09T10:40:25.4725292+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.while@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.flow.while@1\n"} +{"Time":"2026-10-09T10:40:25.4756844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.while@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.flow.while@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4756844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.while@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.flow.while@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4756844+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.flow.while@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4756844+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http-request@1"} +{"Time":"2026-10-09T10:40:25.4756844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http-request@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.http-request@1\n"} +{"Time":"2026-10-09T10:40:25.4793431+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http-request@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.http-request@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4793431+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http-request@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.http-request@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4793431+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http-request@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4793431+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http.request@1"} +{"Time":"2026-10-09T10:40:25.4793431+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http.request@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.http.request@1\n"} +{"Time":"2026-10-09T10:40:25.4831415+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http.request@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.http.request@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.4831415+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http.request@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.http.request@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4831415+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.http.request@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4831415+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.input@1"} +{"Time":"2026-10-09T10:40:25.4831415+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.input@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.input@1\n"} +{"Time":"2026-10-09T10:40:25.4836641+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.input@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.input@1 kind=leaf-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.4836641+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.input@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.input@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4836641+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.input@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4836641+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.literal@1"} +{"Time":"2026-10-09T10:40:25.4836641+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.literal@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.literal@1\n"} +{"Time":"2026-10-09T10:40:25.4841998+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.literal@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.literal@1 kind=leaf-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.4841998+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.literal@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.literal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4841998+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.literal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4841998+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.and@1"} +{"Time":"2026-10-09T10:40:25.4841998+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.and@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.logic.and@1\n"} +{"Time":"2026-10-09T10:40:25.4852985+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.and@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.logic.and@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4852985+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.and@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.logic.and@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4852985+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.and@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4852985+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.not@1"} +{"Time":"2026-10-09T10:40:25.4852985+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.not@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.logic.not@1\n"} +{"Time":"2026-10-09T10:40:25.486368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.not@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.logic.not@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.486368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.not@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.logic.not@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.486368+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.not@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.486368+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.or@1"} +{"Time":"2026-10-09T10:40:25.486368+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.or@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.logic.or@1\n"} +{"Time":"2026-10-09T10:40:25.487442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.or@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.logic.or@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.487442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.or@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.logic.or@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.487442+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.or@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.487442+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1"} +{"Time":"2026-10-09T10:40:25.487442+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1\n"} +{"Time":"2026-10-09T10:40:25.4880183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.logic.xor@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4880183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4880183+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.logic.xor@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4880183+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.abs@1"} +{"Time":"2026-10-09T10:40:25.4880183+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.abs@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.abs@1\n"} +{"Time":"2026-10-09T10:40:25.4891416+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.abs@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.abs@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4891416+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.abs@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.abs@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4891416+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.abs@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4891416+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.add@1"} +{"Time":"2026-10-09T10:40:25.4891416+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.add@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.add@1\n"} +{"Time":"2026-10-09T10:40:25.4896726+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.add@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.add@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4896726+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.add@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.add@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4896726+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.add@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4896726+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1"} +{"Time":"2026-10-09T10:40:25.4896726+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1\n"} +{"Time":"2026-10-09T10:40:25.4902087+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.ceil@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4902087+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4902087+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.ceil@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4902087+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1"} +{"Time":"2026-10-09T10:40:25.4902087+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1\n"} +{"Time":"2026-10-09T10:40:25.4907467+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.clamp@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4907467+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4912829+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.clamp@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4912829+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.div@1"} +{"Time":"2026-10-09T10:40:25.4912829+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.div@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.div@1\n"} +{"Time":"2026-10-09T10:40:25.4918165+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.div@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.div@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4918165+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.div@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.div@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4918165+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.div@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4918165+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.floor@1"} +{"Time":"2026-10-09T10:40:25.4918165+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.floor@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.floor@1\n"} +{"Time":"2026-10-09T10:40:25.4923548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.floor@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.floor@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4923548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.floor@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.floor@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4923548+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.floor@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4923548+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1"} +{"Time":"2026-10-09T10:40:25.4923548+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1\n"} +{"Time":"2026-10-09T10:40:25.4928886+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.lerp@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4928886+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4928886+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.lerp@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4928886+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.max@1"} +{"Time":"2026-10-09T10:40:25.4928886+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.max@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.max@1\n"} +{"Time":"2026-10-09T10:40:25.4939376+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.max@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.max@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4939376+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.max@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.max@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4939376+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.max@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4939376+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.min@1"} +{"Time":"2026-10-09T10:40:25.4939376+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.min@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.min@1\n"} +{"Time":"2026-10-09T10:40:25.4944637+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.min@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.min@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4944637+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.min@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.min@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4944637+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.min@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4944637+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mod@1"} +{"Time":"2026-10-09T10:40:25.4944637+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mod@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.mod@1\n"} +{"Time":"2026-10-09T10:40:25.496056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mod@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.mod@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.496056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mod@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.mod@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.496056+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mod@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.496056+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mul@1"} +{"Time":"2026-10-09T10:40:25.496056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mul@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.mul@1\n"} +{"Time":"2026-10-09T10:40:25.4965717+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mul@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.mul@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4965717+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mul@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.mul@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4965717+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.mul@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4965717+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.round@1"} +{"Time":"2026-10-09T10:40:25.4965717+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.round@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.round@1\n"} +{"Time":"2026-10-09T10:40:25.4971896+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.round@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.round@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.497723+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.round@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.round@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.497723+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.round@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.497723+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.sub@1"} +{"Time":"2026-10-09T10:40:25.497723+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.sub@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.math.sub@1\n"} +{"Time":"2026-10-09T10:40:25.4982512+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.sub@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.math.sub@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.4982512+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.sub@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.math.sub@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.4982512+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.math.sub@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.4982512+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1"} +{"Time":"2026-10-09T10:40:25.4982512+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1\n"} +{"Time":"2026-10-09T10:40:25.5047808+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.operator.await-value@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.5047808+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.5047808+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.await-value@1","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.5047808+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1"} +{"Time":"2026-10-09T10:40:25.5047808+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1\n"} +{"Time":"2026-10-09T10:40:25.5073901+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1","Output":"2026/10/09 10:40:25 INFO blue runtime operator call completed slot=on-air call_id=trigger status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:40:25.5079062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.operator.on-call@1 kind=entry PASS\n"} +{"Time":"2026-10-09T10:40:25.5079062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5079062+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.operator.on-call@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5079062+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.output@1"} +{"Time":"2026-10-09T10:40:25.5079062+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.output@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.output@1\n"} +{"Time":"2026-10-09T10:40:25.5084321+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.output@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.output@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5084321+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.output@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.output@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5084321+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.output@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5084321+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1"} +{"Time":"2026-10-09T10:40:25.5084321+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1\n"} +{"Time":"2026-10-09T10:40:25.5115723+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.overlay-app.set@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.5115723+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5115723+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.overlay-app.set@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5115723+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.print@1"} +{"Time":"2026-10-09T10:40:25.5115723+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.print@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.print@1\n"} +{"Time":"2026-10-09T10:40:25.5153883+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.print@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.print@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.5153883+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.print@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.print@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5153883+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.print@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5153883+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1"} +{"Time":"2026-10-09T10:40:25.5153883+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.service.call@1\n"} +{"Time":"2026-10-09T10:40:25.5205157+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1/typed-error-and-error-routing"} +{"Time":"2026-10-09T10:40:25.5205157+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1/typed-error-and-error-routing","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.service.call@1/typed-error-and-error-routing\n"} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1/typed-error-and-error-routing","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.service.call@1/typed-error-and-error-routing (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1/typed-error-and-error-routing","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.service.call@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.service.call@1 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.service.call@1","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.show.emit@1"} +{"Time":"2026-10-09T10:40:25.5248893+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.show.emit@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.show.emit@1\n"} +{"Time":"2026-10-09T10:40:25.528053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.show.emit@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.show.emit@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.528053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.show.emit@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.show.emit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.528053+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.show.emit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.528053+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.source.read@1"} +{"Time":"2026-10-09T10:40:25.528053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.source.read@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.source.read@1\n"} +{"Time":"2026-10-09T10:40:25.5285769+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.source.read@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.source.read@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5285769+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.source.read@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.source.read@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5285769+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.source.read@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5291127+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.concat@1"} +{"Time":"2026-10-09T10:40:25.5291127+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.concat@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.string.concat@1\n"} +{"Time":"2026-10-09T10:40:25.5301736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.concat@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.string.concat@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5301736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.concat@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.string.concat@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5301736+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.concat@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5301736+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.format@1"} +{"Time":"2026-10-09T10:40:25.5301736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.format@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.string.format@1\n"} +{"Time":"2026-10-09T10:40:25.5307124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.format@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.string.format@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5307124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.format@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.string.format@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5307124+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.format@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5307124+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.length@1"} +{"Time":"2026-10-09T10:40:25.5307124+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.length@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.string.length@1\n"} +{"Time":"2026-10-09T10:40:25.5312962+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.length@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.string.length@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5312962+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.length@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.string.length@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5312962+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.length@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5312962+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.lower@1"} +{"Time":"2026-10-09T10:40:25.5312962+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.lower@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.string.lower@1\n"} +{"Time":"2026-10-09T10:40:25.5323733+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.lower@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.string.lower@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5323733+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.lower@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.string.lower@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5323733+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.lower@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5323733+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.split@1"} +{"Time":"2026-10-09T10:40:25.5323733+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.split@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.string.split@1\n"} +{"Time":"2026-10-09T10:40:25.5329037+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.split@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.string.split@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5329037+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.split@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.string.split@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5329037+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.split@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5329037+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.upper@1"} +{"Time":"2026-10-09T10:40:25.5329037+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.upper@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.string.upper@1\n"} +{"Time":"2026-10-09T10:40:25.5334268+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.upper@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.string.upper@1 kind=compute PASS\n"} +{"Time":"2026-10-09T10:40:25.5334268+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.upper@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.string.upper@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5334268+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.string.upper@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5334268+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.get@1"} +{"Time":"2026-10-09T10:40:25.5334268+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.get@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.variable.get@1\n"} +{"Time":"2026-10-09T10:40:25.5339503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.get@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.variable.get@1 kind=leaf-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5339503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.get@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.variable.get@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5339503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.get@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5339503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.set@1"} +{"Time":"2026-10-09T10:40:25.5339503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.set@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/core.variable.set@1\n"} +{"Time":"2026-10-09T10:40:25.5371085+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.set@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=core.variable.set@1 kind=exec-op PASS\n"} +{"Time":"2026-10-09T10:40:25.5371085+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.set@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/core.variable.set@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5371085+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/core.variable.set@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5371085+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1"} +{"Time":"2026-10-09T10:40:25.5371085+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1\n"} +{"Time":"2026-10-09T10:40:25.5408082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.channel_point_redemption@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5408082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5408082+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.channel_point_redemption@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5408082+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1"} +{"Time":"2026-10-09T10:40:25.5408082+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1\n"} +{"Time":"2026-10-09T10:40:25.5439651+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.chat@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5439651+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5439651+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.chat@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5439651+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1"} +{"Time":"2026-10-09T10:40:25.5439651+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1\n"} +{"Time":"2026-10-09T10:40:25.5466345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.cheer@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5466345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5466345+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.cheer@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5466345+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1"} +{"Time":"2026-10-09T10:40:25.5466345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1\n"} +{"Time":"2026-10-09T10:40:25.549635+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.follow@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.549635+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.549635+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.follow@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.549635+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1"} +{"Time":"2026-10-09T10:40:25.549635+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1\n"} +{"Time":"2026-10-09T10:40:25.5522713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.poll_begin@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5522713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5522713+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_begin@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5522713+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1"} +{"Time":"2026-10-09T10:40:25.5522713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1\n"} +{"Time":"2026-10-09T10:40:25.5550542+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.poll_end@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5550542+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5550542+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.poll_end@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5550542+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1"} +{"Time":"2026-10-09T10:40:25.5550542+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1\n"} +{"Time":"2026-10-09T10:40:25.5586798+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.prediction_begin@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5586798+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5586798+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_begin@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5586798+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1"} +{"Time":"2026-10-09T10:40:25.5586798+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1\n"} +{"Time":"2026-10-09T10:40:25.5618059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.prediction_end@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5618059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5618059+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_end@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5618059+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1"} +{"Time":"2026-10-09T10:40:25.5618059+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1\n"} +{"Time":"2026-10-09T10:40:25.5650256+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.prediction_lock@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5650256+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5650256+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.prediction_lock@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5650256+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1"} +{"Time":"2026-10-09T10:40:25.5650256+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1\n"} +{"Time":"2026-10-09T10:40:25.568221+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.raid@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.568221+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.568221+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.raid@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.568221+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1"} +{"Time":"2026-10-09T10:40:25.568221+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1\n"} +{"Time":"2026-10-09T10:40:25.5716855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.stream_offline@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5716855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5716855+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_offline@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5716855+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1"} +{"Time":"2026-10-09T10:40:25.5716855+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1\n"} +{"Time":"2026-10-09T10:40:25.5742666+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.stream_online@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5747844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5747844+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.stream_online@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5747844+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1"} +{"Time":"2026-10-09T10:40:25.5747844+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1\n"} +{"Time":"2026-10-09T10:40:25.577475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.subscription@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.577475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.577475+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.577475+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1"} +{"Time":"2026-10-09T10:40:25.577475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1","Output":"=== RUN TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1\n"} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1","Output":" engine_ab_parity_87_test.go:59: ENGINE_AB_PARITY primitive=quasar.twitch.subscription_gift@1 kind=platform-bound PASS\n"} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior/quasar.twitch.subscription_gift@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior","Output":"--- PASS: TestEngineABParity_All87DedicatedBehavior (0.25s)\n"} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_All87DedicatedBehavior","Elapsed":0.25} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix"} +{"Time":"2026-10-09T10:40:25.5805945+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix","Output":"=== RUN TestEngineABParity_ComputeMatrix\n"} +{"Time":"2026-10-09T10:40:25.581118+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-boolean@1"} +{"Time":"2026-10-09T10:40:25.581118+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-boolean@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.cast.to-boolean@1\n"} +{"Time":"2026-10-09T10:40:25.582186+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-boolean@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.cast.to-boolean@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5827392+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-boolean@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5827392+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-float@1"} +{"Time":"2026-10-09T10:40:25.5827392+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-float@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.cast.to-float@1\n"} +{"Time":"2026-10-09T10:40:25.5832585+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-float@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.cast.to-float@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5832585+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-float@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5832585+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-integer@1"} +{"Time":"2026-10-09T10:40:25.5832585+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-integer@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.cast.to-integer@1\n"} +{"Time":"2026-10-09T10:40:25.5843161+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-integer@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.cast.to-integer@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5843161+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-integer@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5843161+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-string@1"} +{"Time":"2026-10-09T10:40:25.5843161+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-string@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.cast.to-string@1\n"} +{"Time":"2026-10-09T10:40:25.5848497+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-string@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.cast.to-string@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5848497+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.cast.to-string@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5848497+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.equal@1"} +{"Time":"2026-10-09T10:40:25.5848497+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.equal@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.compare.equal@1\n"} +{"Time":"2026-10-09T10:40:25.5853798+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.equal@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.compare.equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5853798+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5853798+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-equal@1"} +{"Time":"2026-10-09T10:40:25.5853798+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-equal@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.compare.greater-equal@1\n"} +{"Time":"2026-10-09T10:40:25.585908+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-equal@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.compare.greater-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.585908+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.585908+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-than@1"} +{"Time":"2026-10-09T10:40:25.585908+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-than@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.compare.greater-than@1\n"} +{"Time":"2026-10-09T10:40:25.5869703+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-than@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.compare.greater-than@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5869703+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.greater-than@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5869703+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-equal@1"} +{"Time":"2026-10-09T10:40:25.5869703+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-equal@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.compare.less-equal@1\n"} +{"Time":"2026-10-09T10:40:25.5875051+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-equal@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.compare.less-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5875051+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5875051+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-than@1"} +{"Time":"2026-10-09T10:40:25.5875051+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-than@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.compare.less-than@1\n"} +{"Time":"2026-10-09T10:40:25.5880348+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-than@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.compare.less-than@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5880348+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.less-than@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5880348+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.not-equal@1"} +{"Time":"2026-10-09T10:40:25.5880348+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.not-equal@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.compare.not-equal@1\n"} +{"Time":"2026-10-09T10:40:25.588562+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.not-equal@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.compare.not-equal@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.588562+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.compare.not-equal@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.588562+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.aggregate@1"} +{"Time":"2026-10-09T10:40:25.588562+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.aggregate@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.data.aggregate@1\n"} +{"Time":"2026-10-09T10:40:25.5896127+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.aggregate@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.data.aggregate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5896127+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.aggregate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5896127+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.get-field@1"} +{"Time":"2026-10-09T10:40:25.5896127+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.get-field@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.data.get-field@1\n"} +{"Time":"2026-10-09T10:40:25.5901405+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.get-field@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.data.get-field@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5901405+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.get-field@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5901405+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-append@1"} +{"Time":"2026-10-09T10:40:25.5901405+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-append@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.data.list-append@1\n"} +{"Time":"2026-10-09T10:40:25.5911966+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-append@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.data.list-append@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5911966+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-append@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5911966+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-at@1"} +{"Time":"2026-10-09T10:40:25.5911966+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-at@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.data.list-at@1\n"} +{"Time":"2026-10-09T10:40:25.5917237+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-at@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.data.list-at@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5923076+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-at@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5923076+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-length@1"} +{"Time":"2026-10-09T10:40:25.5923076+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-length@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.data.list-length@1\n"} +{"Time":"2026-10-09T10:40:25.5928483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-length@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.data.list-length@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5928483+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.list-length@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5928483+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.set-field@1"} +{"Time":"2026-10-09T10:40:25.5928483+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.set-field@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.data.set-field@1\n"} +{"Time":"2026-10-09T10:40:25.5938961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.set-field@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.data.set-field@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5938961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.data.set-field@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5938961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.from@1"} +{"Time":"2026-10-09T10:40:25.5938961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.from@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.db.from@1\n"} +{"Time":"2026-10-09T10:40:25.5944276+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.from@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.db.from@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5944276+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.from@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5944276+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.join@1"} +{"Time":"2026-10-09T10:40:25.5944276+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.join@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.db.join@1\n"} +{"Time":"2026-10-09T10:40:25.5949632+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.join@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.db.join@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5949632+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.join@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5949632+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.limit@1"} +{"Time":"2026-10-09T10:40:25.5949632+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.limit@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.db.limit@1\n"} +{"Time":"2026-10-09T10:40:25.5954959+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.limit@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.db.limit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5954959+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.limit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5954959+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.order@1"} +{"Time":"2026-10-09T10:40:25.5954959+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.order@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.db.order@1\n"} +{"Time":"2026-10-09T10:40:25.5966453+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.order@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.db.order@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5966453+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.order@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5966453+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.select@1"} +{"Time":"2026-10-09T10:40:25.5966453+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.select@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.db.select@1\n"} +{"Time":"2026-10-09T10:40:25.5972218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.select@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.db.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5972218+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5972218+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.where@1"} +{"Time":"2026-10-09T10:40:25.5972218+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.where@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.db.where@1\n"} +{"Time":"2026-10-09T10:40:25.5977541+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.where@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.db.where@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5982973+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.db.where@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5982973+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.flow.select@1"} +{"Time":"2026-10-09T10:40:25.5982973+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.flow.select@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.flow.select@1\n"} +{"Time":"2026-10-09T10:40:25.5988826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.flow.select@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.flow.select@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.5988826+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.flow.select@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.5988826+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.and@1"} +{"Time":"2026-10-09T10:40:25.5988826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.and@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.logic.and@1\n"} +{"Time":"2026-10-09T10:40:25.6005121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.and@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.logic.and@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6005121+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.and@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6005121+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.not@1"} +{"Time":"2026-10-09T10:40:25.6005121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.not@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.logic.not@1\n"} +{"Time":"2026-10-09T10:40:25.6010341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.not@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.logic.not@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6010341+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.not@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6010341+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.or@1"} +{"Time":"2026-10-09T10:40:25.6010341+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.or@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.logic.or@1\n"} +{"Time":"2026-10-09T10:40:25.6015559+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.or@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.logic.or@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6015559+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.or@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6015559+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.xor@1"} +{"Time":"2026-10-09T10:40:25.6015559+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.xor@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.logic.xor@1\n"} +{"Time":"2026-10-09T10:40:25.6020697+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.xor@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.logic.xor@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6020697+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.logic.xor@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6020697+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.abs@1"} +{"Time":"2026-10-09T10:40:25.602594+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.abs@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.abs@1\n"} +{"Time":"2026-10-09T10:40:25.6031139+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.abs@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.abs@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6031139+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.abs@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6031139+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.add@1"} +{"Time":"2026-10-09T10:40:25.6031139+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.add@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.add@1\n"} +{"Time":"2026-10-09T10:40:25.6036299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.add@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.add@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6036299+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.add@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6036299+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.ceil@1"} +{"Time":"2026-10-09T10:40:25.6036299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.ceil@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.ceil@1\n"} +{"Time":"2026-10-09T10:40:25.6046753+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.ceil@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.ceil@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6046753+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.ceil@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6046753+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.clamp@1"} +{"Time":"2026-10-09T10:40:25.6046753+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.clamp@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.clamp@1\n"} +{"Time":"2026-10-09T10:40:25.6052022+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.clamp@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.clamp@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6052022+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.clamp@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6052022+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.div@1"} +{"Time":"2026-10-09T10:40:25.6052022+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.div@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.div@1\n"} +{"Time":"2026-10-09T10:40:25.6057362+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.div@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.div@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6057362+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.div@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6057362+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.floor@1"} +{"Time":"2026-10-09T10:40:25.6057362+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.floor@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.floor@1\n"} +{"Time":"2026-10-09T10:40:25.6067875+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.floor@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.floor@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6067875+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.floor@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6067875+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.lerp@1"} +{"Time":"2026-10-09T10:40:25.6067875+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.lerp@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.lerp@1\n"} +{"Time":"2026-10-09T10:40:25.6079099+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.lerp@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.lerp@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6079099+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.lerp@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6079099+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.max@1"} +{"Time":"2026-10-09T10:40:25.6079099+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.max@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.max@1\n"} +{"Time":"2026-10-09T10:40:25.6089781+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.max@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.max@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6089781+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.max@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6089781+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.min@1"} +{"Time":"2026-10-09T10:40:25.6089781+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.min@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.min@1\n"} +{"Time":"2026-10-09T10:40:25.6100296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.min@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.min@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6100296+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.min@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6100296+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mod@1"} +{"Time":"2026-10-09T10:40:25.6100296+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mod@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.mod@1\n"} +{"Time":"2026-10-09T10:40:25.6105402+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mod@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.mod@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6105402+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mod@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6105402+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mul@1"} +{"Time":"2026-10-09T10:40:25.6105402+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mul@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.mul@1\n"} +{"Time":"2026-10-09T10:40:25.6115793+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mul@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.mul@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6115793+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.mul@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6115793+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.round@1"} +{"Time":"2026-10-09T10:40:25.6115793+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.round@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.round@1\n"} +{"Time":"2026-10-09T10:40:25.6120884+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.round@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.round@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6120884+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.round@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6120884+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.sub@1"} +{"Time":"2026-10-09T10:40:25.6120884+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.sub@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.math.sub@1\n"} +{"Time":"2026-10-09T10:40:25.6126145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.sub@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.math.sub@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6126145+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.math.sub@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6126145+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.output@1"} +{"Time":"2026-10-09T10:40:25.6126145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.output@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.output@1\n"} +{"Time":"2026-10-09T10:40:25.6137114+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.output@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.output@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6137114+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.output@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6137114+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.source.read@1"} +{"Time":"2026-10-09T10:40:25.6137114+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.source.read@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.source.read@1\n"} +{"Time":"2026-10-09T10:40:25.6147673+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.source.read@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.source.read@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6147673+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.source.read@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6152964+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.concat@1"} +{"Time":"2026-10-09T10:40:25.6152964+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.concat@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.string.concat@1\n"} +{"Time":"2026-10-09T10:40:25.6158345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.concat@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.string.concat@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6158345+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.concat@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6158345+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.format@1"} +{"Time":"2026-10-09T10:40:25.6158345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.format@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.string.format@1\n"} +{"Time":"2026-10-09T10:40:25.6164494+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.format@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.string.format@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6164494+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.format@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6164494+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.length@1"} +{"Time":"2026-10-09T10:40:25.6164494+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.length@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.string.length@1\n"} +{"Time":"2026-10-09T10:40:25.617002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.length@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.string.length@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.617002+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.length@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.617002+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.lower@1"} +{"Time":"2026-10-09T10:40:25.617002+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.lower@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.string.lower@1\n"} +{"Time":"2026-10-09T10:40:25.6175239+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.lower@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.string.lower@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6175239+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.lower@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6175239+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.split@1"} +{"Time":"2026-10-09T10:40:25.6175239+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.split@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.string.split@1\n"} +{"Time":"2026-10-09T10:40:25.6185633+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.split@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.string.split@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6185633+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.split@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6185633+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.upper@1"} +{"Time":"2026-10-09T10:40:25.6185633+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.upper@1","Output":"=== RUN TestEngineABParity_ComputeMatrix/core.string.upper@1\n"} +{"Time":"2026-10-09T10:40:25.6212055+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.upper@1","Output":"--- PASS: TestEngineABParity_ComputeMatrix/core.string.upper@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6212055+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix/core.string.upper@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6212055+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix","Output":"--- PASS: TestEngineABParity_ComputeMatrix (0.04s)\n"} +{"Time":"2026-10-09T10:40:25.6212055+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ComputeMatrix","Elapsed":0.04} +{"Time":"2026-10-09T10:40:25.6212055+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventFIFOOrderingThroughHost"} +{"Time":"2026-10-09T10:40:25.6212055+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventFIFOOrderingThroughHost","Output":"=== RUN TestEngineABParity_EventFIFOOrderingThroughHost\n"} +{"Time":"2026-10-09T10:40:25.6243834+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventFIFOOrderingThroughHost","Output":"--- PASS: TestEngineABParity_EventFIFOOrderingThroughHost (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6243834+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventFIFOOrderingThroughHost","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6243834+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventDuplicateUsesCanonicalIngress"} +{"Time":"2026-10-09T10:40:25.6243834+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventDuplicateUsesCanonicalIngress","Output":"=== RUN TestEngineABParity_EventDuplicateUsesCanonicalIngress\n"} +{"Time":"2026-10-09T10:40:25.6275155+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventDuplicateUsesCanonicalIngress","Output":"--- PASS: TestEngineABParity_EventDuplicateUsesCanonicalIngress (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6275155+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventDuplicateUsesCanonicalIngress","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6275155+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress"} +{"Time":"2026-10-09T10:40:25.6275155+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress","Output":"=== RUN TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress\n"} +{"Time":"2026-10-09T10:40:25.6275155+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/gap-recovery-1-3-2"} +{"Time":"2026-10-09T10:40:25.6275155+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/gap-recovery-1-3-2","Output":"=== RUN TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/gap-recovery-1-3-2\n"} +{"Time":"2026-10-09T10:40:25.6351782+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/gap-recovery-1-3-2","Output":"--- PASS: TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/gap-recovery-1-3-2 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.6351782+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/gap-recovery-1-3-2","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.6351782+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/same-sequence-conflict"} +{"Time":"2026-10-09T10:40:25.6351782+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/same-sequence-conflict","Output":"=== RUN TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/same-sequence-conflict\n"} +{"Time":"2026-10-09T10:40:25.6378019+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/same-sequence-conflict","Output":"--- PASS: TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/same-sequence-conflict (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6378019+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/same-sequence-conflict","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6378019+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/out-of-order-before-first"} +{"Time":"2026-10-09T10:40:25.6378019+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/out-of-order-before-first","Output":"=== RUN TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/out-of-order-before-first\n"} +{"Time":"2026-10-09T10:40:25.6409799+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/out-of-order-before-first","Output":"--- PASS: TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/out-of-order-before-first (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6409799+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress/out-of-order-before-first","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6409799+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress","Output":"--- PASS: TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.6409799+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventGapAndOutOfOrderUseCanonicalIngress","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.6409799+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventPerOriginSequenceAndCanonicalLeaf"} +{"Time":"2026-10-09T10:40:25.6409799+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventPerOriginSequenceAndCanonicalLeaf","Output":"=== RUN TestEngineABParity_EventPerOriginSequenceAndCanonicalLeaf\n"} +{"Time":"2026-10-09T10:40:25.6435716+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventPerOriginSequenceAndCanonicalLeaf","Output":"--- PASS: TestEngineABParity_EventPerOriginSequenceAndCanonicalLeaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6435716+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventPerOriginSequenceAndCanonicalLeaf","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6435716+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ActiveOnlyPlatformEventUsesHostSlots"} +{"Time":"2026-10-09T10:40:25.6435716+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ActiveOnlyPlatformEventUsesHostSlots","Output":"=== RUN TestEngineABParity_ActiveOnlyPlatformEventUsesHostSlots\n"} +{"Time":"2026-10-09T10:40:25.6727154+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ActiveOnlyPlatformEventUsesHostSlots","Output":"--- PASS: TestEngineABParity_ActiveOnlyPlatformEventUsesHostSlots (0.03s)\n"} +{"Time":"2026-10-09T10:40:25.6727154+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_ActiveOnlyPlatformEventUsesHostSlots","Elapsed":0.03} +{"Time":"2026-10-09T10:40:25.6727154+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_PlatformIngressUsesCanonicalActiveAdapter"} +{"Time":"2026-10-09T10:40:25.6727154+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_PlatformIngressUsesCanonicalActiveAdapter","Output":"=== RUN TestEngineABParity_PlatformIngressUsesCanonicalActiveAdapter\n"} +{"Time":"2026-10-09T10:40:25.6758187+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_PlatformIngressUsesCanonicalActiveAdapter","Output":"--- PASS: TestEngineABParity_PlatformIngressUsesCanonicalActiveAdapter (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6758187+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_PlatformIngressUsesCanonicalActiveAdapter","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6758187+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBQueryObservableAndPreviewNoQuery"} +{"Time":"2026-10-09T10:40:25.6758187+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBQueryObservableAndPreviewNoQuery","Output":"=== RUN TestEngineABParity_DBQueryObservableAndPreviewNoQuery\n"} +{"Time":"2026-10-09T10:40:25.6820192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBQueryObservableAndPreviewNoQuery","Output":"--- PASS: TestEngineABParity_DBQueryObservableAndPreviewNoQuery (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.6820192+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBQueryObservableAndPreviewNoQuery","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.6820192+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix"} +{"Time":"2026-10-09T10:40:25.6820192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix","Output":"=== RUN TestEngineABParity_HostEntrypointMatrix\n"} +{"Time":"2026-10-09T10:40:25.6820192+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-tick"} +{"Time":"2026-10-09T10:40:25.6820192+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-tick","Output":"=== RUN TestEngineABParity_HostEntrypointMatrix/on-tick\n"} +{"Time":"2026-10-09T10:40:25.6852267+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-tick","Output":"--- PASS: TestEngineABParity_HostEntrypointMatrix/on-tick (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6852267+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-tick","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6852267+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-platform-event"} +{"Time":"2026-10-09T10:40:25.6852267+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-platform-event","Output":"=== RUN TestEngineABParity_HostEntrypointMatrix/on-platform-event\n"} +{"Time":"2026-10-09T10:40:25.6884136+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-platform-event","Output":"--- PASS: TestEngineABParity_HostEntrypointMatrix/on-platform-event (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6884136+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-platform-event","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6884136+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-call"} +{"Time":"2026-10-09T10:40:25.6884136+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-call","Output":"=== RUN TestEngineABParity_HostEntrypointMatrix/on-call\n"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-call","Output":"2026/10/09 10:40:25 INFO blue runtime operator call completed slot=on-air call_id=trigger status=idle output_count=1 runtime_wait_ms=0 runtime_ms=0\n"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-call","Output":"--- PASS: TestEngineABParity_HostEntrypointMatrix/on-call (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix/on-call","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix","Output":"--- PASS: TestEngineABParity_HostEntrypointMatrix (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HostEntrypointMatrix","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory","Output":"=== RUN TestEngineABParity_OperationInventory\n"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http.request@1"} +{"Time":"2026-10-09T10:40:25.6915486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http.request@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.http.request@1\n"} +{"Time":"2026-10-09T10:40:25.6956849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http.request@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.http.request@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.6956849+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http.request@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.6956849+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.db.query@1"} +{"Time":"2026-10-09T10:40:25.6956849+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.db.query@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.db.query@1\n"} +{"Time":"2026-10-09T10:40:25.7029128+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.db.query@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.db.query@1 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.7029128+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.db.query@1","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.7029128+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1"} +{"Time":"2026-10-09T10:40:25.7029128+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.service.call@1\n"} +{"Time":"2026-10-09T10:40:25.7060796+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1/typed-error-and-error-routing"} +{"Time":"2026-10-09T10:40:25.7060796+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1/typed-error-and-error-routing","Output":"=== RUN TestEngineABParity_OperationInventory/core.service.call@1/typed-error-and-error-routing\n"} +{"Time":"2026-10-09T10:40:25.7092067+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1/typed-error-and-error-routing","Output":"--- PASS: TestEngineABParity_OperationInventory/core.service.call@1/typed-error-and-error-routing (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7092067+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1/typed-error-and-error-routing","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7097278+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.service.call@1 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.7097278+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.service.call@1","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.7097278+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.show.emit@1"} +{"Time":"2026-10-09T10:40:25.7097278+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.show.emit@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.show.emit@1\n"} +{"Time":"2026-10-09T10:40:25.7129179+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.show.emit@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.show.emit@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7129179+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.show.emit@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7129179+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.overlay-app.set@1"} +{"Time":"2026-10-09T10:40:25.7129179+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.overlay-app.set@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.overlay-app.set@1\n"} +{"Time":"2026-10-09T10:40:25.7160899+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.overlay-app.set@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.overlay-app.set@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7160899+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.overlay-app.set@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7160899+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1"} +{"Time":"2026-10-09T10:40:25.7160899+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.animation.play@1\n"} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1","Output":"2026/10/09 10:40:25 ERROR Blue animation delivery failed node=op error=\"EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured\"\n"} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1","Output":"2026/10/09 10:40:25 ERROR Blue animation delivery failed node=op error=\"EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured\"\n"} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1","Output":"2026/10/09 10:40:25 ERROR Blue animation delivery failed node=op error=\"EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured\"\n"} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.animation.play@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.animation.play@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.operator.await-value@1"} +{"Time":"2026-10-09T10:40:25.7192434+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.operator.await-value@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.operator.await-value@1\n"} +{"Time":"2026-10-09T10:40:25.7250228+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.operator.await-value@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.operator.await-value@1 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.7250228+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.operator.await-value@1","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.7250228+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.gate@1"} +{"Time":"2026-10-09T10:40:25.7250228+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.gate@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.flow.gate@1\n"} +{"Time":"2026-10-09T10:40:25.7281345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.gate@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.flow.gate@1 (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7281345+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.gate@1","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7281345+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.delay@1"} +{"Time":"2026-10-09T10:40:25.7281345+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.delay@1","Output":"=== RUN TestEngineABParity_OperationInventory/core.flow.delay@1\n"} +{"Time":"2026-10-09T10:40:25.759375+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.delay@1","Output":"--- PASS: TestEngineABParity_OperationInventory/core.flow.delay@1 (0.03s)\n"} +{"Time":"2026-10-09T10:40:25.759375+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.flow.delay@1","Elapsed":0.03} +{"Time":"2026-10-09T10:40:25.759375+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http-request@1_alias"} +{"Time":"2026-10-09T10:40:25.759375+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http-request@1_alias","Output":"=== RUN TestEngineABParity_OperationInventory/core.http-request@1_alias\n"} +{"Time":"2026-10-09T10:40:25.7615412+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http-request@1_alias","Output":"--- PASS: TestEngineABParity_OperationInventory/core.http-request@1_alias (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7615412+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory/core.http-request@1_alias","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7615412+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory","Output":"--- PASS: TestEngineABParity_OperationInventory (0.07s)\n"} +{"Time":"2026-10-09T10:40:25.7615412+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_OperationInventory","Elapsed":0.07} +{"Time":"2026-10-09T10:40:25.7615412+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPPreviewNoNetworkAndOnAirObservable"} +{"Time":"2026-10-09T10:40:25.7615412+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPPreviewNoNetworkAndOnAirObservable","Output":"=== RUN TestEngineABParity_HTTPPreviewNoNetworkAndOnAirObservable\n"} +{"Time":"2026-10-09T10:40:25.7685475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPPreviewNoNetworkAndOnAirObservable","Output":"--- PASS: TestEngineABParity_HTTPPreviewNoNetworkAndOnAirObservable (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.7685475+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPPreviewNoNetworkAndOnAirObservable","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.7685475+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder"} +{"Time":"2026-10-09T10:40:25.7685475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder","Output":"=== RUN TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder\n"} +{"Time":"2026-10-09T10:40:25.7685475+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/gap-recovery-1-3-2"} +{"Time":"2026-10-09T10:40:25.7685475+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/gap-recovery-1-3-2","Output":"=== RUN TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/gap-recovery-1-3-2\n"} +{"Time":"2026-10-09T10:40:25.7769232+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/gap-recovery-1-3-2","Output":"--- PASS: TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/gap-recovery-1-3-2 (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.7769232+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/gap-recovery-1-3-2","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.7769232+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/exact-duplicate-execution-count"} +{"Time":"2026-10-09T10:40:25.7769232+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/exact-duplicate-execution-count","Output":"=== RUN TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/exact-duplicate-execution-count\n"} +{"Time":"2026-10-09T10:40:25.7796238+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/exact-duplicate-execution-count","Output":"--- PASS: TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/exact-duplicate-execution-count (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7796238+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/exact-duplicate-execution-count","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7796238+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/same-sequence-conflict"} +{"Time":"2026-10-09T10:40:25.7796238+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/same-sequence-conflict","Output":"=== RUN TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/same-sequence-conflict\n"} +{"Time":"2026-10-09T10:40:25.7825507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/same-sequence-conflict","Output":"--- PASS: TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/same-sequence-conflict (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7825507+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/same-sequence-conflict","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7825507+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/out-of-order-before-first"} +{"Time":"2026-10-09T10:40:25.7825507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/out-of-order-before-first","Output":"=== RUN TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/out-of-order-before-first\n"} +{"Time":"2026-10-09T10:40:25.7862245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/out-of-order-before-first","Output":"--- PASS: TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/out-of-order-before-first (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7862245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder/out-of-order-before-first","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7862245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder","Output":"--- PASS: TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder (0.02s)\n"} +{"Time":"2026-10-09T10:40:25.7862245+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_EventSequenceRecoveryDedupAndOutOfOrder","Elapsed":0.02} +{"Time":"2026-10-09T10:40:25.7862245+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestExecuteSameServerSameStatus"} +{"Time":"2026-10-09T10:40:25.7862245+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestExecuteSameServerSameStatus","Output":"=== RUN TestEngineABParity_HTTPRequestExecuteSameServerSameStatus\n"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestExecuteSameServerSameStatus","Output":"--- PASS: TestEngineABParity_HTTPRequestExecuteSameServerSameStatus (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestExecuteSameServerSameStatus","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestPreviewNoNetworkOnEngineB"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestPreviewNoNetworkOnEngineB","Output":"=== RUN TestEngineABParity_HTTPRequestPreviewNoNetworkOnEngineB\n"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestPreviewNoNetworkOnEngineB","Output":"--- PASS: TestEngineABParity_HTTPRequestPreviewNoNetworkOnEngineB (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPRequestPreviewNoNetworkOnEngineB","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias","Output":"=== RUN TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias\n"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-success"} +{"Time":"2026-10-09T10:40:25.7898719+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-success","Output":"=== RUN TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-success\n"} +{"Time":"2026-10-09T10:40:25.7946511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-success","Output":"--- PASS: TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-success (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.7946511+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-success","Elapsed":0} +{"Time":"2026-10-09T10:40:25.7946511+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-http-status-error-is-then"} +{"Time":"2026-10-09T10:40:25.7946511+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-http-status-error-is-then","Output":"=== RUN TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-http-status-error-is-then\n"} +{"Time":"2026-10-09T10:40:25.8000815+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-http-status-error-is-then","Output":"--- PASS: TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-http-status-error-is-then (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.8000815+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-http-status-error-is-then","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.8000815+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-invalid-input-is-error"} +{"Time":"2026-10-09T10:40:25.8000815+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-invalid-input-is-error","Output":"=== RUN TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-invalid-input-is-error\n"} +{"Time":"2026-10-09T10:40:25.8032816+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-invalid-input-is-error","Output":"--- PASS: TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-invalid-input-is-error (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8038492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/canonical-invalid-input-is-error","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8038492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/hyphenated-alias-success"} +{"Time":"2026-10-09T10:40:25.8038492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/hyphenated-alias-success","Output":"=== RUN TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/hyphenated-alias-success\n"} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/hyphenated-alias-success","Output":"--- PASS: TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/hyphenated-alias-success (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias/hyphenated-alias-success","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias","Output":"--- PASS: TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias (0.02s)\n"} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_HTTPTransportComparesSuccessErrorPathQueryBodyAndAlias","Elapsed":0.02} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError"} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError","Output":"=== RUN TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError\n"} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/success"} +{"Time":"2026-10-09T10:40:25.8070444+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/success","Output":"=== RUN TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/success\n"} +{"Time":"2026-10-09T10:40:25.8114088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/success","Output":"--- PASS: TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/success (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8114088+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/success","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8114088+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/unconfigured-error"} +{"Time":"2026-10-09T10:40:25.8114088+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/unconfigured-error","Output":"=== RUN TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/unconfigured-error\n"} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/unconfigured-error","Output":"--- PASS: TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/unconfigured-error (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError/unconfigured-error","Elapsed":0} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError","Output":"--- PASS: TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEngineABParity_DBTransportComparesQueryRowsCountThenAndError","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_EventsLeafInputDrivesReactiveDataflow"} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_EventsLeafInputDrivesReactiveDataflow","Output":"=== RUN TestScene_EventsLeafInputDrivesReactiveDataflow\n"} +{"Time":"2026-10-09T10:40:25.81456+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_EventsLeafInputDrivesReactiveDataflow","Output":"--- PASS: TestScene_EventsLeafInputDrivesReactiveDataflow (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_EventsLeafInputDrivesReactiveDataflow","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptArtefact_FailLoud"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptArtefact_FailLoud","Output":"=== RUN TestActivation_ExecProgramsFromGraph_CorruptArtefact_FailLoud\n"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptArtefact_FailLoud","Output":"--- PASS: TestActivation_ExecProgramsFromGraph_CorruptArtefact_FailLoud (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptArtefact_FailLoud","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_Empty_NilNil"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_Empty_NilNil","Output":"=== RUN TestActivation_ExecProgramsFromGraph_Empty_NilNil\n"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_Empty_NilNil","Output":"--- PASS: TestActivation_ExecProgramsFromGraph_Empty_NilNil (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_Empty_NilNil","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_NilProgs_ExecDormant_NoOnTick"} +{"Time":"2026-10-09T10:40:25.8152253+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_NilProgs_ExecDormant_NoOnTick","Output":"=== RUN TestActivation_LoadExec_NilProgs_ExecDormant_NoOnTick\n"} +{"Time":"2026-10-09T10:40:25.8178494+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_NilProgs_ExecDormant_NoOnTick","Output":"--- PASS: TestActivation_LoadExec_NilProgs_ExecDormant_NoOnTick (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8178494+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_NilProgs_ExecDormant_NoOnTick","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8178494+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_ValidProgs_OnStartFiresOnActivation"} +{"Time":"2026-10-09T10:40:25.8178494+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_ValidProgs_OnStartFiresOnActivation","Output":"=== RUN TestActivation_LoadExec_ValidProgs_OnStartFiresOnActivation\n"} +{"Time":"2026-10-09T10:40:25.8204277+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_ValidProgs_OnStartFiresOnActivation","Output":"--- PASS: TestActivation_LoadExec_ValidProgs_OnStartFiresOnActivation (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8204277+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_ValidProgs_OnStartFiresOnActivation","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8204277+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ThreeScenes_OnlyActiveFiresEffects"} +{"Time":"2026-10-09T10:40:25.8204277+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ThreeScenes_OnlyActiveFiresEffects","Output":"=== RUN TestActivation_ThreeScenes_OnlyActiveFiresEffects\n"} +{"Time":"2026-10-09T10:40:25.8331919+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ThreeScenes_OnlyActiveFiresEffects","Output":"--- PASS: TestActivation_ThreeScenes_OnlyActiveFiresEffects (0.01s)\n"} +{"Time":"2026-10-09T10:40:25.8331919+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ThreeScenes_OnlyActiveFiresEffects","Elapsed":0.01} +{"Time":"2026-10-09T10:40:25.8331919+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetActive_OnAirBeforeOnStartFire"} +{"Time":"2026-10-09T10:40:25.8331919+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetActive_OnAirBeforeOnStartFire","Output":"=== RUN TestActivation_SetActive_OnAirBeforeOnStartFire\n"} +{"Time":"2026-10-09T10:40:25.837846+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetActive_OnAirBeforeOnStartFire","Output":"--- PASS: TestActivation_SetActive_OnAirBeforeOnStartFire (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.837846+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetActive_OnAirBeforeOnStartFire","Elapsed":0} +{"Time":"2026-10-09T10:40:25.837846+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetEffects_NotInstalled_HTTPRequest_NoRealEgress"} +{"Time":"2026-10-09T10:40:25.837846+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetEffects_NotInstalled_HTTPRequest_NoRealEgress","Output":"=== RUN TestActivation_SetEffects_NotInstalled_HTTPRequest_NoRealEgress\n"} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetEffects_NotInstalled_HTTPRequest_NoRealEgress","Output":"--- PASS: TestActivation_SetEffects_NotInstalled_HTTPRequest_NoRealEgress (0.05s)\n"} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_SetEffects_NotInstalled_HTTPRequest_NoRealEgress","Elapsed":0.05} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptAtIndexOne_ErrorIndexed"} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptAtIndexOne_ErrorIndexed","Output":"=== RUN TestActivation_ExecProgramsFromGraph_CorruptAtIndexOne_ErrorIndexed\n"} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptAtIndexOne_ErrorIndexed","Output":"--- PASS: TestActivation_ExecProgramsFromGraph_CorruptAtIndexOne_ErrorIndexed (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_ExecProgramsFromGraph_CorruptAtIndexOne_ErrorIndexed","Elapsed":0} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_OffAirScene_OnStartNotFired"} +{"Time":"2026-10-09T10:40:25.8908843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_OffAirScene_OnStartNotFired","Output":"=== RUN TestActivation_LoadExec_OffAirScene_OnStartNotFired\n"} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_OffAirScene_OnStartNotFired","Output":"--- PASS: TestActivation_LoadExec_OffAirScene_OnStartNotFired (0.03s)\n"} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_LoadExec_OffAirScene_OnStartNotFired","Elapsed":0.03} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_OnAirFlagConcurrentTicks"} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_OnAirFlagConcurrentTicks","Output":"=== RUN TestActivation_Race_OnAirFlagConcurrentTicks\n"} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_OnAirFlagConcurrentTicks","Output":"--- PASS: TestActivation_Race_OnAirFlagConcurrentTicks (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_OnAirFlagConcurrentTicks","Elapsed":0} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_SetActiveConcurrentTicks"} +{"Time":"2026-10-09T10:40:25.9236168+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_SetActiveConcurrentTicks","Output":"=== RUN TestActivation_Race_SetActiveConcurrentTicks\n"} +{"Time":"2026-10-09T10:40:25.9561706+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_SetActiveConcurrentTicks","Output":"--- PASS: TestActivation_Race_SetActiveConcurrentTicks (0.03s)\n"} +{"Time":"2026-10-09T10:40:25.9561706+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestActivation_Race_SetActiveConcurrentTicks","Elapsed":0.03} +{"Time":"2026-10-09T10:40:25.9561706+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_LeafNamespace_IsAnimNotSystem"} +{"Time":"2026-10-09T10:40:25.9561706+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_LeafNamespace_IsAnimNotSystem","Output":"=== RUN TestAnim_LeafNamespace_IsAnimNotSystem\n"} +{"Time":"2026-10-09T10:40:25.9588302+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_LeafNamespace_IsAnimNotSystem","Output":"--- PASS: TestAnim_LeafNamespace_IsAnimNotSystem (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.9588302+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_LeafNamespace_IsAnimNotSystem","Elapsed":0} +{"Time":"2026-10-09T10:40:25.9588302+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_TimerFirst_ThenExternalReport_IsUnknownDrop"} +{"Time":"2026-10-09T10:40:25.9588302+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_TimerFirst_ThenExternalReport_IsUnknownDrop","Output":"=== RUN TestAnim_TimerFirst_ThenExternalReport_IsUnknownDrop\n"} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_TimerFirst_ThenExternalReport_IsUnknownDrop","Output":"--- PASS: TestAnim_TimerFirst_ThenExternalReport_IsUnknownDrop (0.03s)\n"} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_TimerFirst_ThenExternalReport_IsUnknownDrop","Elapsed":0.03} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NullDuration_FiresImmediately"} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NullDuration_FiresImmediately","Output":"=== RUN TestAnim_NullDuration_FiresImmediately\n"} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NullDuration_FiresImmediately","Output":"--- PASS: TestAnim_NullDuration_FiresImmediately (0.00s)\n"} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NullDuration_FiresImmediately","Elapsed":0} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ErrorPortNoWire_HaltsCleanly"} +{"Time":"2026-10-09T10:40:25.9860889+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ErrorPortNoWire_HaltsCleanly","Output":"=== RUN TestAnim_ErrorPortNoWire_HaltsCleanly\n"} +{"Time":"2026-10-09T10:40:26.0416098+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ErrorPortNoWire_HaltsCleanly","Output":"--- PASS: TestAnim_ErrorPortNoWire_HaltsCleanly (0.06s)\n"} +{"Time":"2026-10-09T10:40:26.0416098+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ErrorPortNoWire_HaltsCleanly","Elapsed":0.06} +{"Time":"2026-10-09T10:40:26.0416098+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_EmitsScalarGenerationAndThenImmediate"} +{"Time":"2026-10-09T10:40:26.0416098+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_EmitsScalarGenerationAndThenImmediate","Output":"=== RUN TestAnim_EmitsScalarGenerationAndThenImmediate\n"} +{"Time":"2026-10-09T10:40:26.0441743+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_EmitsScalarGenerationAndThenImmediate","Output":"--- PASS: TestAnim_EmitsScalarGenerationAndThenImmediate (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0441743+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_EmitsScalarGenerationAndThenImmediate","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0441743+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ExternalReportResumesCompleted"} +{"Time":"2026-10-09T10:40:26.0441743+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ExternalReportResumesCompleted","Output":"=== RUN TestAnim_ExternalReportResumesCompleted\n"} +{"Time":"2026-10-09T10:40:26.0491482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ExternalReportResumesCompleted","Output":"--- PASS: TestAnim_ExternalReportResumesCompleted (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0491482+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ExternalReportResumesCompleted","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0491482+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportErrorRoutesErrorPort"} +{"Time":"2026-10-09T10:40:26.0491482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportErrorRoutesErrorPort","Output":"=== RUN TestAnim_ReportErrorRoutesErrorPort\n"} +{"Time":"2026-10-09T10:40:26.0543769+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportErrorRoutesErrorPort","Output":"--- PASS: TestAnim_ReportErrorRoutesErrorPort (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.0543769+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportErrorRoutesErrorPort","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.0543769+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_DurationFallbackFires"} +{"Time":"2026-10-09T10:40:26.0543769+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_DurationFallbackFires","Output":"=== RUN TestAnim_DurationFallbackFires\n"} +{"Time":"2026-10-09T10:40:26.0592074+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_DurationFallbackFires","Output":"--- PASS: TestAnim_DurationFallbackFires (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0592074+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_DurationFallbackFires","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0592074+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportBeforeTimeout_TimerBecomesInertDrop"} +{"Time":"2026-10-09T10:40:26.0592074+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportBeforeTimeout_TimerBecomesInertDrop","Output":"=== RUN TestAnim_ReportBeforeTimeout_TimerBecomesInertDrop\n"} +{"Time":"2026-10-09T10:40:26.0642826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportBeforeTimeout_TimerBecomesInertDrop","Output":"--- PASS: TestAnim_ReportBeforeTimeout_TimerBecomesInertDrop (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.0642826+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_ReportBeforeTimeout_TimerBecomesInertDrop","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.0642826+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration"} +{"Time":"2026-10-09T10:40:26.0642826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration","Output":"=== RUN TestAnim_NonPositiveDuration\n"} +{"Time":"2026-10-09T10:40:26.0642826+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/negative"} +{"Time":"2026-10-09T10:40:26.0642826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/negative","Output":"=== RUN TestAnim_NonPositiveDuration/negative\n"} +{"Time":"2026-10-09T10:40:26.0669099+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/negative","Output":"--- PASS: TestAnim_NonPositiveDuration/negative (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0669099+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/negative","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0669099+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/minus-zero"} +{"Time":"2026-10-09T10:40:26.0669099+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/minus-zero","Output":"=== RUN TestAnim_NonPositiveDuration/minus-zero\n"} +{"Time":"2026-10-09T10:40:26.0695056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/minus-zero","Output":"--- PASS: TestAnim_NonPositiveDuration/minus-zero (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0695056+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration/minus-zero","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0695056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration","Output":"--- PASS: TestAnim_NonPositiveDuration (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.0695056+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_NonPositiveDuration","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.0695056+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_StaleEpochReportDropped"} +{"Time":"2026-10-09T10:40:26.0695056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_StaleEpochReportDropped","Output":"=== RUN TestAnim_StaleEpochReportDropped\n"} +{"Time":"2026-10-09T10:40:26.076623+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_StaleEpochReportDropped","Output":"--- PASS: TestAnim_StaleEpochReportDropped (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.076623+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_StaleEpochReportDropped","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.076623+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_GenerationMonotonic"} +{"Time":"2026-10-09T10:40:26.076623+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_GenerationMonotonic","Output":"=== RUN TestAnim_GenerationMonotonic\n"} +{"Time":"2026-10-09T10:40:26.0792145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_GenerationMonotonic","Output":"--- PASS: TestAnim_GenerationMonotonic (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0792145+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAnim_GenerationMonotonic","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0792145+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_UpsertsThenMirrors"} +{"Time":"2026-10-09T10:40:26.0792145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_UpsertsThenMirrors","Output":"=== RUN TestAssignSlot_UpsertsThenMirrors\n"} +{"Time":"2026-10-09T10:40:26.0814572+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_UpsertsThenMirrors","Output":"--- PASS: TestAssignSlot_UpsertsThenMirrors (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0814572+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_UpsertsThenMirrors","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0814572+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_RejectedUpsertNoMirror"} +{"Time":"2026-10-09T10:40:26.0814572+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_RejectedUpsertNoMirror","Output":"=== RUN TestAssignSlot_RejectedUpsertNoMirror\n"} +{"Time":"2026-10-09T10:40:26.0841679+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_RejectedUpsertNoMirror","Output":"--- PASS: TestAssignSlot_RejectedUpsertNoMirror (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0841679+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_RejectedUpsertNoMirror","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0841679+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_AntiInjectionTemplate"} +{"Time":"2026-10-09T10:40:26.0841679+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_AntiInjectionTemplate","Output":"=== RUN TestAssignSlot_AntiInjectionTemplate\n"} +{"Time":"2026-10-09T10:40:26.0862884+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_AntiInjectionTemplate","Output":"--- PASS: TestAssignSlot_AntiInjectionTemplate (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.0862884+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_AntiInjectionTemplate","Elapsed":0} +{"Time":"2026-10-09T10:40:26.0862884+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_BudgetExceededNoUpsertNoMirror"} +{"Time":"2026-10-09T10:40:26.0862884+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_BudgetExceededNoUpsertNoMirror","Output":"=== RUN TestAssignSlot_BudgetExceededNoUpsertNoMirror\n"} +{"Time":"2026-10-09T10:40:26.1393075+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_BudgetExceededNoUpsertNoMirror","Output":"--- PASS: TestAssignSlot_BudgetExceededNoUpsertNoMirror (0.05s)\n"} +{"Time":"2026-10-09T10:40:26.1393075+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestAssignSlot_BudgetExceededNoUpsertNoMirror","Elapsed":0.05} +{"Time":"2026-10-09T10:40:26.1393075+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForLoop_IteratesBody_LiteralBounds"} +{"Time":"2026-10-09T10:40:26.1393075+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForLoop_IteratesBody_LiteralBounds","Output":"=== RUN TestExec_CountedForLoop_IteratesBody_LiteralBounds\n"} +{"Time":"2026-10-09T10:40:26.1413648+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForLoop_IteratesBody_LiteralBounds","Output":"--- PASS: TestExec_CountedForLoop_IteratesBody_LiteralBounds (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.1413648+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForLoop_IteratesBody_LiteralBounds","Elapsed":0} +{"Time":"2026-10-09T10:40:26.1413648+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForEach_IteratesBody_LiteralItems"} +{"Time":"2026-10-09T10:40:26.1413648+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForEach_IteratesBody_LiteralItems","Output":"=== RUN TestExec_CountedForEach_IteratesBody_LiteralItems\n"} +{"Time":"2026-10-09T10:40:26.1439322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForEach_IteratesBody_LiteralItems","Output":"--- PASS: TestExec_CountedForEach_IteratesBody_LiteralItems (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.1439322+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_CountedForEach_IteratesBody_LiteralItems","Elapsed":0} +{"Time":"2026-10-09T10:40:26.1439322+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_AccumulatesPerSceneVersion"} +{"Time":"2026-10-09T10:40:26.1439322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_AccumulatesPerSceneVersion","Output":"=== RUN TestExecCPU_AccumulatesPerSceneVersion\n"} +{"Time":"2026-10-09T10:40:26.1615834+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_AccumulatesPerSceneVersion","Output":"--- PASS: TestExecCPU_AccumulatesPerSceneVersion (0.02s)\n"} +{"Time":"2026-10-09T10:40:26.1615834+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_AccumulatesPerSceneVersion","Elapsed":0.02} +{"Time":"2026-10-09T10:40:26.1615834+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_ReportsEverySliceExit"} +{"Time":"2026-10-09T10:40:26.1615834+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_ReportsEverySliceExit","Output":"=== RUN TestExecCPU_ReportsEverySliceExit\n"} +{"Time":"2026-10-09T10:40:26.1638205+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_ReportsEverySliceExit","Output":"--- PASS: TestExecCPU_ReportsEverySliceExit (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.1638205+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_ReportsEverySliceExit","Elapsed":0} +{"Time":"2026-10-09T10:40:26.1638205+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_TwoVersionsAccumulateSeparately"} +{"Time":"2026-10-09T10:40:26.1638205+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_TwoVersionsAccumulateSeparately","Output":"=== RUN TestExecCPU_TwoVersionsAccumulateSeparately\n"} +{"Time":"2026-10-09T10:40:26.1837582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_TwoVersionsAccumulateSeparately","Output":"--- PASS: TestExecCPU_TwoVersionsAccumulateSeparately (0.02s)\n"} +{"Time":"2026-10-09T10:40:26.1837582+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_TwoVersionsAccumulateSeparately","Elapsed":0.02} +{"Time":"2026-10-09T10:40:26.1837582+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_SilentWithoutExec"} +{"Time":"2026-10-09T10:40:26.1837582+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_SilentWithoutExec","Output":"=== RUN TestExecCPU_SilentWithoutExec\n"} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_SilentWithoutExec","Output":"--- PASS: TestExecCPU_SilentWithoutExec (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecCPU_SilentWithoutExec","Elapsed":0} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NaNTimeoutFallsBackToDefault"} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NaNTimeoutFallsBackToDefault","Output":"=== RUN TestEffects_NaNTimeoutFallsBackToDefault\n"} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NaNTimeoutFallsBackToDefault","Output":"--- PASS: TestEffects_NaNTimeoutFallsBackToDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NaNTimeoutFallsBackToDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_Race_TwoConcurrentEffectsResumeOwn"} +{"Time":"2026-10-09T10:40:26.1864309+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_Race_TwoConcurrentEffectsResumeOwn","Output":"=== RUN TestEffects_Race_TwoConcurrentEffectsResumeOwn\n"} +{"Time":"2026-10-09T10:40:26.1896079+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_Race_TwoConcurrentEffectsResumeOwn","Output":"--- PASS: TestEffects_Race_TwoConcurrentEffectsResumeOwn (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.1896079+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_Race_TwoConcurrentEffectsResumeOwn","Elapsed":0} +{"Time":"2026-10-09T10:40:26.1896079+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_WrongVersionWakeKey_NoResume"} +{"Time":"2026-10-09T10:40:26.1896079+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_WrongVersionWakeKey_NoResume","Output":"=== RUN TestEffects_WrongVersionWakeKey_NoResume\n"} +{"Time":"2026-10-09T10:40:26.2246077+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_WrongVersionWakeKey_NoResume","Output":"--- PASS: TestEffects_WrongVersionWakeKey_NoResume (0.03s)\n"} +{"Time":"2026-10-09T10:40:26.2246077+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_WrongVersionWakeKey_NoResume","Elapsed":0.03} +{"Time":"2026-10-09T10:40:26.2246077+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQuery_EmptyDataSources_ErrorPort"} +{"Time":"2026-10-09T10:40:26.2246077+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQuery_EmptyDataSources_ErrorPort","Output":"=== RUN TestEffects_DBQuery_EmptyDataSources_ErrorPort\n"} +{"Time":"2026-10-09T10:40:26.2273731+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQuery_EmptyDataSources_ErrorPort","Output":"--- PASS: TestEffects_DBQuery_EmptyDataSources_ErrorPort (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.2273731+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQuery_EmptyDataSources_ErrorPort","Elapsed":0} +{"Time":"2026-10-09T10:40:26.2273731+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NilEgress_DenyAll"} +{"Time":"2026-10-09T10:40:26.2273731+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NilEgress_DenyAll","Output":"=== RUN TestEffects_NilEgress_DenyAll\n"} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NilEgress_DenyAll","Output":"--- PASS: TestEffects_NilEgress_DenyAll (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_NilEgress_DenyAll","Elapsed":0} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_R9_SetEffectsNotCalledFromShow"} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_R9_SetEffectsNotCalledFromShow","Output":"=== RUN TestEffects_R9_SetEffectsNotCalledFromShow\n"} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_R9_SetEffectsNotCalledFromShow","Output":"--- PASS: TestEffects_R9_SetEffectsNotCalledFromShow (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_R9_SetEffectsNotCalledFromShow","Elapsed":0} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_SystemWriteDoesNotResumeParked"} +{"Time":"2026-10-09T10:40:26.2299457+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_SystemWriteDoesNotResumeParked","Output":"=== RUN TestEffects_SystemWriteDoesNotResumeParked\n"} +{"Time":"2026-10-09T10:40:26.2857374+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_SystemWriteDoesNotResumeParked","Output":"--- PASS: TestEffects_SystemWriteDoesNotResumeParked (0.06s)\n"} +{"Time":"2026-10-09T10:40:26.2857374+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_SystemWriteDoesNotResumeParked","Elapsed":0.06} +{"Time":"2026-10-09T10:40:26.2857374+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTPRequestResumesContinuation"} +{"Time":"2026-10-09T10:40:26.2857374+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTPRequestResumesContinuation","Output":"=== RUN TestEffects_HTTPRequestResumesContinuation\n"} +{"Time":"2026-10-09T10:40:26.2884837+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTPRequestResumesContinuation","Output":"--- PASS: TestEffects_HTTPRequestResumesContinuation (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.2884837+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTPRequestResumesContinuation","Elapsed":0} +{"Time":"2026-10-09T10:40:26.2884837+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TwoInFlightResumeTheirOwnContinuations"} +{"Time":"2026-10-09T10:40:26.2884837+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TwoInFlightResumeTheirOwnContinuations","Output":"=== RUN TestEffects_TwoInFlightResumeTheirOwnContinuations\n"} +{"Time":"2026-10-09T10:40:26.2926595+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TwoInFlightResumeTheirOwnContinuations","Output":"--- PASS: TestEffects_TwoInFlightResumeTheirOwnContinuations (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.2926595+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TwoInFlightResumeTheirOwnContinuations","Elapsed":0} +{"Time":"2026-10-09T10:40:26.2926595+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_EgressDeniedToErrorPort"} +{"Time":"2026-10-09T10:40:26.2926595+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_EgressDeniedToErrorPort","Output":"=== RUN TestEffects_EgressDeniedToErrorPort\n"} +{"Time":"2026-10-09T10:40:26.295248+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_EgressDeniedToErrorPort","Output":"--- PASS: TestEffects_EgressDeniedToErrorPort (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.295248+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_EgressDeniedToErrorPort","Elapsed":0} +{"Time":"2026-10-09T10:40:26.295248+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutToErrorPort_NoKill"} +{"Time":"2026-10-09T10:40:26.295248+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutToErrorPort_NoKill","Output":"=== RUN TestEffects_TimeoutToErrorPort_NoKill\n"} +{"Time":"2026-10-09T10:40:26.3480189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutToErrorPort_NoKill","Output":"--- PASS: TestEffects_TimeoutToErrorPort_NoKill (0.05s)\n"} +{"Time":"2026-10-09T10:40:26.3480189+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutToErrorPort_NoKill","Elapsed":0.05} +{"Time":"2026-10-09T10:40:26.3480189+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryTopologyA"} +{"Time":"2026-10-09T10:40:26.3480189+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryTopologyA","Output":"=== RUN TestEffects_DBQueryTopologyA\n"} +{"Time":"2026-10-09T10:40:26.3512833+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryTopologyA","Output":"--- PASS: TestEffects_DBQueryTopologyA (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.3512833+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryTopologyA","Elapsed":0} +{"Time":"2026-10-09T10:40:26.3512833+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryUndeclaredDataSource"} +{"Time":"2026-10-09T10:40:26.3512833+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryUndeclaredDataSource","Output":"=== RUN TestEffects_DBQueryUndeclaredDataSource\n"} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryUndeclaredDataSource","Output":"--- PASS: TestEffects_DBQueryUndeclaredDataSource (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_DBQueryUndeclaredDataSource","Elapsed":0} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidateExecDataSources"} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidateExecDataSources","Output":"=== RUN TestValidateExecDataSources\n"} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidateExecDataSources","Output":"--- PASS: TestValidateExecDataSources (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidateExecDataSources","Elapsed":0} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_PoolRefusalToErrorPort"} +{"Time":"2026-10-09T10:40:26.3540119+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_PoolRefusalToErrorPort","Output":"=== RUN TestEffects_PoolRefusalToErrorPort\n"} +{"Time":"2026-10-09T10:40:26.3566804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_PoolRefusalToErrorPort","Output":"--- PASS: TestEffects_PoolRefusalToErrorPort (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.3566804+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_PoolRefusalToErrorPort","Elapsed":0} +{"Time":"2026-10-09T10:40:26.3566804+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_StaleCompletionDropped"} +{"Time":"2026-10-09T10:40:26.3566804+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_StaleCompletionDropped","Output":"=== RUN TestEffects_StaleCompletionDropped\n"} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_StaleCompletionDropped","Output":"--- PASS: TestEffects_StaleCompletionDropped (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_StaleCompletionDropped","Elapsed":0} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutSeconds_NegZeroFallsBackToDefault"} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutSeconds_NegZeroFallsBackToDefault","Output":"=== RUN TestEffects_TimeoutSeconds_NegZeroFallsBackToDefault\n"} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutSeconds_NegZeroFallsBackToDefault","Output":"--- PASS: TestEffects_TimeoutSeconds_NegZeroFallsBackToDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_TimeoutSeconds_NegZeroFallsBackToDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_CompletionTravelsIntraProcess"} +{"Time":"2026-10-09T10:40:26.3614482+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_CompletionTravelsIntraProcess","Output":"=== RUN TestEffects_CompletionTravelsIntraProcess\n"} +{"Time":"2026-10-09T10:40:26.4143473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_CompletionTravelsIntraProcess","Output":"--- PASS: TestEffects_CompletionTravelsIntraProcess (0.05s)\n"} +{"Time":"2026-10-09T10:40:26.4143473+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_CompletionTravelsIntraProcess","Elapsed":0.05} +{"Time":"2026-10-09T10:40:26.4143473+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_ValidatedSceneArmsEffectsThroughShow"} +{"Time":"2026-10-09T10:40:26.4143473+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_ValidatedSceneArmsEffectsThroughShow","Output":"=== RUN TestWiring_ValidatedSceneArmsEffectsThroughShow\n"} +{"Time":"2026-10-09T10:40:26.4171994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_ValidatedSceneArmsEffectsThroughShow","Output":"--- PASS: TestWiring_ValidatedSceneArmsEffectsThroughShow (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4171994+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_ValidatedSceneArmsEffectsThroughShow","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4171994+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_DataflowSceneRegistersNoWorldOps"} +{"Time":"2026-10-09T10:40:26.4171994+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_DataflowSceneRegistersNoWorldOps","Output":"=== RUN TestWiring_DataflowSceneRegistersNoWorldOps\n"} +{"Time":"2026-10-09T10:40:26.4680526+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_DataflowSceneRegistersNoWorldOps","Output":"--- PASS: TestWiring_DataflowSceneRegistersNoWorldOps (0.05s)\n"} +{"Time":"2026-10-09T10:40:26.4680526+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_DataflowSceneRegistersNoWorldOps","Elapsed":0.05} +{"Time":"2026-10-09T10:40:26.4680526+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_HTTPRequestAntiSSRFThroughShow"} +{"Time":"2026-10-09T10:40:26.4680526+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_HTTPRequestAntiSSRFThroughShow","Output":"=== RUN TestWiring_HTTPRequestAntiSSRFThroughShow\n"} +{"Time":"2026-10-09T10:40:26.4706833+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_HTTPRequestAntiSSRFThroughShow","Output":"--- PASS: TestWiring_HTTPRequestAntiSSRFThroughShow (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4706833+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestWiring_HTTPRequestAntiSSRFThroughShow","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4706833+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_ForwardsQueryAndHeaders"} +{"Time":"2026-10-09T10:40:26.4706833+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_ForwardsQueryAndHeaders","Output":"=== RUN TestEffects_HTTP_ForwardsQueryAndHeaders\n"} +{"Time":"2026-10-09T10:40:26.4728069+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_ForwardsQueryAndHeaders","Output":"--- PASS: TestEffects_HTTP_ForwardsQueryAndHeaders (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4728069+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_ForwardsQueryAndHeaders","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4728069+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_DropsSensitiveAuthoredHeaders"} +{"Time":"2026-10-09T10:40:26.4728069+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_DropsSensitiveAuthoredHeaders","Output":"=== RUN TestEffects_HTTP_DropsSensitiveAuthoredHeaders\n"} +{"Time":"2026-10-09T10:40:26.4754999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_DropsSensitiveAuthoredHeaders","Output":"--- PASS: TestEffects_HTTP_DropsSensitiveAuthoredHeaders (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4754999+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_DropsSensitiveAuthoredHeaders","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4754999+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressEnforcedNoCall"} +{"Time":"2026-10-09T10:40:26.4754999+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressEnforcedNoCall","Output":"=== RUN TestEffects_HTTP_EgressEnforcedNoCall\n"} +{"Time":"2026-10-09T10:40:26.4780993+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressEnforcedNoCall","Output":"--- PASS: TestEffects_HTTP_EgressEnforcedNoCall (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4780993+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressEnforcedNoCall","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4780993+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_HeaderCapToErrorPort"} +{"Time":"2026-10-09T10:40:26.4780993+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_HeaderCapToErrorPort","Output":"=== RUN TestEffects_HTTP_HeaderCapToErrorPort\n"} +{"Time":"2026-10-09T10:40:26.4807114+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_HeaderCapToErrorPort","Output":"--- PASS: TestEffects_HTTP_HeaderCapToErrorPort (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4807114+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_HeaderCapToErrorPort","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4807114+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_NetworkFailureIsHostOnly"} +{"Time":"2026-10-09T10:40:26.4807114+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_NetworkFailureIsHostOnly","Output":"=== RUN TestEffects_HTTP_NetworkFailureIsHostOnly\n"} +{"Time":"2026-10-09T10:40:26.4835071+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_NetworkFailureIsHostOnly","Output":"--- PASS: TestEffects_HTTP_NetworkFailureIsHostOnly (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4835071+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_NetworkFailureIsHostOnly","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4835071+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressDialTimeIsHostOnly"} +{"Time":"2026-10-09T10:40:26.4835071+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressDialTimeIsHostOnly","Output":"=== RUN TestEffects_HTTP_EgressDialTimeIsHostOnly\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressDialTimeIsHostOnly","Output":"--- PASS: TestEffects_HTTP_EgressDialTimeIsHostOnly (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestEffects_HTTP_EgressDialTimeIsHostOnly","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/absent"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/absent","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback/absent\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/absent","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback/absent (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/absent","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/zero"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/zero","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback/zero\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/zero","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback/zero (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/zero","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negative"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negative","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback/negative\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negative","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback/negative (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negative","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negzero"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negzero","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback/negzero\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negzero","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback/negzero (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/negzero","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/normal"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/normal","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback/normal\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/normal","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback/normal (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/normal","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/clamped"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/clamped","Output":"=== RUN TestExecHTTP_TimeoutMillisClampAndFallback/clamped\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/clamped","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback/clamped (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback/clamped","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback","Output":"--- PASS: TestExecHTTP_TimeoutMillisClampAndFallback (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecHTTP_TimeoutMillisClampAndFallback","Elapsed":0} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_AmbiguousBareId_Refused"} +{"Time":"2026-10-09T10:40:26.4856178+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_AmbiguousBareId_Refused","Output":"=== RUN TestExecMulti_ResolveEntry_AmbiguousBareId_Refused\n"} +{"Time":"2026-10-09T10:40:26.520983+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_AmbiguousBareId_Refused","Output":"--- PASS: TestExecMulti_ResolveEntry_AmbiguousBareId_Refused (0.04s)\n"} +{"Time":"2026-10-09T10:40:26.520983+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_AmbiguousBareId_Refused","Elapsed":0.04} +{"Time":"2026-10-09T10:40:26.520983+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_UnambiguousBareId_Resolves"} +{"Time":"2026-10-09T10:40:26.520983+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_UnambiguousBareId_Resolves","Output":"=== RUN TestExecMulti_ResolveEntry_UnambiguousBareId_Resolves\n"} +{"Time":"2026-10-09T10:40:26.5236693+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_UnambiguousBareId_Resolves","Output":"--- PASS: TestExecMulti_ResolveEntry_UnambiguousBareId_Resolves (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5236693+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ResolveEntry_UnambiguousBareId_Resolves","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5236693+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ForkedContinuation_InheritsOwningProg"} +{"Time":"2026-10-09T10:40:26.5236693+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ForkedContinuation_InheritsOwningProg","Output":"=== RUN TestExecMulti_ForkedContinuation_InheritsOwningProg\n"} +{"Time":"2026-10-09T10:40:26.5284204+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ForkedContinuation_InheritsOwningProg","Output":"--- PASS: TestExecMulti_ForkedContinuation_InheritsOwningProg (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5284204+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ForkedContinuation_InheritsOwningProg","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5284204+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventSameTopic_TwoBlueprints_BothFire_OwnProg"} +{"Time":"2026-10-09T10:40:26.5284204+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventSameTopic_TwoBlueprints_BothFire_OwnProg","Output":"=== RUN TestExecMulti_OnEventSameTopic_TwoBlueprints_BothFire_OwnProg\n"} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventSameTopic_TwoBlueprints_BothFire_OwnProg","Output":"--- PASS: TestExecMulti_OnEventSameTopic_TwoBlueprints_BothFire_OwnProg (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventSameTopic_TwoBlueprints_BothFire_OwnProg","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_InstallExec_Idempotent"} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_InstallExec_Idempotent","Output":"=== RUN TestExecMulti_InstallExec_Idempotent\n"} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_InstallExec_Idempotent","Output":"--- PASS: TestExecMulti_InstallExec_Idempotent (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_InstallExec_Idempotent","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ShowLoad_NilProgs_ExecDormant"} +{"Time":"2026-10-09T10:40:26.5307686+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ShowLoad_NilProgs_ExecDormant","Output":"=== RUN TestExecMulti_ShowLoad_NilProgs_ExecDormant\n"} +{"Time":"2026-10-09T10:40:26.5511771+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ShowLoad_NilProgs_ExecDormant","Output":"--- PASS: TestExecMulti_ShowLoad_NilProgs_ExecDormant (0.02s)\n"} +{"Time":"2026-10-09T10:40:26.5511771+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ShowLoad_NilProgs_ExecDormant","Elapsed":0.02} +{"Time":"2026-10-09T10:40:26.5511771+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnTick_TwoBlueprints_EachOwnNamespace"} +{"Time":"2026-10-09T10:40:26.5511771+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnTick_TwoBlueprints_EachOwnNamespace","Output":"=== RUN TestExecMulti_OnTick_TwoBlueprints_EachOwnNamespace\n"} +{"Time":"2026-10-09T10:40:26.5539432+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnTick_TwoBlueprints_EachOwnNamespace","Output":"--- PASS: TestExecMulti_OnTick_TwoBlueprints_EachOwnNamespace (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5539432+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnTick_TwoBlueprints_EachOwnNamespace","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5539432+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_Race_ConcurrentFireOnStart_NDataRace"} +{"Time":"2026-10-09T10:40:26.5539432+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_Race_ConcurrentFireOnStart_NDataRace","Output":"=== RUN TestExecMulti_Race_ConcurrentFireOnStart_NDataRace\n"} +{"Time":"2026-10-09T10:40:26.5565671+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_Race_ConcurrentFireOnStart_NDataRace","Output":"--- PASS: TestExecMulti_Race_ConcurrentFireOnStart_NDataRace (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5565671+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_Race_ConcurrentFireOnStart_NDataRace","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5565671+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ThreeBlueprints_SameTopic_AllFire"} +{"Time":"2026-10-09T10:40:26.5565671+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ThreeBlueprints_SameTopic_AllFire","Output":"=== RUN TestExecMulti_ThreeBlueprints_SameTopic_AllFire\n"} +{"Time":"2026-10-09T10:40:26.559172+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ThreeBlueprints_SameTopic_AllFire","Output":"--- PASS: TestExecMulti_ThreeBlueprints_SameTopic_AllFire (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.559172+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_ThreeBlueprints_SameTopic_AllFire","Elapsed":0} +{"Time":"2026-10-09T10:40:26.559172+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_TwoBlueprintsInstalledOnOneInstance"} +{"Time":"2026-10-09T10:40:26.559172+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_TwoBlueprintsInstalledOnOneInstance","Output":"=== RUN TestExecMulti_TwoBlueprintsInstalledOnOneInstance\n"} +{"Time":"2026-10-09T10:40:26.5617484+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_TwoBlueprintsInstalledOnOneInstance","Output":"--- PASS: TestExecMulti_TwoBlueprintsInstalledOnOneInstance (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5617484+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_TwoBlueprintsInstalledOnOneInstance","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5617484+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenBlueprints"} +{"Time":"2026-10-09T10:40:26.5617484+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenBlueprints","Output":"=== RUN TestExecMulti_VarsDisjointBetweenBlueprints\n"} +{"Time":"2026-10-09T10:40:26.5640892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenBlueprints","Output":"--- PASS: TestExecMulti_VarsDisjointBetweenBlueprints (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5640892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenBlueprints","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5640892+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenInstancesSharingKey"} +{"Time":"2026-10-09T10:40:26.5640892+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenInstancesSharingKey","Output":"=== RUN TestExecMulti_VarsDisjointBetweenInstancesSharingKey\n"} +{"Time":"2026-10-09T10:40:26.5667683+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenInstancesSharingKey","Output":"--- PASS: TestExecMulti_VarsDisjointBetweenInstancesSharingKey (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.5667683+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_VarsDisjointBetweenInstancesSharingKey","Elapsed":0} +{"Time":"2026-10-09T10:40:26.5667683+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventRoutesByTopicAcrossBlueprints"} +{"Time":"2026-10-09T10:40:26.5667683+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventRoutesByTopicAcrossBlueprints","Output":"=== RUN TestExecMulti_OnEventRoutesByTopicAcrossBlueprints\n"} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventRoutesByTopicAcrossBlueprints","Output":"--- PASS: TestExecMulti_OnEventRoutesByTopicAcrossBlueprints (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_OnEventRoutesByTopicAcrossBlueprints","Elapsed":0} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_IndexMergeDeterministic"} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_IndexMergeDeterministic","Output":"=== RUN TestExecMulti_IndexMergeDeterministic\n"} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_IndexMergeDeterministic","Output":"--- PASS: TestExecMulti_IndexMergeDeterministic (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecMulti_IndexMergeDeterministic","Elapsed":0} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_FiresPerWrite"} +{"Time":"2026-10-09T10:40:26.571458+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_FiresPerWrite","Output":"=== RUN TestExec_OnPlatformEvent_FiresPerWrite\n"} +{"Time":"2026-10-09T10:40:26.7264596+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_FiresPerWrite","Output":"--- PASS: TestExec_OnPlatformEvent_FiresPerWrite (0.15s)\n"} +{"Time":"2026-10-09T10:40:26.7264596+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_FiresPerWrite","Elapsed":0.15} +{"Time":"2026-10-09T10:40:26.7264596+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_RoutesByLeaf"} +{"Time":"2026-10-09T10:40:26.7264596+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_RoutesByLeaf","Output":"=== RUN TestExec_OnPlatformEvent_RoutesByLeaf\n"} +{"Time":"2026-10-09T10:40:26.7312096+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_RoutesByLeaf","Output":"--- PASS: TestExec_OnPlatformEvent_RoutesByLeaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7312096+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_RoutesByLeaf","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7312096+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_PayloadBoundToFiredTask"} +{"Time":"2026-10-09T10:40:26.7312096+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_PayloadBoundToFiredTask","Output":"=== RUN TestExec_OnPlatformEvent_PayloadBoundToFiredTask\n"} +{"Time":"2026-10-09T10:40:26.7360164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_PayloadBoundToFiredTask","Output":"--- PASS: TestExec_OnPlatformEvent_PayloadBoundToFiredTask (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7360164+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_PayloadBoundToFiredTask","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7360164+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_CoexistsWithDataflow"} +{"Time":"2026-10-09T10:40:26.7360164+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_CoexistsWithDataflow","Output":"=== RUN TestExec_OnPlatformEvent_CoexistsWithDataflow\n"} +{"Time":"2026-10-09T10:40:26.7386372+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_CoexistsWithDataflow","Output":"--- PASS: TestExec_OnPlatformEvent_CoexistsWithDataflow (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7386372+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnPlatformEvent_CoexistsWithDataflow","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7386372+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OffAirSceneFiresNoTriggers"} +{"Time":"2026-10-09T10:40:26.7386372+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OffAirSceneFiresNoTriggers","Output":"=== RUN TestOnAir_OffAirSceneFiresNoTriggers\n"} +{"Time":"2026-10-09T10:40:26.7412699+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OffAirSceneFiresNoTriggers","Output":"--- PASS: TestOnAir_OffAirSceneFiresNoTriggers (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7412699+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OffAirSceneFiresNoTriggers","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7412699+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnAirFiresTriggers_SwitchAwayStops"} +{"Time":"2026-10-09T10:40:26.7412699+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnAirFiresTriggers_SwitchAwayStops","Output":"=== RUN TestOnAir_OnAirFiresTriggers_SwitchAwayStops\n"} +{"Time":"2026-10-09T10:40:26.7482122+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnAirFiresTriggers_SwitchAwayStops","Output":"--- PASS: TestOnAir_OnAirFiresTriggers_SwitchAwayStops (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.7482122+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnAirFiresTriggers_SwitchAwayStops","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.7482122+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnEventGatedOffAir"} +{"Time":"2026-10-09T10:40:26.7482122+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnEventGatedOffAir","Output":"=== RUN TestOnAir_OnEventGatedOffAir\n"} +{"Time":"2026-10-09T10:40:26.7530573+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnEventGatedOffAir","Output":"--- PASS: TestOnAir_OnEventGatedOffAir (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7530573+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_OnEventGatedOffAir","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7530573+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_TestSessionUngated"} +{"Time":"2026-10-09T10:40:26.7530573+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_TestSessionUngated","Output":"=== RUN TestOnAir_TestSessionUngated\n"} +{"Time":"2026-10-09T10:40:26.7556961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_TestSessionUngated","Output":"--- PASS: TestOnAir_TestSessionUngated (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7556961+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_TestSessionUngated","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7556961+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_ShowGatesRosterInstance"} +{"Time":"2026-10-09T10:40:26.7556961+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_ShowGatesRosterInstance","Output":"=== RUN TestOnAir_ShowGatesRosterInstance\n"} +{"Time":"2026-10-09T10:40:26.7624754+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_ShowGatesRosterInstance","Output":"--- PASS: TestOnAir_ShowGatesRosterInstance (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.7624754+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOnAir_ShowGatesRosterInstance","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.7624754+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitSuspendsAndResumes"} +{"Time":"2026-10-09T10:40:26.7624754+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitSuspendsAndResumes","Output":"=== RUN TestOperator_AwaitSuspendsAndResumes\n"} +{"Time":"2026-10-09T10:40:26.765085+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitSuspendsAndResumes","Output":"--- PASS: TestOperator_AwaitSuspendsAndResumes (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.765085+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitSuspendsAndResumes","Elapsed":0} +{"Time":"2026-10-09T10:40:26.765085+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveTypeMismatchRejected"} +{"Time":"2026-10-09T10:40:26.765085+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveTypeMismatchRejected","Output":"=== RUN TestOperator_ResolveTypeMismatchRejected\n"} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveTypeMismatchRejected","Output":"--- PASS: TestOperator_ResolveTypeMismatchRejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveTypeMismatchRejected","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveUnknownIsGone"} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveUnknownIsGone","Output":"=== RUN TestOperator_ResolveUnknownIsGone\n"} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveUnknownIsGone","Output":"--- PASS: TestOperator_ResolveUnknownIsGone (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_ResolveUnknownIsGone","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitInvalidatedByCancelExec"} +{"Time":"2026-10-09T10:40:26.7674563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitInvalidatedByCancelExec","Output":"=== RUN TestOperator_AwaitInvalidatedByCancelExec\n"} +{"Time":"2026-10-09T10:40:26.7700841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitInvalidatedByCancelExec","Output":"--- PASS: TestOperator_AwaitInvalidatedByCancelExec (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7700841+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_AwaitInvalidatedByCancelExec","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7700841+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallFiresThenWithPayload"} +{"Time":"2026-10-09T10:40:26.7700841+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallFiresThenWithPayload","Output":"=== RUN TestOperator_OnCallFiresThenWithPayload\n"} +{"Time":"2026-10-09T10:40:26.7727063+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallFiresThenWithPayload","Output":"--- PASS: TestOperator_OnCallFiresThenWithPayload (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7727063+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallFiresThenWithPayload","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7727063+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallKeyedByEntrypointName"} +{"Time":"2026-10-09T10:40:26.7727063+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallKeyedByEntrypointName","Output":"=== RUN TestOperator_OnCallKeyedByEntrypointName\n"} +{"Time":"2026-10-09T10:40:26.7752691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallKeyedByEntrypointName","Output":"--- PASS: TestOperator_OnCallKeyedByEntrypointName (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7752691+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOperator_OnCallKeyedByEntrypointName","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7752691+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_EmitsMirrorState"} +{"Time":"2026-10-09T10:40:26.7752691+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_EmitsMirrorState","Output":"=== RUN TestOverlayAppSet_EmitsMirrorState\n"} +{"Time":"2026-10-09T10:40:26.7778575+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_EmitsMirrorState","Output":"--- PASS: TestOverlayAppSet_EmitsMirrorState (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7778575+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_EmitsMirrorState","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7778575+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_OptionalDimensionsPassNil"} +{"Time":"2026-10-09T10:40:26.7778575+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_OptionalDimensionsPassNil","Output":"=== RUN TestOverlayAppSet_OptionalDimensionsPassNil\n"} +{"Time":"2026-10-09T10:40:26.7804631+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_OptionalDimensionsPassNil","Output":"--- PASS: TestOverlayAppSet_OptionalDimensionsPassNil (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7804631+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_OptionalDimensionsPassNil","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7804631+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_NilSeamConstructionSafe"} +{"Time":"2026-10-09T10:40:26.7804631+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_NilSeamConstructionSafe","Output":"=== RUN TestOverlayAppSet_NilSeamConstructionSafe\n"} +{"Time":"2026-10-09T10:40:26.7831234+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_NilSeamConstructionSafe","Output":"--- PASS: TestOverlayAppSet_NilSeamConstructionSafe (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7831234+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_NilSeamConstructionSafe","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7831234+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_MissingAppIDSkipsButFiresThen"} +{"Time":"2026-10-09T10:40:26.7831234+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_MissingAppIDSkipsButFiresThen","Output":"=== RUN TestOverlayAppSet_MissingAppIDSkipsButFiresThen\n"} +{"Time":"2026-10-09T10:40:26.7858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_MissingAppIDSkipsButFiresThen","Output":"--- PASS: TestOverlayAppSet_MissingAppIDSkipsButFiresThen (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestOverlayAppSet_MissingAppIDSkipsButFiresThen","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTripFromCompiler"} +{"Time":"2026-10-09T10:40:26.7858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTripFromCompiler","Output":"=== RUN TestExecPartition_RoundTripFromCompiler\n"} +{"Time":"2026-10-09T10:40:26.7858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTripFromCompiler","Output":"--- PASS: TestExecPartition_RoundTripFromCompiler (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTripFromCompiler","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTrip_OnPlatformEvent"} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTrip_OnPlatformEvent","Output":"=== RUN TestExecPartition_RoundTrip_OnPlatformEvent\n"} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTrip_OnPlatformEvent","Output":"--- PASS: TestExecPartition_RoundTrip_OnPlatformEvent (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecPartition_RoundTrip_OnPlatformEvent","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkFork_InLoopBody_LoopContinues"} +{"Time":"2026-10-09T10:40:26.7863658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkFork_InLoopBody_LoopContinues","Output":"=== RUN TestExec_ParkFork_InLoopBody_LoopContinues\n"} +{"Time":"2026-10-09T10:40:26.791081+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkFork_InLoopBody_LoopContinues","Output":"--- PASS: TestExec_ParkFork_InLoopBody_LoopContinues (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.791081+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkFork_InLoopBody_LoopContinues","Elapsed":0} +{"Time":"2026-10-09T10:40:26.791081+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_NestedSeqInLoop_ExactStateAcrossPreemptions"} +{"Time":"2026-10-09T10:40:26.791081+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_NestedSeqInLoop_ExactStateAcrossPreemptions","Output":"=== RUN TestExec_NestedSeqInLoop_ExactStateAcrossPreemptions\n"} +{"Time":"2026-10-09T10:40:26.7936688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_NestedSeqInLoop_ExactStateAcrossPreemptions","Output":"--- PASS: TestExec_NestedSeqInLoop_ExactStateAcrossPreemptions (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.7936688+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_NestedSeqInLoop_ExactStateAcrossPreemptions","Elapsed":0} +{"Time":"2026-10-09T10:40:26.7936688+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetZero_NeverSheds"} +{"Time":"2026-10-09T10:40:26.7936688+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetZero_NeverSheds","Output":"=== RUN TestExec_B5_BudgetZero_NeverSheds\n"} +{"Time":"2026-10-09T10:40:26.8439648+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetZero_NeverSheds","Output":"--- PASS: TestExec_B5_BudgetZero_NeverSheds (0.05s)\n"} +{"Time":"2026-10-09T10:40:26.8439648+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetZero_NeverSheds","Elapsed":0.05} +{"Time":"2026-10-09T10:40:26.8439648+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetOne_ExactBoundary"} +{"Time":"2026-10-09T10:40:26.8439648+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetOne_ExactBoundary","Output":"=== RUN TestExec_B5_BudgetOne_ExactBoundary\n"} +{"Time":"2026-10-09T10:40:26.8490405+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetOne_ExactBoundary","Output":"--- PASS: TestExec_B5_BudgetOne_ExactBoundary (0.01s)\n"} +{"Time":"2026-10-09T10:40:26.8490405+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BudgetOne_ExactBoundary","Elapsed":0.01} +{"Time":"2026-10-09T10:40:26.8490405+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_ConcurrentFires_NoLeakBetweenInstances"} +{"Time":"2026-10-09T10:40:26.8490405+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_ConcurrentFires_NoLeakBetweenInstances","Output":"=== RUN TestExec_B9_ConcurrentFires_NoLeakBetweenInstances\n"} +{"Time":"2026-10-09T10:40:26.8516675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_ConcurrentFires_NoLeakBetweenInstances","Output":"--- PASS: TestExec_B9_ConcurrentFires_NoLeakBetweenInstances (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.8516675+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_ConcurrentFires_NoLeakBetweenInstances","Elapsed":0} +{"Time":"2026-10-09T10:40:26.8516675+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DuplicateWakeKey_ContinuationDropped_SceneKeepServing"} +{"Time":"2026-10-09T10:40:26.8516675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DuplicateWakeKey_ContinuationDropped_SceneKeepServing","Output":"=== RUN TestExec_DuplicateWakeKey_ContinuationDropped_SceneKeepServing\n"} +{"Time":"2026-10-09T10:40:26.8749623+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DuplicateWakeKey_ContinuationDropped_SceneKeepServing","Output":"--- PASS: TestExec_DuplicateWakeKey_ContinuationDropped_SceneKeepServing (0.02s)\n"} +{"Time":"2026-10-09T10:40:26.8749623+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DuplicateWakeKey_ContinuationDropped_SceneKeepServing","Elapsed":0.02} +{"Time":"2026-10-09T10:40:26.8749623+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetEffector_CustomEffectorReceivesWrites"} +{"Time":"2026-10-09T10:40:26.8749623+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetEffector_CustomEffectorReceivesWrites","Output":"=== RUN TestExec_SetEffector_CustomEffectorReceivesWrites\n"} +{"Time":"2026-10-09T10:40:26.8956873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetEffector_CustomEffectorReceivesWrites","Output":"--- PASS: TestExec_SetEffector_CustomEffectorReceivesWrites (0.02s)\n"} +{"Time":"2026-10-09T10:40:26.8956873+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetEffector_CustomEffectorReceivesWrites","Elapsed":0.02} +{"Time":"2026-10-09T10:40:26.8956873+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableSet_EmptyName_NocrashSceneContinues"} +{"Time":"2026-10-09T10:40:26.8956873+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableSet_EmptyName_NocrashSceneContinues","Output":"=== RUN TestExec_VariableSet_EmptyName_NocrashSceneContinues\n"} +{"Time":"2026-10-09T10:40:26.8983053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableSet_EmptyName_NocrashSceneContinues","Output":"--- PASS: TestExec_VariableSet_EmptyName_NocrashSceneContinues (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.8983053+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableSet_EmptyName_NocrashSceneContinues","Elapsed":0} +{"Time":"2026-10-09T10:40:26.8983053+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_UnknownOp_ChainContinues"} +{"Time":"2026-10-09T10:40:26.8983053+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_UnknownOp_ChainContinues","Output":"=== RUN TestExec_UnknownOp_ChainContinues\n"} +{"Time":"2026-10-09T10:40:26.9009354+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_UnknownOp_ChainContinues","Output":"--- PASS: TestExec_UnknownOp_ChainContinues (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.9009354+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_UnknownOp_ChainContinues","Elapsed":0} +{"Time":"2026-10-09T10:40:26.9009354+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_NoBodyWired_FiresCompleted"} +{"Time":"2026-10-09T10:40:26.9009354+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_NoBodyWired_FiresCompleted","Output":"=== RUN TestExec_ForLoop_NoBodyWired_FiresCompleted\n"} +{"Time":"2026-10-09T10:40:26.9034807+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_NoBodyWired_FiresCompleted","Output":"--- PASS: TestExec_ForLoop_NoBodyWired_FiresCompleted (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.9034807+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_NoBodyWired_FiresCompleted","Elapsed":0} +{"Time":"2026-10-09T10:40:26.9034807+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Sequence_Empty_NocrashSceneContinues"} +{"Time":"2026-10-09T10:40:26.9034807+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Sequence_Empty_NocrashSceneContinues","Output":"=== RUN TestExec_Sequence_Empty_NocrashSceneContinues\n"} +{"Time":"2026-10-09T10:40:26.9056238+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Sequence_Empty_NocrashSceneContinues","Output":"--- PASS: TestExec_Sequence_Empty_NocrashSceneContinues (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.9056238+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Sequence_Empty_NocrashSceneContinues","Elapsed":0} +{"Time":"2026-10-09T10:40:26.9056238+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Gate_ToggleAndClose"} +{"Time":"2026-10-09T10:40:26.9056238+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Gate_ToggleAndClose","Output":"=== RUN TestExec_Gate_ToggleAndClose\n"} +{"Time":"2026-10-09T10:40:26.9358911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Gate_ToggleAndClose","Output":"--- PASS: TestExec_Gate_ToggleAndClose (0.03s)\n"} +{"Time":"2026-10-09T10:40:26.9358911+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Gate_ToggleAndClose","Elapsed":0.03} +{"Time":"2026-10-09T10:40:26.9358911+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_PullDefaults_AbsentPort_SafeFallback"} +{"Time":"2026-10-09T10:40:26.9358911+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_PullDefaults_AbsentPort_SafeFallback","Output":"=== RUN TestExec_PullDefaults_AbsentPort_SafeFallback\n"} +{"Time":"2026-10-09T10:40:26.9614864+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_PullDefaults_AbsentPort_SafeFallback","Output":"--- PASS: TestExec_PullDefaults_AbsentPort_SafeFallback (0.03s)\n"} +{"Time":"2026-10-09T10:40:26.9614864+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_PullDefaults_AbsentPort_SafeFallback","Elapsed":0.03} +{"Time":"2026-10-09T10:40:26.9614864+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BuildsPathAndCalls"} +{"Time":"2026-10-09T10:40:26.9614864+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BuildsPathAndCalls","Output":"=== RUN TestServiceCall_BuildsPathAndCalls\n"} +{"Time":"2026-10-09T10:40:26.963664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BuildsPathAndCalls","Output":"--- PASS: TestServiceCall_BuildsPathAndCalls (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.963664+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BuildsPathAndCalls","Elapsed":0} +{"Time":"2026-10-09T10:40:26.963664+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_AntiInjectionTemplate"} +{"Time":"2026-10-09T10:40:26.963664+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_AntiInjectionTemplate","Output":"=== RUN TestServiceCall_AntiInjectionTemplate\n"} +{"Time":"2026-10-09T10:40:26.9668645+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_AntiInjectionTemplate","Output":"--- PASS: TestServiceCall_AntiInjectionTemplate (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.9668645+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_AntiInjectionTemplate","Elapsed":0} +{"Time":"2026-10-09T10:40:26.9668645+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_MissingBakedRouteFailsClosed"} +{"Time":"2026-10-09T10:40:26.9668645+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_MissingBakedRouteFailsClosed","Output":"=== RUN TestServiceCall_MissingBakedRouteFailsClosed\n"} +{"Time":"2026-10-09T10:40:26.9689563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_MissingBakedRouteFailsClosed","Output":"--- PASS: TestServiceCall_MissingBakedRouteFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:40:26.9689563+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_MissingBakedRouteFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:40:26.9689563+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetExceededFailsClosed"} +{"Time":"2026-10-09T10:40:26.9689563+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetExceededFailsClosed","Output":"=== RUN TestServiceCall_BudgetExceededFailsClosed\n"} +{"Time":"2026-10-09T10:40:27.022008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetExceededFailsClosed","Output":"--- PASS: TestServiceCall_BudgetExceededFailsClosed (0.05s)\n"} +{"Time":"2026-10-09T10:40:27.022008+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetExceededFailsClosed","Elapsed":0.05} +{"Time":"2026-10-09T10:40:27.022008+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetIsolatedPerStream"} +{"Time":"2026-10-09T10:40:27.022008+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetIsolatedPerStream","Output":"=== RUN TestServiceCall_BudgetIsolatedPerStream\n"} +{"Time":"2026-10-09T10:40:27.0275938+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetIsolatedPerStream","Output":"--- PASS: TestServiceCall_BudgetIsolatedPerStream (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.0275938+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestServiceCall_BudgetIsolatedPerStream","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.0275938+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_PayloadBoundToFiredTask"} +{"Time":"2026-10-09T10:40:27.0275938+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_PayloadBoundToFiredTask","Output":"=== RUN TestExec_OnEvent_PayloadBoundToFiredTask\n"} +{"Time":"2026-10-09T10:40:27.0325794+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_PayloadBoundToFiredTask","Output":"--- PASS: TestExec_OnEvent_PayloadBoundToFiredTask (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.0325794+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_PayloadBoundToFiredTask","Elapsed":0} +{"Time":"2026-10-09T10:40:27.0325794+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_RuleToActiveNoCascade"} +{"Time":"2026-10-09T10:40:27.0325794+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_RuleToActiveNoCascade","Output":"=== RUN TestShowEmit_RuleToActiveNoCascade\n"} +{"Time":"2026-10-09T10:40:27.2356467+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_RuleToActiveNoCascade","Output":"--- PASS: TestShowEmit_RuleToActiveNoCascade (0.20s)\n"} +{"Time":"2026-10-09T10:40:27.2356467+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_RuleToActiveNoCascade","Elapsed":0.2} +{"Time":"2026-10-09T10:40:27.2356467+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_FiresThenWithoutActiveScene"} +{"Time":"2026-10-09T10:40:27.2356467+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_FiresThenWithoutActiveScene","Output":"=== RUN TestShowEmit_FiresThenWithoutActiveScene\n"} +{"Time":"2026-10-09T10:40:27.2382594+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_FiresThenWithoutActiveScene","Output":"--- PASS: TestShowEmit_FiresThenWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.2382594+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_FiresThenWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:40:27.2382594+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_NilSeamConstructionSafe"} +{"Time":"2026-10-09T10:40:27.2382594+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_NilSeamConstructionSafe","Output":"=== RUN TestShowEmit_NilSeamConstructionSafe\n"} +{"Time":"2026-10-09T10:40:27.241451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_NilSeamConstructionSafe","Output":"--- PASS: TestShowEmit_NilSeamConstructionSafe (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.241451+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShowEmit_NilSeamConstructionSafe","Elapsed":0} +{"Time":"2026-10-09T10:40:27.241451+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableGetReadsCrossTick"} +{"Time":"2026-10-09T10:40:27.241451+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableGetReadsCrossTick","Output":"=== RUN TestExec_VariableGetReadsCrossTick\n"} +{"Time":"2026-10-09T10:40:27.2482126+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableGetReadsCrossTick","Output":"--- PASS: TestExec_VariableGetReadsCrossTick (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.2482126+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_VariableGetReadsCrossTick","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.2482126+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_BranchBothArms"} +{"Time":"2026-10-09T10:40:27.2482126+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_BranchBothArms","Output":"=== RUN TestExec_BranchBothArms\n"} +{"Time":"2026-10-09T10:40:27.2526385+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_BranchBothArms","Output":"--- PASS: TestExec_BranchBothArms (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.2526385+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_BranchBothArms","Elapsed":0} +{"Time":"2026-10-09T10:40:27.2526385+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SequenceOrder"} +{"Time":"2026-10-09T10:40:27.2526385+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SequenceOrder","Output":"=== RUN TestExec_SequenceOrder\n"} +{"Time":"2026-10-09T10:40:27.2552334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SequenceOrder","Output":"--- PASS: TestExec_SequenceOrder (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.2552334+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SequenceOrder","Elapsed":0} +{"Time":"2026-10-09T10:40:27.2552334+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_ContinuationResumesAcrossSlices"} +{"Time":"2026-10-09T10:40:27.2552334+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_ContinuationResumesAcrossSlices","Output":"=== RUN TestExec_ForLoop_ContinuationResumesAcrossSlices\n"} +{"Time":"2026-10-09T10:40:27.257835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_ContinuationResumesAcrossSlices","Output":"--- PASS: TestExec_ForLoop_ContinuationResumesAcrossSlices (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.257835+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForLoop_ContinuationResumesAcrossSlices","Elapsed":0} +{"Time":"2026-10-09T10:40:27.257835+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_WhileTerminatesOnCondition"} +{"Time":"2026-10-09T10:40:27.257835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_WhileTerminatesOnCondition","Output":"=== RUN TestExec_WhileTerminatesOnCondition\n"} +{"Time":"2026-10-09T10:40:27.2604843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_WhileTerminatesOnCondition","Output":"--- PASS: TestExec_WhileTerminatesOnCondition (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.2604843+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_WhileTerminatesOnCondition","Elapsed":0} +{"Time":"2026-10-09T10:40:27.2604843+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForEach"} +{"Time":"2026-10-09T10:40:27.2604843+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForEach","Output":"=== RUN TestExec_ForEach\n"} +{"Time":"2026-10-09T10:40:27.2630856+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForEach","Output":"--- PASS: TestExec_ForEach (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.2630856+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ForEach","Elapsed":0} +{"Time":"2026-10-09T10:40:27.2630856+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_GateStartClosedThenOpened"} +{"Time":"2026-10-09T10:40:27.2630856+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_GateStartClosedThenOpened","Output":"=== RUN TestExec_GateStartClosedThenOpened\n"} +{"Time":"2026-10-09T10:40:27.2678755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_GateStartClosedThenOpened","Output":"--- PASS: TestExec_GateStartClosedThenOpened (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.2678755+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_GateStartClosedThenOpened","Elapsed":0} +{"Time":"2026-10-09T10:40:27.2678755+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkSeam_SequenceContinuesWhileChildParked"} +{"Time":"2026-10-09T10:40:27.2678755+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkSeam_SequenceContinuesWhileChildParked","Output":"=== RUN TestExec_ParkSeam_SequenceContinuesWhileChildParked\n"} +{"Time":"2026-10-09T10:40:27.2757711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkSeam_SequenceContinuesWhileChildParked","Output":"--- PASS: TestExec_ParkSeam_SequenceContinuesWhileChildParked (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.2757711+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ParkSeam_SequenceContinuesWhileChildParked","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.2757711+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_TimeSlicing_LoopStaysResponsive_NothingKilled"} +{"Time":"2026-10-09T10:40:27.2757711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_TimeSlicing_LoopStaysResponsive_NothingKilled","Output":"=== RUN TestExec_TimeSlicing_LoopStaysResponsive_NothingKilled\n"} +{"Time":"2026-10-09T10:40:27.3026774+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_TimeSlicing_LoopStaysResponsive_NothingKilled","Output":"--- PASS: TestExec_TimeSlicing_LoopStaysResponsive_NothingKilled (0.03s)\n"} +{"Time":"2026-10-09T10:40:27.3026774+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_TimeSlicing_LoopStaysResponsive_NothingKilled","Elapsed":0.03} +{"Time":"2026-10-09T10:40:27.3026774+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BackPressure_ShedsNewFiresOnly"} +{"Time":"2026-10-09T10:40:27.3026774+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BackPressure_ShedsNewFiresOnly","Output":"=== RUN TestExec_B5_BackPressure_ShedsNewFiresOnly\n"} +{"Time":"2026-10-09T10:40:27.307157+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BackPressure_ShedsNewFiresOnly","Output":"--- PASS: TestExec_B5_BackPressure_ShedsNewFiresOnly (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.307157+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B5_BackPressure_ShedsNewFiresOnly","Elapsed":0} +{"Time":"2026-10-09T10:40:27.307157+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_VarsIsolationBetweenInstances"} +{"Time":"2026-10-09T10:40:27.307157+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_VarsIsolationBetweenInstances","Output":"=== RUN TestExec_B9_VarsIsolationBetweenInstances\n"} +{"Time":"2026-10-09T10:40:27.3097811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_VarsIsolationBetweenInstances","Output":"--- PASS: TestExec_B9_VarsIsolationBetweenInstances (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.3097811+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B9_VarsIsolationBetweenInstances","Elapsed":0} +{"Time":"2026-10-09T10:40:27.3097811+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DeterministicInterleaving"} +{"Time":"2026-10-09T10:40:27.3097811+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DeterministicInterleaving","Output":"=== RUN TestExec_DeterministicInterleaving\n"} +{"Time":"2026-10-09T10:40:27.3145868+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DeterministicInterleaving","Output":"--- PASS: TestExec_DeterministicInterleaving (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.3145868+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_DeterministicInterleaving","Elapsed":0} +{"Time":"2026-10-09T10:40:27.3145868+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SingleWriter_UnderConcurrentLoad"} +{"Time":"2026-10-09T10:40:27.3145868+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SingleWriter_UnderConcurrentLoad","Output":"=== RUN TestExec_SingleWriter_UnderConcurrentLoad\n"} +{"Time":"2026-10-09T10:40:27.3214797+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SingleWriter_UnderConcurrentLoad","Output":"--- PASS: TestExec_SingleWriter_UnderConcurrentLoad (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.3214797+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SingleWriter_UnderConcurrentLoad","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.3214797+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_FireWithoutProgramOrEntry_NoCrash"} +{"Time":"2026-10-09T10:40:27.3214797+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_FireWithoutProgramOrEntry_NoCrash","Output":"=== RUN TestExec_FireWithoutProgramOrEntry_NoCrash\n"} +{"Time":"2026-10-09T10:40:27.3241399+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_FireWithoutProgramOrEntry_NoCrash","Output":"--- PASS: TestExec_FireWithoutProgramOrEntry_NoCrash (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.3241399+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_FireWithoutProgramOrEntry_NoCrash","Elapsed":0} +{"Time":"2026-10-09T10:40:27.3241399+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_MultipleDeadlines_FiringOrderIsByDeadline"} +{"Time":"2026-10-09T10:40:27.3241399+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_MultipleDeadlines_FiringOrderIsByDeadline","Output":"=== RUN TestExecDelay_MultipleDeadlines_FiringOrderIsByDeadline\n"} +{"Time":"2026-10-09T10:40:27.3326912+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_MultipleDeadlines_FiringOrderIsByDeadline","Output":"--- PASS: TestExecDelay_MultipleDeadlines_FiringOrderIsByDeadline (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.3326912+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_MultipleDeadlines_FiringOrderIsByDeadline","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.3326912+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_IdenticalDeadline_TieBreakByParkOrder"} +{"Time":"2026-10-09T10:40:27.3326912+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_IdenticalDeadline_TieBreakByParkOrder","Output":"=== RUN TestExecDelay_IdenticalDeadline_TieBreakByParkOrder\n"} +{"Time":"2026-10-09T10:40:27.35707+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_IdenticalDeadline_TieBreakByParkOrder","Output":"--- PASS: TestExecDelay_IdenticalDeadline_TieBreakByParkOrder (0.02s)\n"} +{"Time":"2026-10-09T10:40:27.35707+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_IdenticalDeadline_TieBreakByParkOrder","Elapsed":0.02} +{"Time":"2026-10-09T10:40:27.35707+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_RearmWhenCloserParkArrives"} +{"Time":"2026-10-09T10:40:27.35707+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_RearmWhenCloserParkArrives","Output":"=== RUN TestExecDelay_RearmWhenCloserParkArrives\n"} +{"Time":"2026-10-09T10:40:27.3865018+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_RearmWhenCloserParkArrives","Output":"--- PASS: TestExecDelay_RearmWhenCloserParkArrives (0.03s)\n"} +{"Time":"2026-10-09T10:40:27.3865018+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_RearmWhenCloserParkArrives","Elapsed":0.03} +{"Time":"2026-10-09T10:40:27.3865018+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapDisabled_AllParksAccepted"} +{"Time":"2026-10-09T10:40:27.3865018+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapDisabled_AllParksAccepted","Output":"=== RUN TestExec_B8_CapDisabled_AllParksAccepted\n"} +{"Time":"2026-10-09T10:40:27.3887784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapDisabled_AllParksAccepted","Output":"--- PASS: TestExec_B8_CapDisabled_AllParksAccepted (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.3887784+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapDisabled_AllParksAccepted","Elapsed":0} +{"Time":"2026-10-09T10:40:27.3887784+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapExactBoundary"} +{"Time":"2026-10-09T10:40:27.3887784+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapExactBoundary","Output":"=== RUN TestExec_B8_CapExactBoundary\n"} +{"Time":"2026-10-09T10:40:27.3951043+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapExactBoundary","Output":"--- PASS: TestExec_B8_CapExactBoundary (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.3951043+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_CapExactBoundary","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.3951043+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MultipleParked_AllCleaned"} +{"Time":"2026-10-09T10:40:27.3951043+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MultipleParked_AllCleaned","Output":"=== RUN TestExec_Cancellation_MultipleParked_AllCleaned\n"} +{"Time":"2026-10-09T10:40:27.4303185+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MultipleParked_AllCleaned","Output":"--- PASS: TestExec_Cancellation_MultipleParked_AllCleaned (0.04s)\n"} +{"Time":"2026-10-09T10:40:27.4303185+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MultipleParked_AllCleaned","Elapsed":0.04} +{"Time":"2026-10-09T10:40:27.4303185+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ResumeStale_WrongSceneVersion"} +{"Time":"2026-10-09T10:40:27.4303185+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ResumeStale_WrongSceneVersion","Output":"=== RUN TestExec_ResumeStale_WrongSceneVersion\n"} +{"Time":"2026-10-09T10:40:27.4329667+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ResumeStale_WrongSceneVersion","Output":"--- PASS: TestExec_ResumeStale_WrongSceneVersion (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.4329667+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_ResumeStale_WrongSceneVersion","Elapsed":0} +{"Time":"2026-10-09T10:40:27.4329667+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetActive_InertWithoutProgram"} +{"Time":"2026-10-09T10:40:27.4329667+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetActive_InertWithoutProgram","Output":"=== RUN TestExec_SetActive_InertWithoutProgram\n"} +{"Time":"2026-10-09T10:40:27.4636539+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetActive_InertWithoutProgram","Output":"--- PASS: TestExec_SetActive_InertWithoutProgram (0.03s)\n"} +{"Time":"2026-10-09T10:40:27.4636539+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_SetActive_InertWithoutProgram","Elapsed":0.03} +{"Time":"2026-10-09T10:40:27.4636539+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_HugeDelay_NoPrematureFire"} +{"Time":"2026-10-09T10:40:27.4636539+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_HugeDelay_NoPrematureFire","Output":"=== RUN TestExecDelay_HugeDelay_NoPrematureFire\n"} +{"Time":"2026-10-09T10:40:27.4968736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_HugeDelay_NoPrematureFire","Output":"--- PASS: TestExecDelay_HugeDelay_NoPrematureFire (0.03s)\n"} +{"Time":"2026-10-09T10:40:27.4968736+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_HugeDelay_NoPrematureFire","Elapsed":0.03} +{"Time":"2026-10-09T10:40:27.4968736+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_Race_ConcurrentInputsAndCancel"} +{"Time":"2026-10-09T10:40:27.4968736+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_Race_ConcurrentInputsAndCancel","Output":"=== RUN TestExecDelay_Race_ConcurrentInputsAndCancel\n"} +{"Time":"2026-10-09T10:40:27.4995493+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_Race_ConcurrentInputsAndCancel","Output":"--- PASS: TestExecDelay_Race_ConcurrentInputsAndCancel (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.4995493+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_Race_ConcurrentInputsAndCancel","Elapsed":0} +{"Time":"2026-10-09T10:40:27.4995493+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_RefiredOnSameInstance_Direct"} +{"Time":"2026-10-09T10:40:27.4995493+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_RefiredOnSameInstance_Direct","Output":"=== RUN TestExec_OnStart_RefiredOnSameInstance_Direct\n"} +{"Time":"2026-10-09T10:40:27.5045326+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_RefiredOnSameInstance_Direct","Output":"--- PASS: TestExec_OnStart_RefiredOnSameInstance_Direct (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.5045326+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_RefiredOnSameInstance_Direct","Elapsed":0} +{"Time":"2026-10-09T10:40:27.5045326+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_RePush_AfterCancel_NewInstanceDefaults"} +{"Time":"2026-10-09T10:40:27.5045326+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_RePush_AfterCancel_NewInstanceDefaults","Output":"=== RUN TestExec_RePush_AfterCancel_NewInstanceDefaults\n"} +{"Time":"2026-10-09T10:40:27.5423212+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_RePush_AfterCancel_NewInstanceDefaults","Output":"--- PASS: TestExec_RePush_AfterCancel_NewInstanceDefaults (0.04s)\n"} +{"Time":"2026-10-09T10:40:27.5423212+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_RePush_AfterCancel_NewInstanceDefaults","Elapsed":0.04} +{"Time":"2026-10-09T10:40:27.5423212+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_FiresAtDeadline_FakeClock"} +{"Time":"2026-10-09T10:40:27.5423212+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_FiresAtDeadline_FakeClock","Output":"=== RUN TestExecDelay_FiresAtDeadline_FakeClock\n"} +{"Time":"2026-10-09T10:40:27.5723426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_FiresAtDeadline_FakeClock","Output":"--- PASS: TestExecDelay_FiresAtDeadline_FakeClock (0.03s)\n"} +{"Time":"2026-10-09T10:40:27.5723426+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_FiresAtDeadline_FakeClock","Elapsed":0.03} +{"Time":"2026-10-09T10:40:27.5723426+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_InLoop_ParkIsFork"} +{"Time":"2026-10-09T10:40:27.5723426+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_InLoop_ParkIsFork","Output":"=== RUN TestExecDelay_InLoop_ParkIsFork\n"} +{"Time":"2026-10-09T10:40:27.5766581+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_InLoop_ParkIsFork","Output":"--- PASS: TestExecDelay_InLoop_ParkIsFork (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.5766581+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_InLoop_ParkIsFork","Elapsed":0} +{"Time":"2026-10-09T10:40:27.5766581+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_NegativeAndMinusZero_FireImmediately"} +{"Time":"2026-10-09T10:40:27.5766581+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_NegativeAndMinusZero_FireImmediately","Output":"=== RUN TestExecDelay_NegativeAndMinusZero_FireImmediately\n"} +{"Time":"2026-10-09T10:40:27.5792609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_NegativeAndMinusZero_FireImmediately","Output":"--- PASS: TestExecDelay_NegativeAndMinusZero_FireImmediately (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.5792609+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecDelay_NegativeAndMinusZero_FireImmediately","Elapsed":0} +{"Time":"2026-10-09T10:40:27.5792609+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_TestSessionOpen"} +{"Time":"2026-10-09T10:40:27.5792609+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_TestSessionOpen","Output":"=== RUN TestExec_OnStart_TestSessionOpen\n"} +{"Time":"2026-10-09T10:40:27.5819174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_TestSessionOpen","Output":"--- PASS: TestExec_OnStart_TestSessionOpen (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.5819174+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_TestSessionOpen","Elapsed":0} +{"Time":"2026-10-09T10:40:27.5819174+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_ActivationAndRePush"} +{"Time":"2026-10-09T10:40:27.5819174+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_ActivationAndRePush","Output":"=== RUN TestExec_OnStart_ActivationAndRePush\n"} +{"Time":"2026-10-09T10:40:27.6137048+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_ActivationAndRePush","Output":"--- PASS: TestExec_OnStart_ActivationAndRePush (0.03s)\n"} +{"Time":"2026-10-09T10:40:27.6137048+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnStart_ActivationAndRePush","Elapsed":0.03} +{"Time":"2026-10-09T10:40:27.6137048+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnTick_DeltaSeconds"} +{"Time":"2026-10-09T10:40:27.6137048+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnTick_DeltaSeconds","Output":"=== RUN TestExec_OnTick_DeltaSeconds\n"} +{"Time":"2026-10-09T10:40:27.6185159+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnTick_DeltaSeconds","Output":"--- PASS: TestExec_OnTick_DeltaSeconds (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.6185159+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnTick_DeltaSeconds","Elapsed":0} +{"Time":"2026-10-09T10:40:27.6185159+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_FiresPerWrite"} +{"Time":"2026-10-09T10:40:27.6185159+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_FiresPerWrite","Output":"=== RUN TestExec_OnEvent_FiresPerWrite\n"} +{"Time":"2026-10-09T10:40:27.6250007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_FiresPerWrite","Output":"--- PASS: TestExec_OnEvent_FiresPerWrite (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.6250007+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_OnEvent_FiresPerWrite","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.6250007+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidDelay_TimersPurgedStaleResumeCounted"} +{"Time":"2026-10-09T10:40:27.6250007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidDelay_TimersPurgedStaleResumeCounted","Output":"=== RUN TestExec_Cancellation_MidDelay_TimersPurgedStaleResumeCounted\n"} +{"Time":"2026-10-09T10:40:27.683139+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidDelay_TimersPurgedStaleResumeCounted","Output":"--- PASS: TestExec_Cancellation_MidDelay_TimersPurgedStaleResumeCounted (0.06s)\n"} +{"Time":"2026-10-09T10:40:27.683139+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidDelay_TimersPurgedStaleResumeCounted","Elapsed":0.06} +{"Time":"2026-10-09T10:40:27.683139+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidLoop"} +{"Time":"2026-10-09T10:40:27.683139+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidLoop","Output":"=== RUN TestExec_Cancellation_MidLoop\n"} +{"Time":"2026-10-09T10:40:27.7647869+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidLoop","Output":"--- PASS: TestExec_Cancellation_MidLoop (0.08s)\n"} +{"Time":"2026-10-09T10:40:27.7647869+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_MidLoop","Elapsed":0.08} +{"Time":"2026-10-09T10:40:27.7647869+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_SwitchAway"} +{"Time":"2026-10-09T10:40:27.7647869+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_SwitchAway","Output":"=== RUN TestExec_Cancellation_SwitchAway\n"} +{"Time":"2026-10-09T10:40:27.7715504+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_SwitchAway","Output":"--- PASS: TestExec_Cancellation_SwitchAway (0.01s)\n"} +{"Time":"2026-10-09T10:40:27.7715504+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_Cancellation_SwitchAway","Elapsed":0.01} +{"Time":"2026-10-09T10:40:27.7715504+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_ParkCap_ShedsNewParkOnly"} +{"Time":"2026-10-09T10:40:27.7715504+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_ParkCap_ShedsNewParkOnly","Output":"=== RUN TestExec_B8_ParkCap_ShedsNewParkOnly\n"} +{"Time":"2026-10-09T10:40:27.7764063+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_ParkCap_ShedsNewParkOnly","Output":"--- PASS: TestExec_B8_ParkCap_ShedsNewParkOnly (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.7764063+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_B8_ParkCap_ShedsNewParkOnly","Elapsed":0} +{"Time":"2026-10-09T10:40:27.7764063+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_C1_DuplicateWakeKeyCounted"} +{"Time":"2026-10-09T10:40:27.7764063+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_C1_DuplicateWakeKeyCounted","Output":"=== RUN TestExec_C1_DuplicateWakeKeyCounted\n"} +{"Time":"2026-10-09T10:40:27.7805835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_C1_DuplicateWakeKeyCounted","Output":"--- PASS: TestExec_C1_DuplicateWakeKeyCounted (0.00s)\n"} +{"Time":"2026-10-09T10:40:27.7805835+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExec_C1_DuplicateWakeKeyCounted","Elapsed":0} +{"Time":"2026-10-09T10:40:27.7805835+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_RealRowsProduceRealValue"} +{"Time":"2026-10-09T10:40:27.7805835+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_RealRowsProduceRealValue","Output":"=== RUN TestExpand_VarsInput_RuntimeEndToEnd_RealRowsProduceRealValue\n"} +{"Time":"2026-10-09T10:40:27.989858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_RealRowsProduceRealValue","Output":"--- PASS: TestExpand_VarsInput_RuntimeEndToEnd_RealRowsProduceRealValue (0.21s)\n"} +{"Time":"2026-10-09T10:40:27.989858+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_RealRowsProduceRealValue","Elapsed":0.21} +{"Time":"2026-10-09T10:40:27.989858+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_EmptyRows_NullNotPanic"} +{"Time":"2026-10-09T10:40:27.989858+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_EmptyRows_NullNotPanic","Output":"=== RUN TestExpand_VarsInput_RuntimeEndToEnd_EmptyRows_NullNotPanic\n"} +{"Time":"2026-10-09T10:40:28.1909926+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_EmptyRows_NullNotPanic","Output":"--- PASS: TestExpand_VarsInput_RuntimeEndToEnd_EmptyRows_NullNotPanic (0.20s)\n"} +{"Time":"2026-10-09T10:40:28.1909926+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_EmptyRows_NullNotPanic","Elapsed":0.2} +{"Time":"2026-10-09T10:40:28.1909926+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_TwoInstances_NoDataClobber"} +{"Time":"2026-10-09T10:40:28.1909926+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_TwoInstances_NoDataClobber","Output":"=== RUN TestExpand_VarsInput_RuntimeEndToEnd_TwoInstances_NoDataClobber\n"} +{"Time":"2026-10-09T10:40:28.2014145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_TwoInstances_NoDataClobber","Output":"--- PASS: TestExpand_VarsInput_RuntimeEndToEnd_TwoInstances_NoDataClobber (0.01s)\n"} +{"Time":"2026-10-09T10:40:28.2014145+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExpand_VarsInput_RuntimeEndToEnd_TwoInstances_NoDataClobber","Elapsed":0.01} +{"Time":"2026-10-09T10:40:28.2014145+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_ProdGraph_NamesResolve"} +{"Time":"2026-10-09T10:40:28.2014145+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_ProdGraph_NamesResolve","Output":"=== RUN TestNamedLeaderboard_ProdGraph_NamesResolve\n"} +{"Time":"2026-10-09T10:40:28.2108392+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_ProdGraph_NamesResolve","Output":" named_leaderboard_prodgraph_test.go:78: prod graph scene_version = sha256:3c335b1f3e9f00731be0f838273891f91872f29d4ea7d5586024c663f9716db5\n"} +{"Time":"2026-10-09T10:40:28.2157826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_ProdGraph_NamesResolve","Output":"--- PASS: TestNamedLeaderboard_ProdGraph_NamesResolve (0.01s)\n"} +{"Time":"2026-10-09T10:40:28.2157826+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_ProdGraph_NamesResolve","Elapsed":0.01} +{"Time":"2026-10-09T10:40:28.2157826+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_SlowTruth_NamesStillResolve"} +{"Time":"2026-10-09T10:40:28.2157826+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_SlowTruth_NamesStillResolve","Output":"=== RUN TestNamedLeaderboard_SlowTruth_NamesStillResolve\n"} +{"Time":"2026-10-09T10:40:28.2977347+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_SlowTruth_NamesStillResolve","Output":"--- PASS: TestNamedLeaderboard_SlowTruth_NamesStillResolve (0.08s)\n"} +{"Time":"2026-10-09T10:40:28.2977347+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_SlowTruth_NamesStillResolve","Elapsed":0.08} +{"Time":"2026-10-09T10:40:28.2977347+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_RePush_NamesStillResolve"} +{"Time":"2026-10-09T10:40:28.2977347+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_RePush_NamesStillResolve","Output":"=== RUN TestNamedLeaderboard_RePush_NamesStillResolve\n"} +{"Time":"2026-10-09T10:40:28.3105109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_RePush_NamesStillResolve","Output":"--- PASS: TestNamedLeaderboard_RePush_NamesStillResolve (0.01s)\n"} +{"Time":"2026-10-09T10:40:28.3105109+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_RePush_NamesStillResolve","Elapsed":0.01} +{"Time":"2026-10-09T10:40:28.3105109+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive"} +{"Time":"2026-10-09T10:40:28.3105109+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":"=== RUN TestNamedLeaderboard_StaticUnroll_RunsLive\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":" named_leaderboard_test.go:392: leaderboard_display =\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":" 1. GIDEON — 9\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":" 2. Teddy — 8\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":" 3. Loki — 7\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":" 4. Gumayusi — 6\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":" 5. Namgung — 4\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Output":"--- PASS: TestNamedLeaderboard_StaticUnroll_RunsLive (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNamedLeaderboard_StaticUnroll_RunsLive","Elapsed":0} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ShuffledEdgeOrderSelect"} +{"Time":"2026-10-09T10:40:28.314713+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ShuffledEdgeOrderSelect","Output":"=== RUN TestScene_NamedPorts_ShuffledEdgeOrderSelect\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ShuffledEdgeOrderSelect","Output":"--- PASS: TestScene_NamedPorts_ShuffledEdgeOrderSelect (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ShuffledEdgeOrderSelect","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_PositionalFallbackForLegacyArtefact"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_PositionalFallbackForLegacyArtefact","Output":"=== RUN TestScene_NamedPorts_PositionalFallbackForLegacyArtefact\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_PositionalFallbackForLegacyArtefact","Output":"--- PASS: TestScene_NamedPorts_PositionalFallbackForLegacyArtefact (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_PositionalFallbackForLegacyArtefact","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ArithmeticShuffledEdges"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ArithmeticShuffledEdges","Output":"=== RUN TestScene_NamedPorts_ArithmeticShuffledEdges\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ArithmeticShuffledEdges","Output":"--- PASS: TestScene_NamedPorts_ArithmeticShuffledEdges (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_ArithmeticShuffledEdges","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MixedScene"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MixedScene","Output":"=== RUN TestScene_NamedPorts_MixedScene\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MixedScene","Output":"--- PASS: TestScene_NamedPorts_MixedScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MixedScene","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_EmptyToPort"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_EmptyToPort","Output":"=== RUN TestScene_NamedPorts_EmptyToPort\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_EmptyToPort","Output":"--- PASS: TestScene_NamedPorts_EmptyToPort (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_EmptyToPort","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MissingUpstreamNotInState"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MissingUpstreamNotInState","Output":"=== RUN TestScene_NamedPorts_MissingUpstreamNotInState\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MissingUpstreamNotInState","Output":"--- PASS: TestScene_NamedPorts_MissingUpstreamNotInState (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_MissingUpstreamNotInState","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_DirtyCheckTriggersRecompute"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_DirtyCheckTriggersRecompute","Output":"=== RUN TestScene_NamedPorts_DirtyCheckTriggersRecompute\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_DirtyCheckTriggersRecompute","Output":"--- PASS: TestScene_NamedPorts_DirtyCheckTriggersRecompute (0.00s)\n"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_NamedPorts_DirtyCheckTriggersRecompute","Elapsed":0} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_CompileAndColdStartGate"} +{"Time":"2026-10-09T10:40:28.3152358+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_CompileAndColdStartGate","Output":"=== RUN TestPerf20k_CompileAndColdStartGate\n"} +{"Time":"2026-10-09T10:40:28.5591527+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_CompileAndColdStartGate","Output":" perf20k_test.go:160: compile: 20001 nodes in 230.1243ms (version sha256:119011db23be0a489d006bd5bf8c7cbfbca3f14356b639bd05fac36558675401)\n"} +{"Time":"2026-10-09T10:40:28.6018928+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_CompileAndColdStartGate","Output":" perf20k_test.go:166: cold-start (load + full evaluation, 20001 nodes): 42.7401ms\n"} +{"Time":"2026-10-09T10:40:28.602453+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_CompileAndColdStartGate","Output":"--- PASS: TestPerf20k_CompileAndColdStartGate (0.29s)\n"} +{"Time":"2026-10-09T10:40:28.602453+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_CompileAndColdStartGate","Elapsed":0.29} +{"Time":"2026-10-09T10:40:28.602453+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_SingleInputDeltaP95Gate"} +{"Time":"2026-10-09T10:40:28.602453+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_SingleInputDeltaP95Gate","Output":"=== RUN TestPerf20k_SingleInputDeltaP95Gate\n"} +{"Time":"2026-10-09T10:40:28.8278492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_SingleInputDeltaP95Gate","Output":" perf20k_test.go:192: compile: 20001 nodes in 208.31ms (version sha256:119011db23be0a489d006bd5bf8c7cbfbca3f14356b639bd05fac36558675401)\n"} +{"Time":"2026-10-09T10:40:29.2933711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_SingleInputDeltaP95Gate","Output":" perf20k_test.go:262: single-input→delta over 200 samples (cone 999 nodes): p50=2.0006ms p95=3.0262ms max=3.55ms\n"} +{"Time":"2026-10-09T10:40:29.2933711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_SingleInputDeltaP95Gate","Output":"--- PASS: TestPerf20k_SingleInputDeltaP95Gate (0.69s)\n"} +{"Time":"2026-10-09T10:40:29.2933711+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPerf20k_SingleInputDeltaP95Gate","Elapsed":0.69} +{"Time":"2026-10-09T10:40:29.2933711+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotEditablePatchIsAtomicAndSequenceChecked"} +{"Time":"2026-10-09T10:40:29.2933711+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotEditablePatchIsAtomicAndSequenceChecked","Output":"=== RUN TestPreviewSlotEditablePatchIsAtomicAndSequenceChecked\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotEditablePatchIsAtomicAndSequenceChecked","Output":"--- PASS: TestPreviewSlotEditablePatchIsAtomicAndSequenceChecked (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotEditablePatchIsAtomicAndSequenceChecked","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence","Output":"=== RUN TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence","Output":"--- PASS: TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene","Output":"=== RUN TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene","Output":"--- PASS: TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover","Output":"=== RUN TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover","Output":"--- PASS: TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotPromotesEditableCloneToGenerationWithoutTouchingPreview"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotPromotesEditableCloneToGenerationWithoutTouchingPreview","Output":"=== RUN TestPreviewSlotPromotesEditableCloneToGenerationWithoutTouchingPreview\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotPromotesEditableCloneToGenerationWithoutTouchingPreview","Output":"--- PASS: TestPreviewSlotPromotesEditableCloneToGenerationWithoutTouchingPreview (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotPromotesEditableCloneToGenerationWithoutTouchingPreview","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotServiceInputFansOutToPromotedGeneration"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotServiceInputFansOutToPromotedGeneration","Output":"=== RUN TestPreviewSlotServiceInputFansOutToPromotedGeneration\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotServiceInputFansOutToPromotedGeneration","Output":"--- PASS: TestPreviewSlotServiceInputFansOutToPromotedGeneration (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestPreviewSlotServiceInputFansOutToPromotedGeneration","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DiamondRecomputesOnceWithBothUpstreams"} +{"Time":"2026-10-09T10:40:29.2948996+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DiamondRecomputesOnceWithBothUpstreams","Output":"=== RUN TestScene_DiamondRecomputesOnceWithBothUpstreams\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DiamondRecomputesOnceWithBothUpstreams","Output":"--- PASS: TestScene_DiamondRecomputesOnceWithBothUpstreams (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DiamondRecomputesOnceWithBothUpstreams","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanOutAllConsumersRecompute"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanOutAllConsumersRecompute","Output":"=== RUN TestScene_FanOutAllConsumersRecompute\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanOutAllConsumersRecompute","Output":"--- PASS: TestScene_FanOutAllConsumersRecompute (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanOutAllConsumersRecompute","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiSinkPartialDirtyPreservesUntouchedSink"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiSinkPartialDirtyPreservesUntouchedSink","Output":"=== RUN TestScene_MultiSinkPartialDirtyPreservesUntouchedSink\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiSinkPartialDirtyPreservesUntouchedSink","Output":"--- PASS: TestScene_MultiSinkPartialDirtyPreservesUntouchedSink (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiSinkPartialDirtyPreservesUntouchedSink","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiWriteBatchLastValueWins"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiWriteBatchLastValueWins","Output":"=== RUN TestScene_MultiWriteBatchLastValueWins\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiWriteBatchLastValueWins","Output":"--- PASS: TestScene_MultiWriteBatchLastValueWins (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MultiWriteBatchLastValueWins","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DeepChain1000NodesValueReachesSink"} +{"Time":"2026-10-09T10:40:29.2954236+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DeepChain1000NodesValueReachesSink","Output":"=== RUN TestScene_DeepChain1000NodesValueReachesSink\n"} +{"Time":"2026-10-09T10:40:29.2975675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DeepChain1000NodesValueReachesSink","Output":"--- PASS: TestScene_DeepChain1000NodesValueReachesSink (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.2975675+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DeepChain1000NodesValueReachesSink","Elapsed":0} +{"Time":"2026-10-09T10:40:29.2975675+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_RefiresOnStartExactlyOnce"} +{"Time":"2026-10-09T10:40:29.2975675+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_RefiresOnStartExactlyOnce","Output":"=== RUN TestReactivation_RefiresOnStartExactlyOnce\n"} +{"Time":"2026-10-09T10:40:29.3044217+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_RefiresOnStartExactlyOnce","Output":"--- PASS: TestReactivation_RefiresOnStartExactlyOnce (0.01s)\n"} +{"Time":"2026-10-09T10:40:29.3044217+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_RefiresOnStartExactlyOnce","Elapsed":0.01} +{"Time":"2026-10-09T10:40:29.3044217+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_PreservesStateNoReseed"} +{"Time":"2026-10-09T10:40:29.3044217+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_PreservesStateNoReseed","Output":"=== RUN TestReactivation_PreservesStateNoReseed\n"} +{"Time":"2026-10-09T10:40:29.3117247+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_PreservesStateNoReseed","Output":"--- PASS: TestReactivation_PreservesStateNoReseed (0.01s)\n"} +{"Time":"2026-10-09T10:40:29.3117247+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_PreservesStateNoReseed","Elapsed":0.01} +{"Time":"2026-10-09T10:40:29.3117247+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_NoPhantomSceneChanged"} +{"Time":"2026-10-09T10:40:29.3117247+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_NoPhantomSceneChanged","Output":"=== RUN TestReactivation_NoPhantomSceneChanged\n"} +{"Time":"2026-10-09T10:40:29.6149347+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_NoPhantomSceneChanged","Output":"--- PASS: TestReactivation_NoPhantomSceneChanged (0.30s)\n"} +{"Time":"2026-10-09T10:40:29.6149347+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_NoPhantomSceneChanged","Elapsed":0.3} +{"Time":"2026-10-09T10:40:29.6149347+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_SwitchPathUntouched"} +{"Time":"2026-10-09T10:40:29.6149347+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_SwitchPathUntouched","Output":"=== RUN TestReactivation_SwitchPathUntouched\n"} +{"Time":"2026-10-09T10:40:29.6176361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_SwitchPathUntouched","Output":"--- PASS: TestReactivation_SwitchPathUntouched (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6176361+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_SwitchPathUntouched","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6176361+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_BootRefiresPersistedActive"} +{"Time":"2026-10-09T10:40:29.6176361+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_BootRefiresPersistedActive","Output":"=== RUN TestReactivation_BootRefiresPersistedActive\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_BootRefiresPersistedActive","Output":"--- PASS: TestReactivation_BootRefiresPersistedActive (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestReactivation_BootRefiresPersistedActive","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn","Output":"=== RUN TestNewSceneConsumersDeduplicateSmallAndWideFanIn\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/small"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/small","Output":"=== RUN TestNewSceneConsumersDeduplicateSmallAndWideFanIn/small\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/small","Output":"--- PASS: TestNewSceneConsumersDeduplicateSmallAndWideFanIn/small (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/small","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/wide"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/wide","Output":"=== RUN TestNewSceneConsumersDeduplicateSmallAndWideFanIn/wide\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/wide","Output":"--- PASS: TestNewSceneConsumersDeduplicateSmallAndWideFanIn/wide (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn/wide","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn","Output":"--- PASS: TestNewSceneConsumersDeduplicateSmallAndWideFanIn (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewSceneConsumersDeduplicateSmallAndWideFanIn","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback","Output":"=== RUN TestComputeEntryUsesNamedInputsWithLegacyFallback\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/named_inputs_are_authoritative"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/named_inputs_are_authoritative","Output":"=== RUN TestComputeEntryUsesNamedInputsWithLegacyFallback/named_inputs_are_authoritative\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/named_inputs_are_authoritative","Output":"--- PASS: TestComputeEntryUsesNamedInputsWithLegacyFallback/named_inputs_are_authoritative (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/named_inputs_are_authoritative","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/legacy_upstream_fallback"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/legacy_upstream_fallback","Output":"=== RUN TestComputeEntryUsesNamedInputsWithLegacyFallback/legacy_upstream_fallback\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/legacy_upstream_fallback","Output":"--- PASS: TestComputeEntryUsesNamedInputsWithLegacyFallback/legacy_upstream_fallback (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback/legacy_upstream_fallback","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback","Output":"--- PASS: TestComputeEntryUsesNamedInputsWithLegacyFallback (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestComputeEntryUsesNamedInputsWithLegacyFallback","Elapsed":0} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DormantGatedSceneSkipsRecompute"} +{"Time":"2026-10-09T10:40:29.6197445+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DormantGatedSceneSkipsRecompute","Output":"=== RUN TestScene_DormantGatedSceneSkipsRecompute\n"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DormantGatedSceneSkipsRecompute","Output":"--- PASS: TestScene_DormantGatedSceneSkipsRecompute (0.30s)\n"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_DormantGatedSceneSkipsRecompute","Elapsed":0.3} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_InputProducesDelta"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_InputProducesDelta","Output":"=== RUN TestScene_InputProducesDelta\n"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_InputProducesDelta","Output":"--- PASS: TestScene_InputProducesDelta (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_InputProducesDelta","Elapsed":0} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MirrorPanicDoesNotKillBespoke"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MirrorPanicDoesNotKillBespoke","Output":"=== RUN TestScene_MirrorPanicDoesNotKillBespoke\n"} +{"Time":"2026-10-09T10:40:29.9201049+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MirrorPanicDoesNotKillBespoke","Output":"--- PASS: TestScene_MirrorPanicDoesNotKillBespoke (0.00s)\n"} +{"Time":"2026-10-09T10:40:29.9208439+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_MirrorPanicDoesNotKillBespoke","Elapsed":0} +{"Time":"2026-10-09T10:40:29.9208439+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_BurstCoalescesIntoOneRecompute"} +{"Time":"2026-10-09T10:40:29.9208439+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_BurstCoalescesIntoOneRecompute","Output":"=== RUN TestScene_BurstCoalescesIntoOneRecompute\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_BurstCoalescesIntoOneRecompute","Output":"--- PASS: TestScene_BurstCoalescesIntoOneRecompute (0.25s)\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_BurstCoalescesIntoOneRecompute","Elapsed":0.25} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_IdempotentInputProducesZeroPatchEcho"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_IdempotentInputProducesZeroPatchEcho","Output":"=== RUN TestScene_IdempotentInputProducesZeroPatchEcho\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_IdempotentInputProducesZeroPatchEcho","Output":"--- PASS: TestScene_IdempotentInputProducesZeroPatchEcho (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_IdempotentInputProducesZeroPatchEcho","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_VersionedBlueprintGraphWritesLeaf"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_VersionedBlueprintGraphWritesLeaf","Output":"=== RUN TestScene_VersionedBlueprintGraphWritesLeaf\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_VersionedBlueprintGraphWritesLeaf","Output":"--- PASS: TestScene_VersionedBlueprintGraphWritesLeaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_VersionedBlueprintGraphWritesLeaf","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ColdStartComputesBlueprintLeaf"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ColdStartComputesBlueprintLeaf","Output":"=== RUN TestScene_ColdStartComputesBlueprintLeaf\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ColdStartComputesBlueprintLeaf","Output":"--- PASS: TestScene_ColdStartComputesBlueprintLeaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ColdStartComputesBlueprintLeaf","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged","Output":"=== RUN TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged","Output":"--- PASS: TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_SwitchMigratesLiveSubsAndEmitsSceneChanged","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ConcurrentCloseDuringFanoutNeverPanics"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ConcurrentCloseDuringFanoutNeverPanics","Output":"=== RUN TestScene_ConcurrentCloseDuringFanoutNeverPanics\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ConcurrentCloseDuringFanoutNeverPanics","Output":"--- PASS: TestScene_ConcurrentCloseDuringFanoutNeverPanics (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_ConcurrentCloseDuringFanoutNeverPanics","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanoutSaturationCollapsesToLatestSnapshotAndCounts"} +{"Time":"2026-10-09T10:40:30.1712492+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanoutSaturationCollapsesToLatestSnapshotAndCounts","Output":"=== RUN TestScene_FanoutSaturationCollapsesToLatestSnapshotAndCounts\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanoutSaturationCollapsesToLatestSnapshotAndCounts","Output":"--- PASS: TestScene_FanoutSaturationCollapsesToLatestSnapshotAndCounts (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestScene_FanoutSaturationCollapsesToLatestSnapshotAndCounts","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterBuiltFromIDsAndVersions"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterBuiltFromIDsAndVersions","Output":"=== RUN TestShow_RosterBuiltFromIDsAndVersions\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterBuiltFromIDsAndVersions","Output":"--- PASS: TestShow_RosterBuiltFromIDsAndVersions (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterBuiltFromIDsAndVersions","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterEmittedAtEachMutationPoint"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterEmittedAtEachMutationPoint","Output":"=== RUN TestShow_RosterEmittedAtEachMutationPoint\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterEmittedAtEachMutationPoint","Output":"--- PASS: TestShow_RosterEmittedAtEachMutationPoint (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_RosterEmittedAtEachMutationPoint","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_NilMirrorRosterNoOp"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_NilMirrorRosterNoOp","Output":"=== RUN TestShow_NilMirrorRosterNoOp\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_NilMirrorRosterNoOp","Output":"--- PASS: TestShow_NilMirrorRosterNoOp (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestShow_NilMirrorRosterNoOp","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_UnionActivePlusRules"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_UnionActivePlusRules","Output":"=== RUN TestRouteTargets_UnionActivePlusRules\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_UnionActivePlusRules","Output":"--- PASS: TestRouteTargets_UnionActivePlusRules (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_UnionActivePlusRules","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_RuleWithoutActiveScene"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_RuleWithoutActiveScene","Output":"=== RUN TestRouteTargets_RuleWithoutActiveScene\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_RuleWithoutActiveScene","Output":"--- PASS: TestRouteTargets_RuleWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_RuleWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_DisjointFromActive"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_DisjointFromActive","Output":"=== RUN TestRouteTargets_DisjointFromActive\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_DisjointFromActive","Output":"--- PASS: TestRouteTargets_DisjointFromActive (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRouteTargets_DisjointFromActive","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_FiresOnTickWithoutActiveScene"} +{"Time":"2026-10-09T10:40:30.1718359+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_FiresOnTickWithoutActiveScene","Output":"=== RUN TestStreamRule_FiresOnTickWithoutActiveScene\n"} +{"Time":"2026-10-09T10:40:30.1739271+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_FiresOnTickWithoutActiveScene","Output":"--- PASS: TestStreamRule_FiresOnTickWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1739271+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_FiresOnTickWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1739271+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_NotFrozenBySceneSwitch"} +{"Time":"2026-10-09T10:40:30.1739271+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_NotFrozenBySceneSwitch","Output":"=== RUN TestStreamRule_NotFrozenBySceneSwitch\n"} +{"Time":"2026-10-09T10:40:30.1808105+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_NotFrozenBySceneSwitch","Output":"--- PASS: TestStreamRule_NotFrozenBySceneSwitch (0.01s)\n"} +{"Time":"2026-10-09T10:40:30.1808105+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_NotFrozenBySceneSwitch","Elapsed":0.01} +{"Time":"2026-10-09T10:40:30.1808105+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_RosterSceneInertNoRecompute"} +{"Time":"2026-10-09T10:40:30.1808105+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_RosterSceneInertNoRecompute","Output":"=== RUN TestStreamRule_RosterSceneInertNoRecompute\n"} +{"Time":"2026-10-09T10:40:30.1835725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_RosterSceneInertNoRecompute","Output":"--- PASS: TestStreamRule_RosterSceneInertNoRecompute (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1835725+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStreamRule_RosterSceneInertNoRecompute","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1835725+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_WallBudgetExceededFails"} +{"Time":"2026-10-09T10:40:30.1835725+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_WallBudgetExceededFails","Output":"=== RUN TestHarness_WallBudgetExceededFails\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_WallBudgetExceededFails","Output":"--- PASS: TestHarness_WallBudgetExceededFails (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_WallBudgetExceededFails","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_ZeroFallsBackToDefault"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_ZeroFallsBackToDefault","Output":"=== RUN TestValidationBudgetFrom_ZeroFallsBackToDefault\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_ZeroFallsBackToDefault","Output":"--- PASS: TestValidationBudgetFrom_ZeroFallsBackToDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_ZeroFallsBackToDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_PositiveOverridesDefault"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_PositiveOverridesDefault","Output":"=== RUN TestValidationBudgetFrom_PositiveOverridesDefault\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_PositiveOverridesDefault","Output":"--- PASS: TestValidationBudgetFrom_PositiveOverridesDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestValidationBudgetFrom_PositiveOverridesDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewHarness_ZeroBudgetFallsBackToDefault"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewHarness_ZeroBudgetFallsBackToDefault","Output":"=== RUN TestNewHarness_ZeroBudgetFallsBackToDefault\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewHarness_ZeroBudgetFallsBackToDefault","Output":"--- PASS: TestNewHarness_ZeroBudgetFallsBackToDefault (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestNewHarness_ZeroBudgetFallsBackToDefault","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_ZeroDisablesStepCheck"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_ZeroDisablesStepCheck","Output":"=== RUN TestStepBudgetExceeded_ZeroDisablesStepCheck\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_ZeroDisablesStepCheck","Output":"--- PASS: TestStepBudgetExceeded_ZeroDisablesStepCheck (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_ZeroDisablesStepCheck","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_PositiveBudgetFires"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_PositiveBudgetFires","Output":"=== RUN TestStepBudgetExceeded_PositiveBudgetFires\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_PositiveBudgetFires","Output":"--- PASS: TestStepBudgetExceeded_PositiveBudgetFires (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestStepBudgetExceeded_PositiveBudgetFires","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredWorldEffectFails"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredWorldEffectFails","Output":"=== RUN TestB10Guard_UndeclaredWorldEffectFails\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredWorldEffectFails","Output":"--- PASS: TestB10Guard_UndeclaredWorldEffectFails (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredWorldEffectFails","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredSyntheticResultReturnsFalse"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredSyntheticResultReturnsFalse","Output":"=== RUN TestB10Guard_UndeclaredSyntheticResultReturnsFalse\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredSyntheticResultReturnsFalse","Output":"--- PASS: TestB10Guard_UndeclaredSyntheticResultReturnsFalse (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestB10Guard_UndeclaredSyntheticResultReturnsFalse","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSeedValidationLeaf_NoopOutsideValidationMode"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSeedValidationLeaf_NoopOutsideValidationMode","Output":"=== RUN TestSeedValidationLeaf_NoopOutsideValidationMode\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSeedValidationLeaf_NoopOutsideValidationMode","Output":"--- PASS: TestSeedValidationLeaf_NoopOutsideValidationMode (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSeedValidationLeaf_NoopOutsideValidationMode","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_MultipleBlueprintsOneFailsScene"} +{"Time":"2026-10-09T10:40:30.1846503+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_MultipleBlueprintsOneFailsScene","Output":"=== RUN TestHarness_MultipleBlueprintsOneFailsScene\n"} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_MultipleBlueprintsOneFailsScene","Output":"--- PASS: TestHarness_MultipleBlueprintsOneFailsScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_MultipleBlueprintsOneFailsScene","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_DecodeErrorNamesIndex"} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_DecodeErrorNamesIndex","Output":"=== RUN TestExecProgramsFromGraph_DecodeErrorNamesIndex\n"} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_DecodeErrorNamesIndex","Output":"--- PASS: TestExecProgramsFromGraph_DecodeErrorNamesIndex (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_DecodeErrorNamesIndex","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ReportCarriesBudgetDimensions"} +{"Time":"2026-10-09T10:40:30.1857612+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ReportCarriesBudgetDimensions","Output":"=== RUN TestHarness_ReportCarriesBudgetDimensions\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ReportCarriesBudgetDimensions","Output":"--- PASS: TestHarness_ReportCarriesBudgetDimensions (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ReportCarriesBudgetDimensions","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_UnknownEntrypoint"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_UnknownEntrypoint","Output":"=== RUN TestRunValidationEntrypoint_UnknownEntrypoint\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_UnknownEntrypoint","Output":"--- PASS: TestRunValidationEntrypoint_UnknownEntrypoint (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_UnknownEntrypoint","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_NoExecProgram"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_NoExecProgram","Output":"=== RUN TestRunValidationEntrypoint_NoExecProgram\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_NoExecProgram","Output":"--- PASS: TestRunValidationEntrypoint_NoExecProgram (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestRunValidationEntrypoint_NoExecProgram","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PassOnTerminatingLogic"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PassOnTerminatingLogic","Output":"=== RUN TestHarness_PassOnTerminatingLogic\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PassOnTerminatingLogic","Output":"--- PASS: TestHarness_PassOnTerminatingLogic (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PassOnTerminatingLogic","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_DivergentWhileFailsValidation"} +{"Time":"2026-10-09T10:40:30.1862852+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_DivergentWhileFailsValidation","Output":"=== RUN TestHarness_DivergentWhileFailsValidation\n"} +{"Time":"2026-10-09T10:40:30.1889269+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_DivergentWhileFailsValidation","Output":"--- PASS: TestHarness_DivergentWhileFailsValidation (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1889269+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_DivergentWhileFailsValidation","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1889269+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OneFailingEntrypointFailsScene"} +{"Time":"2026-10-09T10:40:30.1889269+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OneFailingEntrypointFailsScene","Output":"=== RUN TestHarness_OneFailingEntrypointFailsScene\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OneFailingEntrypointFailsScene","Output":"--- PASS: TestHarness_OneFailingEntrypointFailsScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OneFailingEntrypointFailsScene","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PureSceneValidatesTrivially"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PureSceneValidatesTrivially","Output":"=== RUN TestHarness_PureSceneValidatesTrivially\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PureSceneValidatesTrivially","Output":"--- PASS: TestHarness_PureSceneValidatesTrivially (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_PureSceneValidatesTrivially","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationModeNoEffect"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationModeNoEffect","Output":"=== RUN TestHarness_ValidationModeNoEffect\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationModeNoEffect","Output":"--- PASS: TestHarness_ValidationModeNoEffect (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationModeNoEffect","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationEffectRunsNoClosure"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationEffectRunsNoClosure","Output":"=== RUN TestHarness_ValidationEffectRunsNoClosure\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationEffectRunsNoClosure","Output":"--- PASS: TestHarness_ValidationEffectRunsNoClosure (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_ValidationEffectRunsNoClosure","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_B10GuardEnumeratesRegistry"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_B10GuardEnumeratesRegistry","Output":"=== RUN TestHarness_B10GuardEnumeratesRegistry\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_B10GuardEnumeratesRegistry","Output":"--- PASS: TestHarness_B10GuardEnumeratesRegistry (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_B10GuardEnumeratesRegistry","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OnTickFiresNFrames"} +{"Time":"2026-10-09T10:40:30.1920429+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OnTickFiresNFrames","Output":"=== RUN TestHarness_OnTickFiresNFrames\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OnTickFiresNFrames","Output":"--- PASS: TestHarness_OnTickFiresNFrames (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestHarness_OnTickFiresNFrames","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_Roundtrip"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_Roundtrip","Output":"=== RUN TestExecProgramsFromGraph_Roundtrip\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_Roundtrip","Output":"--- PASS: TestExecProgramsFromGraph_Roundtrip (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestExecProgramsFromGraph_Roundtrip","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_TopicRuleFiresMatchedEventAndOnStart"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_TopicRuleFiresMatchedEventAndOnStart","Output":"=== RUN TestSimulate_TopicRuleFiresMatchedEventAndOnStart\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_TopicRuleFiresMatchedEventAndOnStart","Output":"--- PASS: TestSimulate_TopicRuleFiresMatchedEventAndOnStart (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_TopicRuleFiresMatchedEventAndOnStart","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_NonMatchingTopicFiresOnlyOnStart"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_NonMatchingTopicFiresOnlyOnStart","Output":"=== RUN TestSimulate_NonMatchingTopicFiresOnlyOnStart\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_NonMatchingTopicFiresOnlyOnStart","Output":"--- PASS: TestSimulate_NonMatchingTopicFiresOnlyOnStart (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_NonMatchingTopicFiresOnlyOnStart","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_PayloadSeedsMatchedEventLeaf"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_PayloadSeedsMatchedEventLeaf","Output":"=== RUN TestSimulate_PayloadSeedsMatchedEventLeaf\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_PayloadSeedsMatchedEventLeaf","Output":"--- PASS: TestSimulate_PayloadSeedsMatchedEventLeaf (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_PayloadSeedsMatchedEventLeaf","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_AllowListOverridesTopicRule"} +{"Time":"2026-10-09T10:40:30.1925626+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_AllowListOverridesTopicRule","Output":"=== RUN TestSimulate_AllowListOverridesTopicRule\n"} +{"Time":"2026-10-09T10:40:30.1930795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_AllowListOverridesTopicRule","Output":"--- PASS: TestSimulate_AllowListOverridesTopicRule (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1930795+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_AllowListOverridesTopicRule","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1930795+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_DivergentSelectedEntryFailsUnderBudget"} +{"Time":"2026-10-09T10:40:30.1930795+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_DivergentSelectedEntryFailsUnderBudget","Output":"=== RUN TestSimulate_DivergentSelectedEntryFailsUnderBudget\n"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_DivergentSelectedEntryFailsUnderBudget","Output":"--- PASS: TestSimulate_DivergentSelectedEntryFailsUnderBudget (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_DivergentSelectedEntryFailsUnderBudget","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_ZeroEffectIsolation"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_ZeroEffectIsolation","Output":"=== RUN TestSimulate_ZeroEffectIsolation\n"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_ZeroEffectIsolation","Output":"--- PASS: TestSimulate_ZeroEffectIsolation (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_ZeroEffectIsolation","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_FullPathThroughHarness"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_FullPathThroughHarness","Output":"=== RUN TestSimulate_FullPathThroughHarness\n"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_FullPathThroughHarness","Output":"--- PASS: TestSimulate_FullPathThroughHarness (0.00s)\n"} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Test":"TestSimulate_FullPathThroughHarness","Elapsed":0} +{"Time":"2026-10-09T10:40:30.1946951+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:30.2073671+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/runtime\t5.940s\n"} +{"Time":"2026-10-09T10:40:30.2292693+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/runtime","Elapsed":5.962} +{"Time":"2026-10-09T10:40:30.7889425+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol"} +{"Time":"2026-10-09T10:40:31.1648007+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestOverlayChild"} +{"Time":"2026-10-09T10:40:31.1648007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestOverlayChild","Output":"=== RUN TestOverlayChild\n"} +{"Time":"2026-10-09T10:40:31.1648007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestOverlayChild","Output":"--- PASS: TestOverlayChild (0.00s)\n"} +{"Time":"2026-10-09T10:40:31.1648007+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestOverlayChild","Elapsed":0} +{"Time":"2026-10-09T10:40:31.1648007+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess"} +{"Time":"2026-10-09T10:40:31.1648007+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess","Output":"=== RUN TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess\n"} +{"Time":"2026-10-09T10:40:31.6510659+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess","Output":"--- PASS: TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess (0.49s)\n"} +{"Time":"2026-10-09T10:40:31.6510659+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess","Elapsed":0.49} +{"Time":"2026-10-09T10:40:31.6510659+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption"} +{"Time":"2026-10-09T10:40:31.6510659+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption","Output":"=== RUN TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption\n"} +{"Time":"2026-10-09T10:40:31.678335+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption","Output":"--- PASS: TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption (0.03s)\n"} +{"Time":"2026-10-09T10:40:31.6788719+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Test":"TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption","Elapsed":0.03} +{"Time":"2026-10-09T10:40:31.6788719+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:31.6845278+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/streamcontrol\t0.896s\n"} +{"Time":"2026-10-09T10:40:31.8070231+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/streamcontrol","Elapsed":1.018} +{"Time":"2026-10-09T10:40:32.7434786+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/workload"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresClientCert"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresClientCert","Output":"=== RUN TestNewClient_RequiresClientCert\n"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresClientCert","Output":"--- PASS: TestNewClient_RequiresClientCert (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresClientCert","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresIdentity"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresIdentity","Output":"=== RUN TestNewClient_RequiresIdentity\n"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresIdentity","Output":"--- PASS: TestNewClient_RequiresIdentity (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestNewClient_RequiresIdentity","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_PostsTicketAndVerbatimIntent"} +{"Time":"2026-10-09T10:40:33.6121544+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_PostsTicketAndVerbatimIntent","Output":"=== RUN TestMintDelegation_PostsTicketAndVerbatimIntent\n"} +{"Time":"2026-10-09T10:40:33.6148441+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_PostsTicketAndVerbatimIntent","Output":"--- PASS: TestMintDelegation_PostsTicketAndVerbatimIntent (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6148441+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_PostsTicketAndVerbatimIntent","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6153702+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_GateDetailEnvelope"} +{"Time":"2026-10-09T10:40:33.6153702+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_GateDetailEnvelope","Output":"=== RUN TestMintDelegation_KnownCode_GateDetailEnvelope\n"} +{"Time":"2026-10-09T10:40:33.6164256+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_GateDetailEnvelope","Output":"--- PASS: TestMintDelegation_KnownCode_GateDetailEnvelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6164256+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_GateDetailEnvelope","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6164256+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_LegacyErrorEnvelope"} +{"Time":"2026-10-09T10:40:33.6164256+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_LegacyErrorEnvelope","Output":"=== RUN TestMintDelegation_KnownCode_LegacyErrorEnvelope\n"} +{"Time":"2026-10-09T10:40:33.6169507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_LegacyErrorEnvelope","Output":"--- PASS: TestMintDelegation_KnownCode_LegacyErrorEnvelope (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6169507+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_KnownCode_LegacyErrorEnvelope","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6169507+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_UnknownCodeFailsClosed"} +{"Time":"2026-10-09T10:40:33.6169507+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_UnknownCodeFailsClosed","Output":"=== RUN TestMintDelegation_UnknownCodeFailsClosed\n"} +{"Time":"2026-10-09T10:40:33.6174905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_UnknownCodeFailsClosed","Output":"--- PASS: TestMintDelegation_UnknownCodeFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6174905+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestMintDelegation_UnknownCodeFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6174905+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_PostsDelegationProxyRequestVerbatim"} +{"Time":"2026-10-09T10:40:33.6174905+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_PostsDelegationProxyRequestVerbatim","Output":"=== RUN TestFetchCanvas_PostsDelegationProxyRequestVerbatim\n"} +{"Time":"2026-10-09T10:40:33.6185615+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_PostsDelegationProxyRequestVerbatim","Output":"--- PASS: TestFetchCanvas_PostsDelegationProxyRequestVerbatim (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6185615+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_PostsDelegationProxyRequestVerbatim","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6185615+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_NeverRetriedOnPending"} +{"Time":"2026-10-09T10:40:33.6185615+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_NeverRetriedOnPending","Output":"=== RUN TestFetchCanvas_NeverRetriedOnPending\n"} +{"Time":"2026-10-09T10:40:33.619121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_NeverRetriedOnPending","Output":"--- PASS: TestFetchCanvas_NeverRetriedOnPending (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.619121+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_NeverRetriedOnPending","Elapsed":0} +{"Time":"2026-10-09T10:40:33.619121+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_UnexpectedSuccessStatusFailsClosed"} +{"Time":"2026-10-09T10:40:33.619121+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_UnexpectedSuccessStatusFailsClosed","Output":"=== RUN TestFetchCanvas_UnexpectedSuccessStatusFailsClosed\n"} +{"Time":"2026-10-09T10:40:33.6202715+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_UnexpectedSuccessStatusFailsClosed","Output":"--- PASS: TestFetchCanvas_UnexpectedSuccessStatusFailsClosed (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6202715+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_UnexpectedSuccessStatusFailsClosed","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6202715+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_RequiresMintedDelegationFields"} +{"Time":"2026-10-09T10:40:33.6202715+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_RequiresMintedDelegationFields","Output":"=== RUN TestFetchCanvas_RequiresMintedDelegationFields\n"} +{"Time":"2026-10-09T10:40:33.620814+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_RequiresMintedDelegationFields","Output":"--- PASS: TestFetchCanvas_RequiresMintedDelegationFields (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.620814+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFetchCanvas_RequiresMintedDelegationFields","Elapsed":0} +{"Time":"2026-10-09T10:40:33.620814+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestReconcile_Success"} +{"Time":"2026-10-09T10:40:33.620814+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestReconcile_Success","Output":"=== RUN TestReconcile_Success\n"} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestReconcile_Success","Output":"--- PASS: TestReconcile_Success (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestReconcile_Success","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFingerprintCert"} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFingerprintCert","Output":"=== RUN TestFingerprintCert\n"} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFingerprintCert","Output":"--- PASS: TestFingerprintCert (0.00s)\n"} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Test":"TestFingerprintCert","Elapsed":0} +{"Time":"2026-10-09T10:40:33.6225396+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:33.6256299+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/workload","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/workload\t0.882s\n"} +{"Time":"2026-10-09T10:40:33.6406932+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/workload","Elapsed":0.897} +{"Time":"2026-10-09T10:40:35.178123+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/internal/ws"} +{"Time":"2026-10-09T10:40:36.3295486+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_HandshakeAccepted"} +{"Time":"2026-10-09T10:40:36.3295486+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_HandshakeAccepted","Output":"=== RUN TestWS_EmbeddedLocal_HandshakeAccepted\n"} +{"Time":"2026-10-09T10:40:36.3752205+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_HandshakeAccepted","Output":"--- PASS: TestWS_EmbeddedLocal_HandshakeAccepted (0.05s)\n"} +{"Time":"2026-10-09T10:40:36.3752205+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_HandshakeAccepted","Elapsed":0.05} +{"Time":"2026-10-09T10:40:36.3752205+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_WrongSecretRejected"} +{"Time":"2026-10-09T10:40:36.3752205+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_WrongSecretRejected","Output":"=== RUN TestWS_EmbeddedLocal_WrongSecretRejected\n"} +{"Time":"2026-10-09T10:40:36.3762729+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_WrongSecretRejected","Output":"2026/10/09 10:40:36 WARN unauthenticated prism=\"map[code:AUTH_REQUIRED context:map[requestId:08409609-cead-46ae-94d2-c415f449917f] details:map[] domain:service message:unauthenticated requestId:08409609-cead-46ae-94d2-c415f449917f schemaVersion:1 severity:warning source:orion.ws]\"\n"} +{"Time":"2026-10-09T10:40:36.3767945+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_WrongSecretRejected","Output":"--- PASS: TestWS_EmbeddedLocal_WrongSecretRejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3767945+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_EmbeddedLocal_WrongSecretRejected","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3767945+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_PreservedWithLocalSource"} +{"Time":"2026-10-09T10:40:36.3767945+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_PreservedWithLocalSource","Output":"=== RUN TestWS_AntenneHeaderTrust_PreservedWithLocalSource\n"} +{"Time":"2026-10-09T10:40:36.3778322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_PreservedWithLocalSource","Output":"--- PASS: TestWS_AntenneHeaderTrust_PreservedWithLocalSource (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3778322+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_PreservedWithLocalSource","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3778322+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_NoHeaderRejected"} +{"Time":"2026-10-09T10:40:36.3778322+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_NoHeaderRejected","Output":"=== RUN TestWS_AntenneHeaderTrust_NoHeaderRejected\n"} +{"Time":"2026-10-09T10:40:36.378874+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_NoHeaderRejected","Output":"2026/10/09 10:40:36 WARN unauthenticated prism=\"map[code:AUTH_REQUIRED context:map[requestId:4702be4f-baba-479f-8262-21b84d190c48] details:map[] domain:service message:unauthenticated requestId:4702be4f-baba-479f-8262-21b84d190c48 schemaVersion:1 severity:warning source:orion.ws]\"\n"} +{"Time":"2026-10-09T10:40:36.378874+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_NoHeaderRejected","Output":"--- PASS: TestWS_AntenneHeaderTrust_NoHeaderRejected (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.378874+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_AntenneHeaderTrust_NoHeaderRejected","Elapsed":0} +{"Time":"2026-10-09T10:40:36.378874+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_PlatformScope_TwitchDeltaYoutubeForbidden"} +{"Time":"2026-10-09T10:40:36.378874+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_PlatformScope_TwitchDeltaYoutubeForbidden","Output":"=== RUN TestWS_PlatformScope_TwitchDeltaYoutubeForbidden\n"} +{"Time":"2026-10-09T10:40:36.3821702+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_PlatformScope_TwitchDeltaYoutubeForbidden","Output":"--- PASS: TestWS_PlatformScope_TwitchDeltaYoutubeForbidden (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3821702+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_PlatformScope_TwitchDeltaYoutubeForbidden","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3821702+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_OperatorEndToEnd"} +{"Time":"2026-10-09T10:40:36.3821702+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_OperatorEndToEnd","Output":"=== RUN TestWS_OperatorEndToEnd\n"} +{"Time":"2026-10-09T10:40:36.3837452+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_OperatorEndToEnd","Output":"--- PASS: TestWS_OperatorEndToEnd (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3837452+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_OperatorEndToEnd","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3837452+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_LiveRejectsTestNamespace"} +{"Time":"2026-10-09T10:40:36.3837452+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_LiveRejectsTestNamespace","Output":"=== RUN TestWS_LiveRejectsTestNamespace\n"} +{"Time":"2026-10-09T10:40:36.3848535+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_LiveRejectsTestNamespace","Output":"--- PASS: TestWS_LiveRejectsTestNamespace (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3848535+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_LiveRejectsTestNamespace","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3848535+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerCannotInput"} +{"Time":"2026-10-09T10:40:36.3848535+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerCannotInput","Output":"=== RUN TestWS_ViewerCannotInput\n"} +{"Time":"2026-10-09T10:40:36.3859056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerCannotInput","Output":"--- PASS: TestWS_ViewerCannotInput (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3859056+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerCannotInput","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3859056+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_RejectsUnauthenticatedUpgrade"} +{"Time":"2026-10-09T10:40:36.3859056+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_RejectsUnauthenticatedUpgrade","Output":"=== RUN TestWS_RejectsUnauthenticatedUpgrade\n"} +{"Time":"2026-10-09T10:40:36.3864658+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_RejectsUnauthenticatedUpgrade","Output":"2026/10/09 10:40:36 WARN unauthenticated prism=\"map[code:AUTH_REQUIRED context:map[requestId:0169fa09-65d7-4f89-ab41-6743f4f5cf45] details:map[] domain:service message:unauthenticated requestId:0169fa09-65d7-4f89-ab41-6743f4f5cf45 schemaVersion:1 severity:warning source:orion.ws]\"\n"} +{"Time":"2026-10-09T10:40:36.3870044+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_RejectsUnauthenticatedUpgrade","Output":"--- PASS: TestWS_RejectsUnauthenticatedUpgrade (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3870044+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_RejectsUnauthenticatedUpgrade","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3870044+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceTokenWritesScopedPaths"} +{"Time":"2026-10-09T10:40:36.3870044+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceTokenWritesScopedPaths","Output":"=== RUN TestWS_ServiceTokenWritesScopedPaths\n"} +{"Time":"2026-10-09T10:40:36.3891669+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceTokenWritesScopedPaths","Output":"--- PASS: TestWS_ServiceTokenWritesScopedPaths (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.3891669+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceTokenWritesScopedPaths","Elapsed":0} +{"Time":"2026-10-09T10:40:36.3891669+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterConnectsWithoutActiveScene"} +{"Time":"2026-10-09T10:40:36.3891669+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterConnectsWithoutActiveScene","Output":"=== RUN TestWS_ServiceWriterConnectsWithoutActiveScene\n"} +{"Time":"2026-10-09T10:40:36.5407162+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterConnectsWithoutActiveScene","Output":"--- PASS: TestWS_ServiceWriterConnectsWithoutActiveScene (0.15s)\n"} +{"Time":"2026-10-09T10:40:36.5407162+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterConnectsWithoutActiveScene","Elapsed":0.15} +{"Time":"2026-10-09T10:40:36.5407162+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerRejectedWithoutActiveScene"} +{"Time":"2026-10-09T10:40:36.5407162+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerRejectedWithoutActiveScene","Output":"=== RUN TestWS_ViewerRejectedWithoutActiveScene\n"} +{"Time":"2026-10-09T10:40:36.5428949+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerRejectedWithoutActiveScene","Output":"--- PASS: TestWS_ViewerRejectedWithoutActiveScene (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.5428949+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ViewerRejectedWithoutActiveScene","Elapsed":0} +{"Time":"2026-10-09T10:40:36.5428949+02:00","Action":"run","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterMigratedOnActivate"} +{"Time":"2026-10-09T10:40:36.5428949+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterMigratedOnActivate","Output":"=== RUN TestWS_ServiceWriterMigratedOnActivate\n"} +{"Time":"2026-10-09T10:40:36.5444912+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterMigratedOnActivate","Output":"--- PASS: TestWS_ServiceWriterMigratedOnActivate (0.00s)\n"} +{"Time":"2026-10-09T10:40:36.5444912+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Test":"TestWS_ServiceWriterMigratedOnActivate","Elapsed":0} +{"Time":"2026-10-09T10:40:36.5444912+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Output":"PASS\n"} +{"Time":"2026-10-09T10:40:36.5486899+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/internal/ws","Output":"ok \tgithub.com/ZabLaboratory/Orion/internal/ws\t1.371s\n"} +{"Time":"2026-10-09T10:40:36.5597892+02:00","Action":"pass","Package":"github.com/ZabLaboratory/Orion/internal/ws","Elapsed":1.3820000000000001} +{"Time":"2026-10-09T10:40:36.5627292+02:00","Action":"start","Package":"github.com/ZabLaboratory/Orion/third_party/lsdpnative"} +{"Time":"2026-10-09T10:40:36.5627292+02:00","Action":"output","Package":"github.com/ZabLaboratory/Orion/third_party/lsdpnative","Output":"? \tgithub.com/ZabLaboratory/Orion/third_party/lsdpnative\t[no test files]\n"} +{"Time":"2026-10-09T10:40:36.5627292+02:00","Action":"skip","Package":"github.com/ZabLaboratory/Orion/third_party/lsdpnative","Elapsed":0} diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T090000Z-audit-checkpoint.json b/evidence/local-20261009-capability-audit/eleven/20261009T090000Z-audit-checkpoint.json new file mode 100644 index 00000000..f88fa7ee --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T090000Z-audit-checkpoint.json @@ -0,0 +1,19 @@ +{ + "owner": "Eleven", + "mandate": "Audit, sans ADR, sans agent, sans Computer Use. Aucun correctif produit dans cet incrément.", + "path": "D:/Documents/Zab/Orion/.worktrees/eleven-local-20261009-capability-audit", + "branch": "eleven/local-20261009-capability-audit", + "HEAD": "7f13e85f487e2bbfbcac304d29ecf36276197b0e", + "files": [ + "?? .cache/", + "?? evidence/local-20261009-capability-audit/" + ], + "validation": { + "passedTestsAndSubtests": 1829, + "packages": 22, + "failed": 0, + "race": "non exécuté" + }, + "remaining": "Correctifs non implémentés. Preuves et copies sources conservées dans les worktrees attribués, sans intégration Git. Préserver les sessions actives et ces preuves non intégrées.", + "aggregate": "D:\\Documents\\Zab\\Prism\\.worktrees\\eleven-local-20261009-capability-audit\\evidence\\local-20261009-capability-audit\\eleven\\20261009T090000Z-audit-report.json" +} \ No newline at end of file diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T090100Z-source-manifest.json b/evidence/local-20261009-capability-audit/eleven/20261009T090100Z-source-manifest.json new file mode 100644 index 00000000..5bd79328 --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T090100Z-source-manifest.json @@ -0,0 +1,1794 @@ +{ + "source": "D:/Documents/Zab/Orion/.worktrees/eleven-local-20261009-capability-audit/.cache/source", + "at": "2026-10-09T09:01:44.369Z", + "files": [ + { + "path": "internal/adapters/events_dataflow_compile_e2e_test.go", + "sha256": "566a25fae1add3bae978bcbb40aa200346f666fab0a2c73d05861e88a3b1b234" + }, + { + "path": "internal/adapters/helpers_test.go", + "sha256": "b9a0453f3fe95efcbc49ad768fc3a0f294a2bf08fc9e0b9e91f5b4c568a59b6e" + }, + { + "path": "internal/adapters/inbox.go", + "sha256": "2237eab87bf191aca9196f4877467ac0ecfd1cbcd7b10b2f9fc20b98e6141bcc" + }, + { + "path": "internal/adapters/inbox_platform_probe_test.go", + "sha256": "e06af91c46999ad49e0460516a43265aa7ddda15a11570c9466322b0cc588513" + }, + { + "path": "internal/adapters/inbox_platform_test.go", + "sha256": "a6ea382a7b17f8a0b7bc12aee023874fd6ac336e39dfaa267d2f05159f166f7b" + }, + { + "path": "internal/adapters/inbox_show_emit_test.go", + "sha256": "661691aa7c6c67d014e5f6fbeb01b5d12acabe746002a89b53d46cbd80924e84" + }, + { + "path": "internal/adapters/inbox_stream_rule_test.go", + "sha256": "14da7cdd2f6fab142ece84ec955cd38b648d94fcfe5874b0619a8312542168f5" + }, + { + "path": "internal/adapters/inbox_system_probe_test.go", + "sha256": "dd1fcf1aa66f904f424bf2bfd9ac9a87ebdf5e99c0c18b594ff41716d7c929c8" + }, + { + "path": "internal/adapters/inbox_system_test.go", + "sha256": "8ca114b131de337f2d03b4b8bddf3c3e6e8d01073e0e249beba44e5fa7d7b1d1" + }, + { + "path": "internal/adapters/inbox_test.go", + "sha256": "5ab6e791b85cf3c9fbaa1169344e73c1822c3ef52a58aec6f2df484b7e4a9381" + }, + { + "path": "internal/adapters/poller_test.go", + "sha256": "9ddb0c2488af988a67c724b6687a7f044c2b7e77fffd3b4ec1394580105464bf" + }, + { + "path": "internal/adapters/stateless_platform_sink_test.go", + "sha256": "23ed8d3a7f36c5680e890ee936b3fdd560b6ea80e7c6bbb84905139dd7d5d6d0" + }, + { + "path": "internal/api/auth_seam_test.go", + "sha256": "a008bf91d45d1612b2549026a6d55c4c396e7d726a53091856522fefe84aee02" + }, + { + "path": "internal/api/camera_slots.go", + "sha256": "b1113d659e17c2bf335b07aec8dfe6e328f10a42bca71fca282889715058d2c5" + }, + { + "path": "internal/api/camera_slots_test.go", + "sha256": "8d93ccd99774464f2a4e3672b5ab2459dd380f6752cabe51e2ecda19a95534d9" + }, + { + "path": "internal/api/cockpit.go", + "sha256": "552756e620972ba6d3860a4d5e52a1352055c62d297cfde29a084db00dcae38d" + }, + { + "path": "internal/api/cockpit_source_test.go", + "sha256": "af7559626bc9dc6ac52f02b84d440673821f67c77164d272d8f0ab60f2d78a63" + }, + { + "path": "internal/api/cockpit_test.go", + "sha256": "8c2563b50fea8099de7ad5c3e58313f1f499e2be06d883e6bf43b91cb10a9626" + }, + { + "path": "internal/api/db_catalog.go", + "sha256": "ed88cdafc8ca20419db728b5375777e88bb293f1333c2879dc52f5cc5d8155fd" + }, + { + "path": "internal/api/db_catalog_test.go", + "sha256": "09e3ee062092cf167584c9bea7dd1d8cef1a70a4fa47e54df35e82b32ed79f24" + }, + { + "path": "internal/api/editable_native_delivery_test.go", + "sha256": "ffd45e2d95453a4b6715de6c183905d95b3f53360445d35bc7131576a37540a8" + }, + { + "path": "internal/api/editable_preview.go", + "sha256": "ed9dc090c61d2949872cc30ff0fa0188efe89dcfba530f8f2bd2c0c19a4574a9" + }, + { + "path": "internal/api/editable_preview_compile_test.go", + "sha256": "b1f2636d87b5644b77e80fa7b96a9a4692141d5e717c20659a825beeaa2a26cd" + }, + { + "path": "internal/api/editable_preview_source.go", + "sha256": "519262524d20b5c01ef541c52b4e1f66125c5e2be753d57e8cc18cc5afa3fd93" + }, + { + "path": "internal/api/editable_preview_source_test.go", + "sha256": "4658f171b47b75136743741abb1da5b6fc745e4242650dbe5de12a21c3da2ba1" + }, + { + "path": "internal/api/editable_preview_test.go", + "sha256": "7e1f81beb2b4c9a5eeebcc748da8482a78554d84f2e6ede569becdefbf24ffb5" + }, + { + "path": "internal/api/engine_b_fixture_test.go", + "sha256": "1b2226ba778898e32653932278fa4297ccb230362c1dff1808bc5f0c1c2002be" + }, + { + "path": "internal/api/exec_completion.go", + "sha256": "7976ee6c0aaeaf84c35394f74111245978100b1da7327643a9d3ecef47f3dfc2" + }, + { + "path": "internal/api/exec_completion_probe_test.go", + "sha256": "bc4bea9efcccf0bb90287165d3d91647f3ee7e16160ed90aeb8146a3d2add858" + }, + { + "path": "internal/api/exec_completion_test.go", + "sha256": "309c17b058918e640c052d2f8a5192dba6515133ab43627a4204e4e94fa3fb23" + }, + { + "path": "internal/api/host_surface.go", + "sha256": "ff7712dd35eed27f2d7ca6afc86c8cd4ca1591cef38acb64bcf658f644573d01" + }, + { + "path": "internal/api/host_surface_test.go", + "sha256": "6493b8e0f351f4833c13cc3737727ad8694343a222f9dd36be6a77c35ab27a13" + }, + { + "path": "internal/api/lsml_get.go", + "sha256": "ba1f0bcf2a2538cac4b1a9de3f18eec0143163a9545120f0a4d3be2a370bf108" + }, + { + "path": "internal/api/lsml_get_test.go", + "sha256": "975d2b78599d57963d63ac80d04c98685e5a73760059b09b8d0aaa0a31dd926a" + }, + { + "path": "internal/api/native_delivery.go", + "sha256": "c66cba64be1c046315b074f394050ebc1bd1de9589d0190adee07c5b59d4795f" + }, + { + "path": "internal/api/native_delivery_test.go", + "sha256": "2b80a6bffb9bf894c056881cce6c16c2fdfb211c2579b5af85598400e448ec6b" + }, + { + "path": "internal/api/native_operator_visual_test.go", + "sha256": "a1bf7d7dba163cf28540544d413d0c95e4487e51abfd41bca3d33493d1c024c7" + }, + { + "path": "internal/api/native_reception_proof_test.go", + "sha256": "b2411ead4f7da626a41c45b4ea1830f980ac9fdd0a2a30d4dc74b9454dcac859" + }, + { + "path": "internal/api/native_reception_ready_test.go", + "sha256": "c69d6124f9e37daa2a3dc5ee94196fd279db3d6b6f68d78330e12675f6e14cf3" + }, + { + "path": "internal/api/native_scene_presentation.go", + "sha256": "fba979cd7a1fe93a18288df0119a210525b4a4324fa57a8630fc91715a616683" + }, + { + "path": "internal/api/native_scene_presentation_test.go", + "sha256": "038554308a93c462ff941093ad6f0bd20d3c1e49552adfbab94bbabdc4256f9f" + }, + { + "path": "internal/api/native_session_test.go", + "sha256": "c58640c928b72af1bca0af16e1dbb33dc401cf879665d10961c556e787eeead4" + }, + { + "path": "internal/api/operator.go", + "sha256": "98036a010037fb03274c21528dca0719caa72ef6ebbe22f7f656974e2892803b" + }, + { + "path": "internal/api/operator_authz_test.go", + "sha256": "42a29ae73ee8e94cb72298a51096623f427709435e609963c03f5f0b34a94dde" + }, + { + "path": "internal/api/operator_dual_slot_isolation_test.go", + "sha256": "aaef0911e29254949fb5ddc8bc2766ab4f727b1ec1d22be5e2b3972603d5c0e9" + }, + { + "path": "internal/api/operator_execution.go", + "sha256": "d2a96d8f28c0f8e994206c48f8c7320b06d7a92542a3df5e0feb6f4f09caa027" + }, + { + "path": "internal/api/operator_execution_test.go", + "sha256": "0dce3d15777c410adca5705d76e7bb2cb9d864d2c4cfa9e8acd1ef9a20631e64" + }, + { + "path": "internal/api/operator_preview_engine_b_test.go", + "sha256": "64c292980b9d87a6d89bfaf1580e0f43e654e072181cd926fd5ee7e24e3a0304" + }, + { + "path": "internal/api/operator_route_keying_test.go", + "sha256": "787a08a12ef1e05ca368c99d207fd465d5562b8430a52fc354de3acf8953b05f" + }, + { + "path": "internal/api/operator_target_unknown_test.go", + "sha256": "c2da3fb1e99aac149f72eb70748f39917ee4a72dafa095012a0bb922615bf365" + }, + { + "path": "internal/api/operator_test.go", + "sha256": "dd0f44f5fd43b38f45c94142ee61de633b8967faa3f2a947e51b594cf69c8c7d" + }, + { + "path": "internal/api/public.go", + "sha256": "09cc90b203fd1ac59c7df8a444d869c88bc6935f9e677dcec441595b33b32f1e" + }, + { + "path": "internal/api/render_bundle_validate.go", + "sha256": "26ffe334d47a79065747c45067d8f56cd9b10c8268de8f95d070a90a7327d204" + }, + { + "path": "internal/api/runtime_descriptor.go", + "sha256": "c3834d0fd4ac74b846c31898e4773fb78eb0f66b70bc1e06329a783dcbaceaa9" + }, + { + "path": "internal/api/runtime_descriptor_test.go", + "sha256": "f31522918cfb76c003ee3bdd8aefc79459428b7a2c7d0368075045129731bda9" + }, + { + "path": "internal/api/scenes_get.go", + "sha256": "5e775a6b42ccd88fe8324aab27e165f3b5e21d71ca4a664fabbbac6151dae20b" + }, + { + "path": "internal/api/scenes_get_test.go", + "sha256": "211c45381944122cf80fcc65d4b26fd716279f4776875fcf1fd3e74194ee6063" + }, + { + "path": "internal/api/scene_blue_manifest.go", + "sha256": "b71a47524a246bb604777177aa64acae0e9cf8df6bee839f3bed48a3c0092d0a" + }, + { + "path": "internal/api/scene_catalog.go", + "sha256": "3b567101e0f8de07057178d7a198019a176dc8b57fd04561fe3ca8a4bf220ec2" + }, + { + "path": "internal/api/scene_catalog_test.go", + "sha256": "36f94103a53f73c1ab306f6ffa4d0d4f04c702f03c85c29060bf33f4d87d5a2a" + }, + { + "path": "internal/api/scene_control.go", + "sha256": "f643ce41ff90715b26572901495ff94e7663526df72365ce1cc40ad9e88a283f" + }, + { + "path": "internal/api/scene_control_native_test.go", + "sha256": "c40ff2415bf7e52b2952f810023bf8d17801168a37bcf65672bd318e3b18f7ff" + }, + { + "path": "internal/api/scene_intent.go", + "sha256": "945e3e1413ebbc46ace5a09a153483dd0a43a8016128b230b37467108ef14b33" + }, + { + "path": "internal/api/scene_intent_artifacts.go", + "sha256": "3fb5216b328df3821c6467ac4b44d5a03d887fc7eddfefe0f0fb50b52e85c6a4" + }, + { + "path": "internal/api/scene_intent_bridge.go", + "sha256": "0f7a6bdd45a7aa5aedaa06cff6589831cf9294a095945fae0fe6c5701ef943a8" + }, + { + "path": "internal/api/scene_intent_bundle_test.go", + "sha256": "19a280473d5b88da00e08ee245021d87d633508fcff7b5d696b7f0c9bb519904" + }, + { + "path": "internal/api/scene_intent_concurrency_test.go", + "sha256": "f2d817b14915c1a7e6750e24a04a61fa203e3dae1cb44a3187774d37fb4cf705" + }, + { + "path": "internal/api/scene_intent_current_render.go", + "sha256": "8b53fb333933f5cd36d84bbf3e457e014f4821f1314b64c88100c953aac3d1e1" + }, + { + "path": "internal/api/scene_intent_databound_benchmark_test.go", + "sha256": "0cfe9f1558e79ae3963fb671b61e4723b740c093f4e2d4701260e768eef35bec" + }, + { + "path": "internal/api/scene_intent_databound_test.go", + "sha256": "d43dfdb27ffc393df03995c9e0e03766d3a9db83e9e4c058943672240115ca59" + }, + { + "path": "internal/api/scene_intent_idempotency.go", + "sha256": "cb821ce0b4e5c832bb226faf4cc87337848f9fec7f36268b68135c08d0f17350" + }, + { + "path": "internal/api/scene_intent_identity_test.go", + "sha256": "00319166fcb276674ed6f1dab0157beeef42b2a7ed118e5df21e76919f3257a5" + }, + { + "path": "internal/api/scene_intent_local.go", + "sha256": "8f7a7b24ebc93062d645a104b57057d8b9b09018bf63f6ad71dcce53933eaafa" + }, + { + "path": "internal/api/scene_intent_local_test.go", + "sha256": "5545da952c3f65bb5fceb3919295b690f587ab3bb0ee5faa437db9497d1099f0" + }, + { + "path": "internal/api/scene_intent_noblue_test.go", + "sha256": "a342063099385256fabbe970ca65a0a2dc330738c9ee0db38f5d548355456198" + }, + { + "path": "internal/api/scene_intent_providers_test.go", + "sha256": "ba2314e0c840623b47624ed72b44d1c65c0777eecc56075c35e6aa18401f606d" + }, + { + "path": "internal/api/scene_intent_source.go", + "sha256": "9fddf431c3719613756411146fe458b4e6d83c924705034380917596ae306937" + }, + { + "path": "internal/api/scene_intent_source_test.go", + "sha256": "6166821333e54837776bf574b822292644901413df9b6c8e7b2d33bd99f9ced3" + }, + { + "path": "internal/api/scene_intent_static_test.go", + "sha256": "1de9fedfa74b106fb14b61cfc2d122c9b1c1bd3ab883842201980c2b44312573" + }, + { + "path": "internal/api/scene_intent_status.go", + "sha256": "e0148a10a06a4a9e3e6dcb7ba8534b9834f340db115253e1e029aeab2e892ec4" + }, + { + "path": "internal/api/scene_intent_test.go", + "sha256": "88a8a7bf51370c1dfe66f94385b1dd06bdf4318743265a86f08b4a3fa5ef4dc6" + }, + { + "path": "internal/api/scene_intent_verification_cache.go", + "sha256": "783abd4dc0493d94e53da7c8387ba4c239efb5649200d19181e62f1daf12601c" + }, + { + "path": "internal/api/scene_presentation.go", + "sha256": "05f68249b7afb8f2aacb9352459ff3d764c6fdf3b58ed8e4a83f583b4dde80a3" + }, + { + "path": "internal/api/scene_presentation_test.go", + "sha256": "f5b387bf8bc1f080698e7f3455cde2d103227aafc31f796e5ffe49b67253a888" + }, + { + "path": "internal/api/show.go", + "sha256": "a0b3ec6faf127285df3859eb8a95637c436af56a6f1e99b13e21286a341c2a9a" + }, + { + "path": "internal/api/state_snapshot.go", + "sha256": "810f1f7d939686d8c83681f259984a2e5169bde6a24fc5f56360ebc5faeeb62b" + }, + { + "path": "internal/api/state_snapshot_test.go", + "sha256": "ee27fc073fcbdfe8a875447379fac1f3b185465e67b3f9a20167f7268ffe27bf" + }, + { + "path": "internal/api/static.go", + "sha256": "cdf3384a3d264c7ab4db8924ff90b6537afc477f2a987c3e08102a1ac2853d40" + }, + { + "path": "internal/api/stream_rules.go", + "sha256": "59d557227e94acc46883d8aa2658f1be5e459484654dc804fc23259026d55e5b" + }, + { + "path": "internal/api/stream_rules_test.go", + "sha256": "b7c57651044fd4f1dfc7ebe7335a3760356ff211df6906f2c1a5a8d5411b388b" + }, + { + "path": "internal/api/testdata/orion_181_chat_overlay_program.json", + "sha256": "fc5cd671729f44bbe09ad278d93a8cc0ac0add9c275c541df2aa6b16f4a3b97a" + }, + { + "path": "internal/api/testdata/scene-lec-lck.program.json", + "sha256": "9754a0b16acbaa5f061e9b45189b9a21443deb97ed37449d277b339f77a2b7b3" + }, + { + "path": "internal/api/util.go", + "sha256": "5a7b5c7f02798fcebd1ff236df69860cdbb4ec15b616254bd5631d6b9276c07d" + }, + { + "path": "internal/api/validate_program.go", + "sha256": "a512bd9acdd1d0057393f01b864594514892dec6df60fd289296e091b7e145b7" + }, + { + "path": "internal/api/validate_program_test.go", + "sha256": "bad33285b357acb7ab46f9773780fc959ae8c6924f30e6b29eccd69d0c9c6ce2" + }, + { + "path": "internal/api/validate_simulate.go", + "sha256": "da31d768e6f07a1bcdbd787121948f4853a65fe0fb3d11c360ad306a2f7055da" + }, + { + "path": "internal/api/validate_simulate_test.go", + "sha256": "0562917433c4d128f2ed3376c5b516d0cd24a4bb47605689d82d245f29760d80" + }, + { + "path": "internal/attestation/verify.go", + "sha256": "22ee1d62ee71d6471e79522844363af307bf1b1d63fbc05d86e7c6d39f0d1347" + }, + { + "path": "internal/attestation/verify_test.go", + "sha256": "e92542ac22afade46a3481890412635a93fa3581c1c0581d3a5ed728f35f2f2b" + }, + { + "path": "internal/auth/auth_source_test.go", + "sha256": "31c8b9e0fa8968d25ed9c3c37a6d5924ef81e75775c9f4a66c50bc4f5743996d" + }, + { + "path": "internal/auth/identity.go", + "sha256": "d204d500da2c7e8bcfc61717ba6b58021fdb743f405035e1199e71bb4699b1a5" + }, + { + "path": "internal/auth/identity_platform_probe_test.go", + "sha256": "2b36b95a005457c08c4132e09d053c1ca375613ea0be3d705a5d417faf206131" + }, + { + "path": "internal/auth/identity_test.go", + "sha256": "b4660b657cbe6cde9ba301a585181134505e7a032a2bbdfc8e5bcb1ef8693751" + }, + { + "path": "internal/auth/local_operator.go", + "sha256": "6ef64d40da7e8a491d03e5661d4ee5893e6cf651a1e65aedc807c635c8cbb6dc" + }, + { + "path": "internal/auth/local_operator_test.go", + "sha256": "0a2e29e06f5a458c1a5c9db4d63bd8b035bb3566371dd6f15fa784c51bc91c20" + }, + { + "path": "internal/auth/local_service_token_store_test.go", + "sha256": "c4388b148ad0d434d2a4e8dfa847b921e901925bde7243bfd678c84b2474d8ed" + }, + { + "path": "internal/auth/probe_test.go", + "sha256": "636f8a9f048af2721f0e5c2243f3ba0742c7dc368f6169324dabf7b298fdbcbf" + }, + { + "path": "internal/auth/service_token_manager.go", + "sha256": "5bb50a9e52319a55c64111921584a4f767941d8fda46922b3f763ea6de9657be" + }, + { + "path": "internal/auth/service_token_manager_test.go", + "sha256": "60e304bd95c96c312c5155eea0c8091c42dde7de243d7a51325df733cdf1f090" + }, + { + "path": "internal/bluehost/effects.go", + "sha256": "5b9880454db9e16fe3da93d0055abcd90e63a066d029ccca1be240d336ca8713" + }, + { + "path": "internal/bluehost/effects_preview_db_test.go", + "sha256": "56aaaecbde641ecb2544ea7def7748355448186bbb8470e4603301fa43291caa" + }, + { + "path": "internal/bluehost/effects_preview_read_test.go", + "sha256": "c65331b5c70ff23c0043b80f5c97e2b418e02e275d52bd69fbee503f4e55139e" + }, + { + "path": "internal/bluehost/effects_service_parity_test.go", + "sha256": "e7313a819273b7fa687fdc8f75fab40648bd13f2d875a449db60e29084c210ba" + }, + { + "path": "internal/bluehost/effects_test.go", + "sha256": "e6876dbdaa7b199970038f914f21db7d7efd5fdd04f8d68f8de14163dae80291" + }, + { + "path": "internal/bluehost/effect_animation.go", + "sha256": "aa28607a06f5cfbb78275788c107b38b99066591372213ac591cdb1d21a30cd6" + }, + { + "path": "internal/bluehost/effect_assign_slot_test.go", + "sha256": "717df583e5e13a1a202933ff774b711fd76e986b6d382b09ba4ea00b59394cea" + }, + { + "path": "internal/bluehost/effect_http.go", + "sha256": "d046e850be5c2a92f7b10b00a3aa49aa8d08efd49c6b2f48fdf508309633d987" + }, + { + "path": "internal/bluehost/effect_http_gate_position_test.go", + "sha256": "c43267bd0180cdb7e62f2b844e3b17ca433c74bfb3e0e51f633f5d7104ea17d4" + }, + { + "path": "internal/bluehost/effect_http_integration_test.go", + "sha256": "d594e98eaa337c4fde9511697f9bfa774fd9d2a6548d11bb7b62f5fed829b235" + }, + { + "path": "internal/bluehost/effect_local.go", + "sha256": "d45f075708fa76a9be8223a2564beeefdde1bb3b6de35e67ae581035ec9faa58" + }, + { + "path": "internal/bluehost/effect_overlay.go", + "sha256": "d15d91a08d60c836036193d0a4b37f58ccf822cdf54ccc3eb7d7ebb9de68b14c" + }, + { + "path": "internal/bluehost/effect_overlay_test.go", + "sha256": "864ccce16be97c4d2171fff51af448b06fb8699119ecf41960578436d1be9fc3" + }, + { + "path": "internal/bluehost/event_router.go", + "sha256": "c8d1b848c10cee37e5117ac9d7636f491c79baaab9bf4db36e452269dcbc016b" + }, + { + "path": "internal/bluehost/host.go", + "sha256": "1f692203b77e069acc8388428f705ea5e51c64ac75396b3e09714a224209aa0c" + }, + { + "path": "internal/bluehost/host_entrypoints_test.go", + "sha256": "e05ba6b721b918dde73fe9ada2d9d1ffec408dfd16c3f738b609a7e21dc581a5" + }, + { + "path": "internal/bluehost/host_static_test.go", + "sha256": "d70ded60b49fb8a2ba680c3a832dfbfd18c606e21482ea97701c11512f1eb6f8" + }, + { + "path": "internal/bluehost/host_test.go", + "sha256": "4abdccc94687cbbe7728ab4466639a69738ac7a683cc3b8f171286c35a804e15" + }, + { + "path": "internal/bluehost/http_transport.go", + "sha256": "11b3b1f056a025aa6dec28a1c9fe633ea679b8821cff7b883f736887ed22b03d" + }, + { + "path": "internal/bluehost/http_transport_test.go", + "sha256": "1acef749c92f952f5158fe90f2edbe0114257809e995c207d8f1e51b21617d41" + }, + { + "path": "internal/bluehost/marker_process_test.go", + "sha256": "99d72d1a729c9102b334a89b1a6050c8479e064da25ad5ab2aecd336e08b18ec" + }, + { + "path": "internal/bluehost/outputs.go", + "sha256": "03d185788e18a81a13b537d81e6abbc652e4d2f0e271d5c98038bde4cd1d1a27" + }, + { + "path": "internal/bluehost/outputs_test.go", + "sha256": "26c30362b1da2509a392f329abab6a6b027bd508622b606b91b72d8c1837f5d5" + }, + { + "path": "internal/bluehost/program_metadata.go", + "sha256": "810739a3dd57556ecba6dc54e48149d15077221ba222f88932fd9163885db2cb" + }, + { + "path": "internal/bluehost/projection_test.go", + "sha256": "b55df2dd287f5cb05c98d0ae2a954ed06ecd597bf65a6f99265c88adf62016a0" + }, + { + "path": "internal/bluehost/replacement.go", + "sha256": "25d1c7b01bb6e0e2c07dd18144a14e787154c49ce2a11623e1144798324b837a" + }, + { + "path": "internal/bluehost/replacement_test.go", + "sha256": "935ac0f67a32767263231e28f6d251620669b5c61064b568b3c97f8a076f2ad1" + }, + { + "path": "internal/bluehost/rule_plane.go", + "sha256": "a450892ef75d33a6fa233837ed3572e7e19a7a644c319a33fb0c63580dee6768" + }, + { + "path": "internal/bluehost/rule_plane_test.go", + "sha256": "c38e4497d6e1c086474fd741d5d2398d9e46543ea49245c666a25ae09dd19f54" + }, + { + "path": "internal/bluehost/rule_store_test.go", + "sha256": "e7a7da95b48eafe30c31cde9bdcc2aa98af0052a9aeb947498dcf67b1438212e" + }, + { + "path": "internal/bluehost/rule_topics_test.go", + "sha256": "a74ca7dc1a0d0dfb120490764dc73dbbc657e7742658ba19ac5f5903a8705cba" + }, + { + "path": "internal/bluehost/scene_commit.go", + "sha256": "290750226b87349b7809b6d95aa543cb65e9aa6e3d7af05f453e6402acab777d" + }, + { + "path": "internal/bluehost/scene_interface.go", + "sha256": "f064e099eb7bcb425488d152e730fd700affc890168dbb29c0f6d06455262ffe" + }, + { + "path": "internal/bluehost/scene_interface_test.go", + "sha256": "2e365678555986166bb362558217ec01653835ad874126543fdea622650abbc7" + }, + { + "path": "internal/bluehost/show_emit.go", + "sha256": "b7189cd2df9905c0da21f1d078d96e3eb71ff991f5ac14661019c71a4a874a04" + }, + { + "path": "internal/bluehost/show_emit_test.go", + "sha256": "09b49027550de2e8570dc625d870f2f595cbdeeae55f827db4f75168647817e4" + }, + { + "path": "internal/bluehost/surface_test.go", + "sha256": "66128e3b93a5d5a0511dbba1e868b5478061ca23c35e0718222dbc723d6fc5a8" + }, + { + "path": "internal/bluehost/validate.go", + "sha256": "107aa5b98411be26091fb29e233aa20dc31ccc6fbf5d1ae61b99acc03e03c262" + }, + { + "path": "internal/bluehost/validate_budget_test.go", + "sha256": "250d9c892b66a42e4aba1e5a5f9c555da3dfda7132e431939b4bc159c04fff38" + }, + { + "path": "internal/bluehost/validate_effects_test.go", + "sha256": "0020eaecb9205ea8be29897d6cc5612ff286ec71a550744d9c160b9b3fc12cd6" + }, + { + "path": "internal/bluehost/validate_test.go", + "sha256": "10f0038c9ac9d905dc24ae33a87f30cc7db9e8d9e165c4bb22940543f6f0d42c" + }, + { + "path": "internal/blueproject/project.go", + "sha256": "3746630ebff83bcd8b1be1af8b454b24692c2cd0bad5c888dc64246dc16dce2b" + }, + { + "path": "internal/blueproject/project_test.go", + "sha256": "899d234714107cc1b69f950c064610a237c864f9b3b8670047b8070c9ffc7c6e" + }, + { + "path": "internal/bluespike/spike_test.go", + "sha256": "f3d62d3c0468249bc75fb0b97d9cd9c1c75b3ed7c220057ebd4f60a2084c780f" + }, + { + "path": "internal/bluespike/testdata/01-minimal.program.json", + "sha256": "cc4491390a81b7de1a278d8a56cae167b5bc78e523f1391665a157dad2f655e1" + }, + { + "path": "internal/bluespike/testdata/02-http-requires.program.json", + "sha256": "48cfdd602a27de7535faf9bfdf2390a3d5cc88348c7a39068885ff8cc380b770" + }, + { + "path": "internal/bluespike/testdata/03-overlay-app-stream-rule.program.json", + "sha256": "4b2c5427826de37ae51471a2fc9849ddd688471e028f94d1fd10cb5d59ebd6a3" + }, + { + "path": "internal/bluewire/bridge.go", + "sha256": "74769c4fd9a5bf0921c432b8c6eeeb65e297e8b9c5747d65ab19e15cda37c236" + }, + { + "path": "internal/bluewire/bridge_test.go", + "sha256": "2681f22217b52f031e35dae356fc8656cf3b854a7a15540e80c5ee8179d12bab" + }, + { + "path": "internal/bluewire/registry.go", + "sha256": "d205ceedea6f4d220c6f0018b4fe4dabd8dc3cd475fdc89969ca15f614a95739" + }, + { + "path": "internal/bluewire/registry_test.go", + "sha256": "a480f194250967ceb3bf38e9ae3cf2b50aae123d047494f73275a2c01e72c94e" + }, + { + "path": "internal/buildinfo/buildinfo.go", + "sha256": "692f45385706ba9d29a68c0a9cc14f31f0d63af82772e33e4e6b4b3038186409" + }, + { + "path": "internal/canonical/canonical.go", + "sha256": "907296f37b8d513b42225aa3f8180ed344a69cfb26ef49c4e63dc94de17a5521" + }, + { + "path": "internal/compiler/authoring_gate.go", + "sha256": "11aba58fae79ed763d4e69b3c35f2a752e723d6029f3f71d1b8495724a8e7972" + }, + { + "path": "internal/compiler/authoring_gate_test.go", + "sha256": "48400de378276af943a07c6d3c95d24f73b762477179a0add5266629941d33f6" + }, + { + "path": "internal/compiler/blueprints.go", + "sha256": "b629217003665155ef7a8635d56f71d54fda2e7a76096b51de1f25314bd25f7f" + }, + { + "path": "internal/compiler/bundled_fetcher.go", + "sha256": "049cbf95a2a97d720cf853c047a83cc77eb20b9ad328ac45a0be7911142ca64f" + }, + { + "path": "internal/compiler/bundled_fetcher_contract_test.go", + "sha256": "a7b91b9d5b9008a78fcff725d1fab9e983440313e8be7e35a109e8df000d4024" + }, + { + "path": "internal/compiler/bundled_fetcher_test.go", + "sha256": "64dc632ed297f75fbae63c766898acf453d228bb6159cf3508db04569efc6230" + }, + { + "path": "internal/compiler/compile.go", + "sha256": "c33b9846f7aedff760c7f86ce1dcadf52810d25f3f26ec141813b6e01d5b32f5" + }, + { + "path": "internal/compiler/compile_blueprint.go", + "sha256": "4f850eb0ba94baf716e98f64d7dbf912be85d2c8db8720231012a60e4f712942" + }, + { + "path": "internal/compiler/compile_blueprint_rule.go", + "sha256": "d0691d54f6ee2996d9ec6231dac4bfc2ad9bcc55063efdc620b2effeb9c8ccc1" + }, + { + "path": "internal/compiler/compile_blueprint_rule_test.go", + "sha256": "9163a3f05e7ef7390ff2cbb73f8311d62eae0bdd662fda5b12494dcf3b3b316b" + }, + { + "path": "internal/compiler/compile_exec_inbody.go", + "sha256": "a3450138af40b5fe5701f19fe2edc96e3c89c95e37342aeb76125e3ee18171aa" + }, + { + "path": "internal/compiler/compile_exec_inbody_test.go", + "sha256": "2708f3b1bab16447c49c8cf5e7604af48b1b993e3ac6a71377e20a246e96d902" + }, + { + "path": "internal/compiler/compile_graph_helpers.go", + "sha256": "04de776ed435170e07c7ac7282ee66ac202c6ede46e5eedee69f93ae2b81b320" + }, + { + "path": "internal/compiler/compile_multiblueprint_test.go", + "sha256": "a4847c9a244bd638de0907bb24733497f1af9144aa53a92de6f7ae9189638531" + }, + { + "path": "internal/compiler/compile_platform_bindings.go", + "sha256": "9724849fa79ad1a8212309292ff48efc341e43bb17573adc4e61d7759b6fdadc" + }, + { + "path": "internal/compiler/compile_platform_probe_test.go", + "sha256": "4c306183e96f0bac6593cfe2a690ed6a205171b3f146d6e645dabdb360522ae9" + }, + { + "path": "internal/compiler/compile_platform_test.go", + "sha256": "90afcc8ae444f3347548074362de7db11c36f4d67ca8505c9329c96aea65df6b" + }, + { + "path": "internal/compiler/compile_test.go", + "sha256": "7924d36a516c38b256a87ea9f77b7918d60a22f8ec37ecdfee68d8183db93568" + }, + { + "path": "internal/compiler/compile_toplevel_vars_test.go", + "sha256": "4b05a3296a8c2959ee5aa41a1a00b5d6cc08889ba7e1639e04c2b7bc371d88fc" + }, + { + "path": "internal/compiler/diagnostics.go", + "sha256": "b0dad705c9e150f80f3282adeda4bf418ae82804417926af3d8f3c010e701776" + }, + { + "path": "internal/compiler/egress.go", + "sha256": "422ae6406080b02f7504475b67aaf219554efd8d189c1303885999b1df67645e" + }, + { + "path": "internal/compiler/egress_test.go", + "sha256": "839632d155b954771adc8d8397d2624d979a213f7d50f0364e208cc91ca73bb3" + }, + { + "path": "internal/compiler/emit_lsml.go", + "sha256": "b0032fdb2728a6e36ed1825cc5164e5d116d43e2ceac88855667b532bd90fc5f" + }, + { + "path": "internal/compiler/emit_lsml_1_2_test.go", + "sha256": "a6a52401862e4db34e73ca71f8ec3145e4d2966910cd099b6efe2d16cb24fc93" + }, + { + "path": "internal/compiler/emit_lsml_authoring_test.go", + "sha256": "9ff149d7dd5ed1ab6666d302115415ceb33d7d6aac12441c0f134404c001ffb5" + }, + { + "path": "internal/compiler/emit_lsml_test.go", + "sha256": "aee42813d35124e0121ce63ca2a58362257837c95da0df0e05cb86ab3cd4bd3b" + }, + { + "path": "internal/compiler/emit_lsml_xlang_multiblueprint_test.go", + "sha256": "cc1764eaad599fe9c85bc8f1d7a33dbd195552fe03d79bb0440c469cf0f07ded" + }, + { + "path": "internal/compiler/emit_lsml_xlang_test.go", + "sha256": "b5371e01b2275d4c0d11632724ffaaa3d4e528419511f43ea3f6a7486746617d" + }, + { + "path": "internal/compiler/events_input_binding_test.go", + "sha256": "ca0256d56f48bb17eca65938d71903203a5f594255b72e4fc43ce2767fc9c055" + }, + { + "path": "internal/compiler/event_topic_binding_test.go", + "sha256": "47940de79acde66f8d0554f5a41f49e1c69b2e2ee2b92731b6eed7845daebcac" + }, + { + "path": "internal/compiler/exec_partition.go", + "sha256": "f42700ef8b6de1aea9d0631737e76fe85bbba2a90d42b866719efe2e205c28d7" + }, + { + "path": "internal/compiler/exec_partition_probe_test.go", + "sha256": "e9c419997ee6d5332dc32f9fa518bfd7000b5b4f1c5bfb93cda7974b955e6bf9" + }, + { + "path": "internal/compiler/exec_partition_test.go", + "sha256": "286f476545e1dfd099d6f02805740d8823e6664a6a2bfb35d940285b61f75ecf" + }, + { + "path": "internal/compiler/expand_reference.go", + "sha256": "d7b95cc7fb0dc2d07dc77049867063720e71495683c7a9cee334e0d62830e4a3" + }, + { + "path": "internal/compiler/expand_reference_exec_test.go", + "sha256": "a5803a381d564f381b156802c619c82410b771e6aea73c56fd148d3186c5fc8b" + }, + { + "path": "internal/compiler/expand_reference_matrix_test.go", + "sha256": "9fd96644d7683151a244fcba44bbab177d97958f3742a0192d25ecca47ca3d63" + }, + { + "path": "internal/compiler/expand_reference_seqchain_test.go", + "sha256": "0f052164b220ac82aaba2530aad677f6914530feee8afe7712f73a31ad02c860" + }, + { + "path": "internal/compiler/expand_reference_test.go", + "sha256": "32be3b831abe3d49448feab37ea7108df10af06126995f0c836c83e1f7bb91bd" + }, + { + "path": "internal/compiler/expand_reference_varinput_probe_test.go", + "sha256": "461cf8d23a094d9229bae37be4cc23dac5830955abd25b38aaa64f4fd7ca1e80" + }, + { + "path": "internal/compiler/expand_reference_varinput_test.go", + "sha256": "8ab2fbfaff0ecdd659740354531a064bedaa6164a74fca61e80b0782802cd74d" + }, + { + "path": "internal/compiler/expand_reference_varseed_test.go", + "sha256": "7c5545047d6c80f80e07498f2c08339a34133413f643f8de094cdad65e18baa5" + }, + { + "path": "internal/compiler/fetcher.go", + "sha256": "c55914a0056758b80ab4f5e36666f867c961a1d1c4b06b7f9fcc0f90aa81cfa3" + }, + { + "path": "internal/compiler/fetch_cache.go", + "sha256": "80e359eb29bd25fbb6c01ec12e330eb0a36a063c61a04783bc450553a88101b2" + }, + { + "path": "internal/compiler/fetch_cache_test.go", + "sha256": "fddfa08bb99dafd3af89b760dd5c527186e79df79fecd97ed84634753fa9ec3b" + }, + { + "path": "internal/compiler/frozen_bundle_exec_ports_test.go", + "sha256": "d331aa1ccb40c97e727f75df6e5cab0863bc5217283ac31b98f6684d11c9fb3a" + }, + { + "path": "internal/compiler/graph.go", + "sha256": "f9d605dc7a6bd909101215d0672e3be68c88095c9a948f812f93a16a24f670dc" + }, + { + "path": "internal/compiler/http_fetcher.go", + "sha256": "39d9b21a62c6bdf7f30bae0aecfd879bb616ccf1ee701bc2a7fc27b3f8fc3ae1" + }, + { + "path": "internal/compiler/http_fetcher_test.go", + "sha256": "b20e9ec8fb86e09567926afa72f4ef5aa163fb0d2ce3f019096c07b035967af1" + }, + { + "path": "internal/compiler/http_fetcher_token_test.go", + "sha256": "a1a392e1eea0b508c9d03323dea0e4929cd12fd36b93d624436b2cb3e0f59d0b" + }, + { + "path": "internal/compiler/layout_cache_contract_test.go", + "sha256": "6dac0cdfbcae2a5b601e066e5b8c5c948528624f14ad33f9422cd9899fb8bd8d" + }, + { + "path": "internal/compiler/lower_animate_initial.go", + "sha256": "1ed7e4d26d3525d5291ee60343ebbae92c7b6c504231c8eaca66fb726d91a1ec" + }, + { + "path": "internal/compiler/lower_animate_initial_test.go", + "sha256": "4de430ce8b55d7d84c2ef98c4c9c8b8753fdcae66088437e9fe2b0604524dfe5" + }, + { + "path": "internal/compiler/lower_animation.go", + "sha256": "d294c4a665cf07fae32d0aac6b023a277ea5c5dad7681723c78d66f5854de17f" + }, + { + "path": "internal/compiler/lower_animation_test.go", + "sha256": "bddcd1a1329291ab316e90f4e0f6abb2824a0f66b9090f451dd6a097700e12dc" + }, + { + "path": "internal/compiler/lower_render_props.go", + "sha256": "f35956bc6fd05a4bc535156a14c87807997969a104b448a52d5210367eab435d" + }, + { + "path": "internal/compiler/lower_render_props_test.go", + "sha256": "251bc6fac71fd01b04f1af514bb97954293d6d8d94c97971a7c1ba553dd1bf16" + }, + { + "path": "internal/compiler/lower_transitions.go", + "sha256": "9bf83f51291a28456816e8807e03109965e2b117a5171ea521263a4f7d22bc1d" + }, + { + "path": "internal/compiler/lower_transitions_test.go", + "sha256": "eecbbc96f98f60826603adcac366db5c6047bfaaeb9caa2b63cd2cd108aece96" + }, + { + "path": "internal/compiler/lower_wipe_cover.go", + "sha256": "b8a0faf70c9f64afc711bd2f6d2c489b6e4e1dba043ea35ac5fc676f6d6bcbe3" + }, + { + "path": "internal/compiler/lower_wipe_cover_test.go", + "sha256": "f67aadd24e079ffb6577b4b2e8a3ab8fda91e8a1513431b3e4c23890c23b93ca" + }, + { + "path": "internal/compiler/named_ports_test.go", + "sha256": "64c802a7887427c835303dd9b831c83a554b9cab8da24dc66183cf01f6ea2ea1" + }, + { + "path": "internal/compiler/on_platform_event_test.go", + "sha256": "ec3548786f2ef618ef55dca03d7e966f2747800ce1af210ff65789fe13c03004" + }, + { + "path": "internal/compiler/push_fingerprint.go", + "sha256": "be64278291dc72b5f3220297a73c16aa6b96cd6a2dbdfaa10575c31c3e833638" + }, + { + "path": "internal/compiler/reserved_blueprint_key_test.go", + "sha256": "5ff3047e7b88ec5988b19c9c0ad8bf018e2fbc4431fbef3e7d7e06d0ffce6f0b" + }, + { + "path": "internal/compiler/source_resolve_test.go", + "sha256": "7a767c433b702ae4364f8992e4f3c213a442f82e29bfeb77f4e50784b5e434e0" + }, + { + "path": "internal/compiler/static_bundle.go", + "sha256": "262c87f410ee761acafd4a78428803ffc44f26ff55143cbeb19d1d9ed92dec9a" + }, + { + "path": "internal/compiler/static_bundle_benchmark_test.go", + "sha256": "355009206fedad3940802cdc1d2a946fbe4fc85f58e7b5f91d4b1742a5845e35" + }, + { + "path": "internal/compiler/static_bundle_test.go", + "sha256": "57f7c5d61380aaa59e3e401e2852ac55c5b4ef73e0f630c20f4383ca5c4ec013" + }, + { + "path": "internal/compiler/static_bundle_value_test.go", + "sha256": "a06991aeb87591f0d375090e388dfd85eb8a58e4a694ad38d84d27f205c0c8b4" + }, + { + "path": "internal/compiler/static_node_fields.go", + "sha256": "885863621224f2a64fe1b77373dce088f83ee27ed831f78c172c148b481661d1" + }, + { + "path": "internal/compiler/static_node_fields_test.go", + "sha256": "90fcbf9c2d79cc79c56c4e2a280cb92bd932b53a78e366c68121e05c0e500e6e" + }, + { + "path": "internal/compiler/testdata/blue_compute_manifest.json", + "sha256": "c7298ce473c12194a2f68c47278b2200e465ed9a3f6658b687bd1854bff196b2" + }, + { + "path": "internal/compiler/testdata/xlang_golden.json", + "sha256": "8928d2530c46f832d64a986fd5877eac2d0c921ce2aa9c03fdc628b6d43b1240" + }, + { + "path": "internal/compiler/testdata/xlang_golden_multiblueprint.json", + "sha256": "bf9bd613dba8325479b70ff62d17899fa229c324e1961722511bf378db939ab4" + }, + { + "path": "internal/compiler/testdata/zabcanvas_user_component_pushed_version.json", + "sha256": "3b0cee599b27a708c42f07cca9def4ad1a9430a8e1ac8dc4feea3ec8bc0ed54b" + }, + { + "path": "internal/compiler/types.go", + "sha256": "0578005bf3d5903dff7e22eb52e3328c38266e6e5b36e03e934c476d88d7233e" + }, + { + "path": "internal/config/config.go", + "sha256": "76f09f7869aac4961641cc7dc57c0fc20ae07be827433181d098b2af17af4477" + }, + { + "path": "internal/config/config_lsdp_test.go", + "sha256": "1ac3fd315acb8d36f95300b40ac6965b3d9e93d4aa6db57e467c6f384940518b" + }, + { + "path": "internal/config/config_profile_test.go", + "sha256": "429255c5917c5ebe37f8c90f05e2b3c2c3ceef2f3acde757ac77d10bd1e3533f" + }, + { + "path": "internal/conformance/allowlist.go", + "sha256": "64bda62caa1a73250112919375365b47952b2b7a8b04d887328376c74b0a76d7" + }, + { + "path": "internal/conformance/conformance.go", + "sha256": "5f03f71fc72fb8a7899ea3b5f03e1829796075fe9fc1d66b33803908b3744c4e" + }, + { + "path": "internal/conformance/conformance_test.go", + "sha256": "5e03de0e43dab9c758090fce54812dacd391b550ea52da057c3c63bcf918e3cf" + }, + { + "path": "internal/conformance/manifest.json", + "sha256": "b08ece5698f1fc764641a0a4b384d14cfd2a5317131dda733ef909d52e583e5c" + }, + { + "path": "internal/conformance/querydescriptor_golden.json", + "sha256": "23e10e33f0ebbb01a212c038b3ec24c3b546e81f7ddc4251009856907026c478" + }, + { + "path": "internal/conformance/signatures.json", + "sha256": "bbec68cbcdaaf73c33535fbf62b1892d355d918c533ba7aa74cccee112c289c6" + }, + { + "path": "internal/conformance/signature_parity_test.go", + "sha256": "b56af86b213e43110d917e242dcc865eee5f11fec2da1d97a8591df9cecf78cc" + }, + { + "path": "internal/effects/dbquery.go", + "sha256": "5d2a719541e9c2fdf97039826f29918b2d699558cfa9bbdc54a0abfbc289ee27" + }, + { + "path": "internal/effects/dbquery_local_contract_test.go", + "sha256": "8e38a04e6a48b1be0fa3984f23dc7f43b2953728c374956540b5ab11fdf3c510" + }, + { + "path": "internal/effects/dbquery_test.go", + "sha256": "64c2e3036be50bd01b5a19d6206ca67146b35ba3df7de9652aa41d68239c8a18" + }, + { + "path": "internal/effects/dbschema.go", + "sha256": "57698603e8bad10db49390f0292aa1f6e7ac1134db9320b12d718b4eeb01055d" + }, + { + "path": "internal/effects/dbschema_test.go", + "sha256": "cd9a7d1ece220c33d5bb4cf5770cd531f7e2e21bd4802a069893a49d780c3d30" + }, + { + "path": "internal/effects/egress.go", + "sha256": "8083f2f43b1ab409560a34cb7396f6437d7f4f399836093b731f5554b37753ed" + }, + { + "path": "internal/effects/egress_budget.go", + "sha256": "36af9a20f29301caa4ecd05b25015a3abc8e792b942b96e11f1448bfb325c533" + }, + { + "path": "internal/effects/egress_budget_test.go", + "sha256": "6c87efb779a77f66ae2133dff2afd77735bbbc06f9be95972554f08c9a7c6521" + }, + { + "path": "internal/effects/egress_probe_test.go", + "sha256": "4ad8ebf04262c40433d6dbcf23e97216e1a22ae5a8b721261af69943c81698ee" + }, + { + "path": "internal/effects/egress_test.go", + "sha256": "dae15108d87713b228a4de49d28acc1c303e82b35926d6ca9cc223b79acde6f2" + }, + { + "path": "internal/effects/runner.go", + "sha256": "a889312d28e2d113f962f436d5ab782311362b9ac3fa8ac532d9f189fbe4df5d" + }, + { + "path": "internal/effects/runner_test.go", + "sha256": "89bea0b6403b5ba2132721640d455b3e9d0c58cb7dff9ebaa3fbb9d87cee49c2" + }, + { + "path": "internal/effects/servicecall.go", + "sha256": "f1b966f8e899a37cce3ae9259395ec90e3cab6286221401e481d8162d8333bf7" + }, + { + "path": "internal/effects/servicecall_test.go", + "sha256": "399babee4ace54b9189ac38d698855d55f09730fcad3cd2e5eb217d3a56da503" + }, + { + "path": "internal/effects/service_token_exchange.go", + "sha256": "8433f08369240c239158a58d84ea34f07c0893a5ac74488771a704dac50ae3c3" + }, + { + "path": "internal/effects/service_token_exchange_test.go", + "sha256": "8e2a4144905ca26efb1e9e181907566c81b22ddb09fedb9dbb702509aff344f8" + }, + { + "path": "internal/lsdp/bootstrap_state_test.go", + "sha256": "0e0df812e22c5c96007ef8b8294bb61bcf4fc6dd03b9e11218f8ce5c4b778ee0" + }, + { + "path": "internal/lsdp/bound_leaves.go", + "sha256": "1faf74da6d4f3be8c85afbd98152a56652567241d6575aa35bc2993254b4822b" + }, + { + "path": "internal/lsdp/bound_leaves_lsml.go", + "sha256": "af0a12836cee54a5e51261ab995d06cd35ab3701d0e854a4b0c26ef130a1c07a" + }, + { + "path": "internal/lsdp/bound_leaves_lsml_test.go", + "sha256": "34156f89cc89c9ac907d61eda8d5d91a3467556a539dfd51bff575fdee1cfb66" + }, + { + "path": "internal/lsdp/bound_leaves_test.go", + "sha256": "f3986dbf21da9497b96f488f9f1c1aa0d1f180962a014ad9bbe8390b742c715c" + }, + { + "path": "internal/lsdp/generation.go", + "sha256": "fadaf683047134b4e60eb40ee3cfb73fdf09e6614215925893e3b02723ba271c" + }, + { + "path": "internal/lsdp/generation_test.go", + "sha256": "2198c4d5e6688e9cd75ec10eb82cc89279f34536ab6f106b1046d1fd9040174e" + }, + { + "path": "internal/lsdp/helpers_test.go", + "sha256": "b2c04102309396f5984b3017516ef40f7604db13392ee898a1983f07c0231328" + }, + { + "path": "internal/lsdp/identity_authsource_test.go", + "sha256": "4bbb01ff1fa58acfb97ed2bf3a0161749d3ccb53b062df7e313b031283e94519" + }, + { + "path": "internal/lsdp/keyframe_on_join_test.go", + "sha256": "59c45c653a4364a5a481611cfd78039776a40259bcb61b9a54284300b9590fce" + }, + { + "path": "internal/lsdp/keyframe_switch_test.go", + "sha256": "c3641cb38f539af2d5785bc28d1c88cdc2b4ffb5703ff26be43072bf7cf8d9b1" + }, + { + "path": "internal/lsdp/mirror.go", + "sha256": "5ce9aad970770bca02bb711bd911dec7fc96d4adf8a851d3944846a09ac47623" + }, + { + "path": "internal/lsdp/native_surface.go", + "sha256": "909f994ebf8a12be208064cc3b4ab218b78074f303576ecc709dd9788e21a37f" + }, + { + "path": "internal/lsdp/native_surface_test.go", + "sha256": "bec5bdca784d6480bf79046cce0ed823aae70460eefa4cd881f847bdb108de57" + }, + { + "path": "internal/lsdp/overlay_mirror.go", + "sha256": "1ddc5627169c38c4df84634b630a9032a4c2a6f0d020371120b3d0a4973abbbf" + }, + { + "path": "internal/lsdp/overlay_mirror_test.go", + "sha256": "3303982c0455f5fdd7a2176d67d20eed6ec6465f341c0b5598fb4aa1f9c07dfb" + }, + { + "path": "internal/lsdp/overlay_streamrule_test.go", + "sha256": "477b85e6532023fde93294ac487283ece5daa335a25fdfcbe2eee95c7947ff61" + }, + { + "path": "internal/lsdp/pipeline_e2e_test.go", + "sha256": "3510a0158884b0aa223b912f7cb1036f7795aae1cf4d912a95445c1102eaef5b" + }, + { + "path": "internal/lsdp/preview_isolation_test.go", + "sha256": "e1da14b540a78e2e676c7757f9838430cfd397b9302d971c73a48ecadbeff0cd" + }, + { + "path": "internal/lsdp/projection_metadata_test.go", + "sha256": "0a2bf8de202a7fcf781f4bae5f28747de01a5b5779771da51b8f68912e3e532d" + }, + { + "path": "internal/lsdp/roster_wire_test.go", + "sha256": "63aad8672b2dae57cb6771ea181d089349ba41e1924fb6a9a69dae1fd626a40d" + }, + { + "path": "internal/lsdp/scalar_filter_test.go", + "sha256": "fa33d739e5fb1979ac5225cbbde2f888c1f966188d4c0234db915dad11f66437" + }, + { + "path": "internal/lsdp/security_test.go", + "sha256": "cd7221ac19f262cacaa4b7324dc788a0211777c1d44cf6eb3074ac06d29b9a64" + }, + { + "path": "internal/lsdp/session.go", + "sha256": "f4e8dca712988c40c7077395d4108604112e49c37651dcc4f5345b59a63f720b" + }, + { + "path": "internal/lsdp/session_isolation_test.go", + "sha256": "f735129113fea2527a238490647b55e09d230d604f7617ed5f163cd91e0213d9" + }, + { + "path": "internal/lsdp/slot_mirror.go", + "sha256": "7db168e851dc5d31d57de66b7e0873c41f85a100f86d590b4f8c9660f9531886" + }, + { + "path": "internal/lsdp/slot_mirror_test.go", + "sha256": "d885264d97708c060cae5679f911d9bb18d945d0f390ddf3f24d44949fd1f095" + }, + { + "path": "internal/lsdp/snapshot_identity_gap_test.go", + "sha256": "56848265e410f24e762e3487e681818a8de2179b2a742794fcea0367264859a2" + }, + { + "path": "internal/lsdp/viewer_arming.go", + "sha256": "a7eef07169ab3717c243b83297f9f014296a2cee1c0abf4c08aacf4377ec1e49" + }, + { + "path": "internal/lsdp/viewer_arming_test.go", + "sha256": "f3429ddd2d3064ece489301f807c5b4f03a22ab10618335a482a932481cbcaff" + }, + { + "path": "internal/lsdp/viewer_creds.go", + "sha256": "3e85ad83843928fbb340b280825d5b28c1a95955899c24ef33ae9602ce243089" + }, + { + "path": "internal/lsdp/viewer_creds_test.go", + "sha256": "d1654b27501c1fdebd96a3964f8044e05a5f8556e40307a6b336a275b8621b92" + }, + { + "path": "internal/lsdp/wire.go", + "sha256": "bdfd544d7379c87f355196428ad70f59face5e307de01f6ae50ca2739ede144e" + }, + { + "path": "internal/lsdp/wire_test.go", + "sha256": "ca63ca4af7dceb10717626614ba05e5e1d6856d02aa7a3e0e960adba7c9ea3c4" + }, + { + "path": "internal/lsdpreception/animation_native_test.go", + "sha256": "8d2fa0554513699b0369c445d2d9e88269221150e310a372f7f80923da3fb8e1" + }, + { + "path": "internal/lsdpreception/blue_native_test.go", + "sha256": "b84c558cd5ea1132e3657235699ded3c43a31fc19be6163ecbe6d51c7d949010" + }, + { + "path": "internal/lsdpreception/control.go", + "sha256": "511eb6447e3a2ecc15451b14ac5032b58201833a01f89d5d9b89d7c3061eb61c" + }, + { + "path": "internal/lsdpreception/mirror.go", + "sha256": "7298668322fb3abf6414010b42f78673dd709068969edbae0ade16c349be74b8" + }, + { + "path": "internal/lsdpreception/mutation.go", + "sha256": "3790a3ac4b66c87684241deb7134346043ee83e159cc9ad14242677568c7f793" + }, + { + "path": "internal/lsdpreception/mutation_test.go", + "sha256": "b6e2790f50a76ff41e2523a68f6a3c0f1437bbb11f98d09f0b2c1e7a922b6dcb" + }, + { + "path": "internal/lsdpreception/producer.go", + "sha256": "b5367b6e2f9dfdf716882cb8a6c59fcea5c853d2aa82c69fc741742250262dff" + }, + { + "path": "internal/lsdpreception/producer_test.go", + "sha256": "fc115d86bf9444d8d12f0c0a16f6d468c61dc3c83234c50f34d03c70acb507f9" + }, + { + "path": "internal/lsdpreception/reception.go", + "sha256": "fc305d8da1ab330a28f1c22c68afe430952cbddd59430af6c7eac8281d0dd0ac" + }, + { + "path": "internal/lsdpreception/reception_test.go", + "sha256": "c08afda5eae9c8e51d92f3f0e57823b1698d509e0b2f733ae7c31d594c8cbf3a" + }, + { + "path": "internal/lsdpreception/recovery_native_test.go", + "sha256": "d47c6106b5759c5458724d7efed13c257c4b7cbea4313195e66ab81052e4cae0" + }, + { + "path": "internal/lsdpreception/recovery_test.go", + "sha256": "b5789bb1ee6402f5cac50d69445f660f11165c027febe9b8d69410332d2f8423" + }, + { + "path": "internal/lsdpreception/route_retention_test.go", + "sha256": "aa3638eb5fb1ea2d17c890230a2e8a324c323027560c52213f7cca5349b77076" + }, + { + "path": "internal/lsdpreception/session.go", + "sha256": "33facbd24521939e8c93a3de6d3fd66cf72d72f106cd64284e77a1ecaf4344e5" + }, + { + "path": "internal/lsdpreception/surface_native_test.go", + "sha256": "5d633c2d7e6642b8221cecf1e08bba99e9132f1adaed880e0150a751e57c9132" + }, + { + "path": "internal/lsdpreception/transition_test.go", + "sha256": "138e0a658deec9edfd7d997ee2bfb4ae921a8b3469f16e166d6882ab038b3272" + }, + { + "path": "internal/lsdpreception/tree.go", + "sha256": "56f4a1ca4b666c818a487b88887c7eea8fd9403632078e7e48f5426481f55f71" + }, + { + "path": "internal/obs/logger.go", + "sha256": "993c6fc53fb8861bd289531f0b61923ff061c2617fb507d2d7198e5887e34d5d" + }, + { + "path": "internal/obs/metrics.go", + "sha256": "0bb2dafa79d7be3266554cd89d7a6d6c8d73d3d3eeb250dd6fece25d15425d1b" + }, + { + "path": "internal/obs/metrics_test.go", + "sha256": "d8068299d04400b34eec5b63e52263af0c399d2388c4b4f1063c59e53afdaa9c" + }, + { + "path": "internal/obs/prism.go", + "sha256": "9fe3124096b11399863936f161f164773ba3350c7b9fc1b5e958d0c449c88b15" + }, + { + "path": "internal/obs/recover.go", + "sha256": "edf6aa2b30761292523e809e111af45ab77161ef408181f3ca95da74a4a63ab8" + }, + { + "path": "internal/protocol/fixtures_test.go", + "sha256": "007c1c00bf34af96342d72ee7d9a47ee94e21d5c4f7b5c0aa83a7f424754865c" + }, + { + "path": "internal/protocol/messages.go", + "sha256": "833b96029868407f58fb9fcb5d21e3356f33e9c2293741bda6b4ab1696c5614b" + }, + { + "path": "internal/protocol/messages_test.go", + "sha256": "358ca4f6b76a05de895fc4f09011d803776e73716349671a09a9476bb853a072" + }, + { + "path": "internal/providers/canonical.go", + "sha256": "b14653c9965527c7dd2febfab17df5928ea8911001cb1723cb880925a326b46e" + }, + { + "path": "internal/providers/events.go", + "sha256": "615ba6d918057dd425bdc6ee1e2b4da8fc45a7006b3af3a5cd1d3ba24633884d" + }, + { + "path": "internal/providers/events_test.go", + "sha256": "4a19e445a9bde44a65f9f2be01d1ec1cd567f3ae007619bd1d36003ad62408b4" + }, + { + "path": "internal/providers/isolation_test.go", + "sha256": "41e1f00f43075edf843553e0bba62255ef620f06a0faa08ef78c54893e5d22df" + }, + { + "path": "internal/providers/policy.go", + "sha256": "b0458a6328c5fe0af45f22c9730bdd4cc01f352ce8c03cf5e5e0512f9907fe40" + }, + { + "path": "internal/providers/providers.go", + "sha256": "1ef4f32c7af54b95e14bbaf724a2a3bd2e4da940c8eb39748a935e74c79b3937" + }, + { + "path": "internal/providers/providers_test.go", + "sha256": "f95e483e79199b0a9e26777ba034ff8b9a3fcdf4606835d5cd7e8463beff1c3b" + }, + { + "path": "internal/runtime/canary_firstflight_harness_test.go", + "sha256": "46b0d33c9e06550dfa46e509e630cef699685bb9913bcacb500b4282a9b5bf35" + }, + { + "path": "internal/runtime/chained_ref_db_exec_test.go", + "sha256": "90d6218ec47b6f3cc3590fdbafbc99b59dff634f376af68b0581974a6d81d376" + }, + { + "path": "internal/runtime/clock.go", + "sha256": "a2eb33e29d045291959df20d476217ce14654f8223bc5b6f3337a5b2ce1bf74d" + }, + { + "path": "internal/runtime/compute.go", + "sha256": "bfb7ad6b99b9700270d3186817322bb81cdd94c799bd7ba5a0dfd0ece78c2119" + }, + { + "path": "internal/runtime/compute_db.go", + "sha256": "cde0bfbf4dfc48acb9c16fdaa722f19d2ae0c703b2e9f8bf9a914a1ed4c160f0" + }, + { + "path": "internal/runtime/compute_db_test.go", + "sha256": "41d79f7a5c84a42f2db3e0e83902928fef204cab261e9b2cb8daebecf1387bd0" + }, + { + "path": "internal/runtime/compute_db_wired_test.go", + "sha256": "7828ea5018c9efcd94fbd9b95d2c501738fc306303fde0148932dc3d7333d51d" + }, + { + "path": "internal/runtime/compute_equal_test.go", + "sha256": "4ee613c493da93f26b5d02f985ac81fdcdd93427fddb8a89af545f6baf3224ca" + }, + { + "path": "internal/runtime/compute_pure.go", + "sha256": "d75b0fe0352b20c54a08d589542b1948a4fda6b62aa1db3b5fc3379b087ecb93" + }, + { + "path": "internal/runtime/compute_pure_probe_test.go", + "sha256": "d066945349a21de7bc87dcaca38dc4037d9a0c09b827cf7f963cb42f56f2a644" + }, + { + "path": "internal/runtime/compute_pure_test.go", + "sha256": "b595d969991d0317bd0d55eb516dd49a08e41a32568717aa3791ec1de2642457" + }, + { + "path": "internal/runtime/compute_source.go", + "sha256": "8d74ccf671d2b2c4259ead29f60236ec8fe66a932959fafb4e2ddbb7b36fca2b" + }, + { + "path": "internal/runtime/compute_source_test.go", + "sha256": "2686a9ae9b33b45945dc41c588e0fbc081ef6b22ba6e4a588b720df68e19dfa1" + }, + { + "path": "internal/runtime/conformance_exec_test.go", + "sha256": "5d6367062946ad9444479fc9040571e1f0d5e5181ed5e822a77896322d69eca6" + }, + { + "path": "internal/runtime/dirtycone_test.go", + "sha256": "396e9376afc3ec140e97ed5b77485f04c9aedca0c30135cdd9f1a8dee910c1be" + }, + { + "path": "internal/runtime/draft_switch_test.go", + "sha256": "855c85906e872a99b1aa5335ecd8af0a6d8875fa4f06c53f237ecc7d038260ea" + }, + { + "path": "internal/runtime/engine_ab_parity_87_test.go", + "sha256": "de5ad05236724a9dca9cef20d3b7a52b1e7afab756fc8a8384b303549019eb32" + }, + { + "path": "internal/runtime/engine_ab_parity_extended_test.go", + "sha256": "c97734eb2583af5ffcbba9f0083fae08ff34a1d97832b9fa2985f8dd59207f61" + }, + { + "path": "internal/runtime/engine_ab_parity_inventory_test.go", + "sha256": "ca82ccbf10a46f32c203e1f01468e51c00599728b7b0896a4a10284822433c51" + }, + { + "path": "internal/runtime/engine_ab_parity_test.go", + "sha256": "f026af2728ceacd32d38e1296855fe811ff60a5b26d89683fa7e1f2580161228" + }, + { + "path": "internal/runtime/engine_ab_parity_transport_test.go", + "sha256": "306efaf0611677766af0ff2131dd4234e6e5e54950c0b3719cb36bdbf7a6f44c" + }, + { + "path": "internal/runtime/events_input_reactive_test.go", + "sha256": "9d588105f8651b993464feed373614cbf60df0e248623802b3874a6e9003a3ae" + }, + { + "path": "internal/runtime/event_ingress.go", + "sha256": "32d526d5bd40b9b7b36b193388db59435ea662349d76df246b0a9c8495f01974" + }, + { + "path": "internal/runtime/exec.go", + "sha256": "a7df78085416c6b5b05fcf89d339752421c97144cbd5ac2d74aa6379432d9ba6" + }, + { + "path": "internal/runtime/exec_activation_probe_test.go", + "sha256": "5b6932679a769156bd43dc05331fa62c58e20f145c08bd722f1b030bd4affbe7" + }, + { + "path": "internal/runtime/exec_anim.go", + "sha256": "6680b7a52b10a4f8fe1c7808ed6b0834e87784aef28f1639e26aca68c373321d" + }, + { + "path": "internal/runtime/exec_anim_probe_test.go", + "sha256": "27972c459ad17e698d2d9f5586824ae075bd5c0d6774df103bd631dc2ff112d0" + }, + { + "path": "internal/runtime/exec_anim_test.go", + "sha256": "ea28afb213773fd6f5b0adc201ad9be8f753c1f73c8d028c26535374b51603bb" + }, + { + "path": "internal/runtime/exec_assign_slot.go", + "sha256": "632af97f18894bbbb920c90c7f3c5a50cbd4469a39816647be02e94e3549b6da" + }, + { + "path": "internal/runtime/exec_assign_slot_test.go", + "sha256": "a163df8c475b99891a0e4cd42ddf77e377daf18a456a720934fdc4e30c2c360a" + }, + { + "path": "internal/runtime/exec_contracts.go", + "sha256": "1f127ba255c546adac23987622718f2b94b95d696834de5c254f8ed79b26cea9" + }, + { + "path": "internal/runtime/exec_counted_loop_test.go", + "sha256": "2ddfeb2ef9f13107b840ed8f4e58c8eaf2e6d412fb3d3acd8ba72a9b27830cdb" + }, + { + "path": "internal/runtime/exec_cpu_test.go", + "sha256": "bc3a94d093ac651c4e1070b6248f1debe5097be2d01d7bb9c911c5a0bbf99623" + }, + { + "path": "internal/runtime/exec_effects.go", + "sha256": "c65fff1792b130b31a17d051eac4cbc36bd3d739ea9efa13909bcef5acd2732b" + }, + { + "path": "internal/runtime/exec_effects_probe_test.go", + "sha256": "3c7f58e533c31419f8c158de49ce5520936fa8260e170f52e29e51704b49002f" + }, + { + "path": "internal/runtime/exec_effects_test.go", + "sha256": "753718a189d749b689e0eec7562f6f338ee99a28523ec93a1b1d462e707a1bf2" + }, + { + "path": "internal/runtime/exec_effects_wiring_test.go", + "sha256": "aab7c6e9272f02a78d01ab49dbc5a3ad0d3b232ad1a952782647b311ceccc80f" + }, + { + "path": "internal/runtime/exec_http_hardening_test.go", + "sha256": "44f515cdb7c195b8e4a8f128fd13b9ad0e2fadbba5f404d09557d8fd712b7878" + }, + { + "path": "internal/runtime/exec_interpreter.go", + "sha256": "a2cb3fbdbfda76ad578d01c058f038117b540ea6cfbc06cec75fc2e1a136310d" + }, + { + "path": "internal/runtime/exec_multiprog_probe_test.go", + "sha256": "dc5d4191157303e76a0cd68812b6c2a904d9b7c1b8e9fd132177def7b169457b" + }, + { + "path": "internal/runtime/exec_multiprog_test.go", + "sha256": "c207739cdd446e134bf06b39c91c99d7b754a4cdc5a385c5e0271ff28c878928" + }, + { + "path": "internal/runtime/exec_onair_test.go", + "sha256": "46ab66705348f844d076123df46c967db9b8cbac861be4469cbd23560f406f40" + }, + { + "path": "internal/runtime/exec_on_platform_test.go", + "sha256": "022ac1b1c9832a57a6976a7d84a436b1db1fce53642b7c7068c62f5c0764abfd" + }, + { + "path": "internal/runtime/exec_operator.go", + "sha256": "d1b76611173a10d70943783826e9b04b2656451a39e733e614678327b06b01d1" + }, + { + "path": "internal/runtime/exec_operator_test.go", + "sha256": "50fa0d3edbf261b2b77a6874b461495d354653fdc4556dc4d29b292e26fec267" + }, + { + "path": "internal/runtime/exec_overlay_app.go", + "sha256": "1dab339278ce241e30a19a4e62fe39a8db4ce6ced53e5315581c64e9f6512fc0" + }, + { + "path": "internal/runtime/exec_overlay_app_test.go", + "sha256": "8e554d817243cc3e9788e4c1e5374e741befa3848e4e05a7c07b332d3b867edc" + }, + { + "path": "internal/runtime/exec_partition_roundtrip_test.go", + "sha256": "177b449e22ba197c3646f45778c9128c8766866c6502f0c8502097e3cd761585" + }, + { + "path": "internal/runtime/exec_probe_test.go", + "sha256": "0fd396c0408dc9d0603d2705759bce95273b9575b31f7aaf33ae0094eeb11efd" + }, + { + "path": "internal/runtime/exec_service_call.go", + "sha256": "e463e657b0dc347f44a813f9df53bf05e39151e2e36cb90fb2a8f3769ae192f8" + }, + { + "path": "internal/runtime/exec_service_call_test.go", + "sha256": "47660de2d7984f3faf5515e042a904aedb60c9dc446fd34f946f9d3722ff77cc" + }, + { + "path": "internal/runtime/exec_show_emit.go", + "sha256": "ba483e73d0041dce76d62a49b1c788a2bd326aeab62cfc839836aab0dbb78f04" + }, + { + "path": "internal/runtime/exec_show_emit_test.go", + "sha256": "aa53c0b12070a0eff506701a9a1e9d387137ed04cdec5da76d061591993b544a" + }, + { + "path": "internal/runtime/exec_test.go", + "sha256": "92a66d015d705df4c0ad052c0f94e839bc6c307de080b143361e4473d6f4a898" + }, + { + "path": "internal/runtime/exec_timer.go", + "sha256": "061cc23d8be527eaa1868df7c26f058ed6bc91d6cea013240026d2a6f74d73c4" + }, + { + "path": "internal/runtime/exec_timer_probe_test.go", + "sha256": "8149a21335d30dee06a976cfa21eddc2ed9e5ab6b4c3b501d75a3819855183bb" + }, + { + "path": "internal/runtime/exec_timer_test.go", + "sha256": "b6c534fa689aaad94b09acc2df17a9ce035b9eaaa6253c2627ef6a2c2d55b92a" + }, + { + "path": "internal/runtime/exec_validation.go", + "sha256": "e1bb3a850b5e88931903724f3782c35c8b2fa0c27f8ba4c6f7a57e46d3302b2a" + }, + { + "path": "internal/runtime/expand_reference_runtime_probe_test.go", + "sha256": "779131d0a3e193878683143250dafb4c6bdc9f00eabff56bb29bdf0f3d987b94" + }, + { + "path": "internal/runtime/named_leaderboard_prodgraph_test.go", + "sha256": "8735724211ecd2c474611ce6a09c31641fd1fdfdcb53d0d7360dbebd25725c84" + }, + { + "path": "internal/runtime/named_leaderboard_reactive_test.go", + "sha256": "b63fb2667c3d352bbe5915a0e47f4ff1630409cc9f0226c32627dbe01aa2e278" + }, + { + "path": "internal/runtime/named_leaderboard_test.go", + "sha256": "387623060021cb2a141d9c7568c8edc6fa48922ef1cc7d5817edac078c7cf80b" + }, + { + "path": "internal/runtime/named_ports_test.go", + "sha256": "40f471d8361e689c93203fc0fb64248c7fb57629110e364fe9b790c5e424632a" + }, + { + "path": "internal/runtime/perf20k_test.go", + "sha256": "0f84e571bc90637ab30e386046e98e3d9a7d810a70c652b1bca43c092b31f76b" + }, + { + "path": "internal/runtime/preview.go", + "sha256": "2e09dcaa1e23e9a7054f87a49506271d1c963b35f0220add32b1b424038ee2b4" + }, + { + "path": "internal/runtime/preview_editable_test.go", + "sha256": "7cc503e6ead1b904c761746a2e2d18ff716630f5afdbcd083c9c2796a100ea5c" + }, + { + "path": "internal/runtime/probe_cone_test.go", + "sha256": "39abf881dad0ae5f609962369d91a7e13d95ee37308a1084ab52a573d3726088" + }, + { + "path": "internal/runtime/race_off_test.go", + "sha256": "3a318ce34760c2e1aa2616b5822e31a86324e59c420bf6188c26d8c969a3485b" + }, + { + "path": "internal/runtime/race_on_test.go", + "sha256": "c4d6bad7295c55e560599ee0d00c74c453763022ce3f4bd3f2b7967709e91ab0" + }, + { + "path": "internal/runtime/reactivation_onstart_test.go", + "sha256": "4c26f059368b831d6869e6db33b64864e5254a52e54ae694222d4fdab0a431c6" + }, + { + "path": "internal/runtime/scene.go", + "sha256": "b968f4d6645d143b89f771e4ffe3f858c22f88d05927fd42729d977fda10fb87" + }, + { + "path": "internal/runtime/scene_emission.go", + "sha256": "aa37ec9aa03695deadfacb3a117994ed26c1f137769d910d7229383e6a411f7b" + }, + { + "path": "internal/runtime/scene_evaluation.go", + "sha256": "b61ae0341e4cdb8d59e107ead3001e20bf6ffc76e162c181d5cb103809d7aa0e" + }, + { + "path": "internal/runtime/scene_index_test.go", + "sha256": "bfb0d1bfaf5ca280c9950ac902ec6e1891770a27251188836062f38ebb20a456" + }, + { + "path": "internal/runtime/scene_test.go", + "sha256": "84a5b8ce0e77322a6bcab9ad706d7446678e89409858a78d99967b4e304bf6d9" + }, + { + "path": "internal/runtime/show.go", + "sha256": "d1c98c1151456b8bef3779863a57c295d1bccb304b92532dd17b873bb320a4c3" + }, + { + "path": "internal/runtime/show_roster_test.go", + "sha256": "e7efcb3084830546a618db91f9613cb85e8bb923bc7258474732d116d819655a" + }, + { + "path": "internal/runtime/state.go", + "sha256": "54c1024e690af10e87cd8a969ebc4a8d7c424523990554d3f9cf15d955d3b4a5" + }, + { + "path": "internal/runtime/stream_rule_test.go", + "sha256": "5ca2900f51d49e35eabfe5af6beb6323d63b396518032e19745ec973ae92b8bf" + }, + { + "path": "internal/runtime/testdata/m3_prod_graph.json", + "sha256": "e92e49c0dfffae7c13515351477fde78a8d3b0cb10805840184c33dcfe762b67" + }, + { + "path": "internal/runtime/testdata/m4_draft_switch_graph.json", + "sha256": "a843688f1efe00df68397729e8edf6bc5cbf886386e1b901a9ae34fb6c7e0ca7" + }, + { + "path": "internal/runtime/test_session.go", + "sha256": "9e9fb1a842312b2c65a409fddfd56f0fb0920aa1fa5b7cb8fa06dcc22b3740ca" + }, + { + "path": "internal/runtime/tick.go", + "sha256": "c11222c4e6d6274d7bb09b31cc9a2dffe103dd77f6ef8fd3eee0f8e767ed895f" + }, + { + "path": "internal/runtime/validation_harness.go", + "sha256": "73638c80da6ea90112665475fdfcbff3ed4e89d03e72efc36f9149f2762f3772" + }, + { + "path": "internal/runtime/validation_harness_probe_test.go", + "sha256": "068c3f64c7a640f589146758053c9d0f613aad06723423db3cb4da09e354f734" + }, + { + "path": "internal/runtime/validation_harness_test.go", + "sha256": "9d2accbe4ad47b489fe95cc4c3001341d7f447a6496a6cbe9f9ad88c04e8560c" + }, + { + "path": "internal/runtime/validation_simulate.go", + "sha256": "d9fecb8e7df136ba72b8899307fdef68eeefa4562443dea5991b0aabce118f79" + }, + { + "path": "internal/runtime/validation_simulate_test.go", + "sha256": "73eb738227fbcfff8b446a56a72f69b4ec7af11bc934f603c1d1421c13c2809d" + }, + { + "path": "internal/streamcontrol/apps.go", + "sha256": "748f86b84534e6ea086e59a7e9ad0657d22e48ac2572c2c8ddc71acae07426d8" + }, + { + "path": "internal/streamcontrol/apps_test.go", + "sha256": "bbb14eb6e008b601e23e356185973c6b08262e2a8e4a7a7483a6f5dabac1dc50" + }, + { + "path": "internal/streamcontrol/controller.go", + "sha256": "0d79321ae7eda17f1817384049b2383da516db86cc1a67ae0d166181ede17ed1" + }, + { + "path": "internal/streamcontrol/process_unix.go", + "sha256": "e03e9e783bf4948d739f5c971666a317189927dc468ff8b26ca53ef6cb8c83ef" + }, + { + "path": "internal/streamcontrol/process_windows.go", + "sha256": "b9f681bbecb648526d6738d11440fe7d7403692d86c6cb302617292b07a8f1fc" + }, + { + "path": "internal/streamcontrol/store.go", + "sha256": "2fe076d99758cf5ad07a82d6c84cd2828ff0b35c42d85b7ed2bb49c9521e16c9" + }, + { + "path": "internal/streamcontrol/store_test.go", + "sha256": "479e8ba9fddb3acf80b730e97b856880f94b1b585a30183d46527bfcf3d55d0a" + }, + { + "path": "internal/workload/client.go", + "sha256": "388bb177061c92a86da1e82063bb64c12e3ab0fac52d1bb47ca4eb16acea268d" + }, + { + "path": "internal/workload/client_test.go", + "sha256": "be9ac6100834e93fcea15aeab4da3cff119411a2c6d845b7c92160f0dd7fa6d6" + }, + { + "path": "internal/ws/connection.go", + "sha256": "d773e7fdd66d522cd1081f03c0b5fc85c1f9a4dd291120ddea83ad98de22e0ed" + }, + { + "path": "internal/ws/server.go", + "sha256": "364ec54691f65dc0fbb377877ecb1ff0be7915b952d830ca2466445316e6202a" + }, + { + "path": "internal/ws/server_authsource_test.go", + "sha256": "f07b2e25b1b3d0222648fdf5fb4c3017be86c1e4c4a85fdd60a2a51f9d26c99f" + }, + { + "path": "internal/ws/server_platform_test.go", + "sha256": "dbf4e8f6ed350397cd14da27a39f944d6f91e0686f4c44e5aa82f03d3f18c49c" + }, + { + "path": "internal/ws/server_test.go", + "sha256": "321bae19aaba23065984d4247b384a1883439dc528894ba6263c7b01e1ca775b" + }, + { + "path": "cmd/healthcheck/main.go", + "sha256": "4a919546eb9de017663cc87fea5e9e9ebc781334a41ba2d809faafe613e6cc71" + }, + { + "path": "cmd/orion/camera_slot_mirror.go", + "sha256": "e14dec0cdb4c4d0fceb729197b5eb93dcb6aef69594c91941f069be011c8eb60" + }, + { + "path": "cmd/orion/egress_boot_test.go", + "sha256": "00cb86327dd54cba7e9980806dc617eb470393559d0431c257b4fe8ef56fc9df" + }, + { + "path": "cmd/orion/egress_wiring.go", + "sha256": "57f36632a521172f453f755d44f7288e25aee7ad29b8609e036815153bf920bf" + }, + { + "path": "cmd/orion/egress_wiring_test.go", + "sha256": "832f1106fe0acb9e0e36cdd905ff5851fc25cec12ae87e4d118093c06a77997e" + }, + { + "path": "cmd/orion/main.go", + "sha256": "3555f4cba5f7c7c8333b8489bb7259b340dc7f38a91052499bdbd17f1691ed2d" + }, + { + "path": "cmd/orion/mirror_wiring.go", + "sha256": "fe06c093b2fd67d2a36d0540aa1ee4b3de9295c3c8ee851f214703cff50dc21b" + }, + { + "path": "cmd/orion/mirror_wiring_test.go", + "sha256": "55eee7414eced91f100746685c64cd955526e277fc203702f9477a9d002bcfbd" + }, + { + "path": "cmd/orion/platform_event_sink.go", + "sha256": "4d9139452bd8f84c837ed5a2f5d20ad371ff6e5bb550f12336d2b0849e911823" + }, + { + "path": "cmd/orion/platform_event_sink_test.go", + "sha256": "28ac9e8e3ede7ffec165c8583c2295e24fa38aae250faba00c93c65f34ec0207" + }, + { + "path": "cmd/orion/scene_control.go", + "sha256": "1c62e68fac2d4c72815ec10323d69471e5ff79bb20c662aeb2bf7f14a9122313" + }, + { + "path": "cmd/orion/scene_intent_local_test.go", + "sha256": "a4466882f5a27764b03622169a6f058ef77c65c1d586d4deea9cac65f88d35fc" + }, + { + "path": "cmd/orion/scene_intent_wiring.go", + "sha256": "9d5fd31ec444f97fda10bd72734f39390c85f652e88bfc8e8a22d53c52295fef" + }, + { + "path": "cmd/orion/scene_intent_wiring_test.go", + "sha256": "9b8e18185baf4fb0a0f42c1056b08d0a617bfc852f72fb7a324022bc7eb95860" + }, + { + "path": "cmd/orion/stream_control.go", + "sha256": "f5951c378ea39e4feb390063cef81b0401e79c405cf111dcabccae153748c0d0" + } + ] +} \ No newline at end of file diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-current-preview-lifetime-tests.txt b/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-current-preview-lifetime-tests.txt new file mode 100644 index 00000000..4a222a09 --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-current-preview-lifetime-tests.txt @@ -0,0 +1 @@ +ok github.com/ZabLaboratory/Orion/internal/runtime 1.564s diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-fix-report.json b/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-fix-report.json new file mode 100644 index 00000000..4cf2fadc --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-fix-report.json @@ -0,0 +1,18 @@ +{ + "kind": "AGENT_REPORT", + "owner": "Eleven", + "scope": "User-authorized capability audit corrections without ADR or agents", + "changes": [ + "One current authoring clone; no inactive editable runtime/socket cache", + "Serial retirement on Preview takeover", + "One separately active editable Program; preserved while Preview changes and stopped when Program retires", + "Current and active Program bundles remain readable, inactive heads cannot reactivate" + ], + "validation": { + "integratedOrionSha256": "36951109f0e7f0e9d50177ea851b95f2af6aa0e54050f9c4e55494cba4dd8cb2", + "blueSourceDigest": "sha256:0c3176acd35937294ba71fa1b09a44d1edcdc80b7e2b1fd8ff6d7b56ad4e9fed", + "goAllPackages": "passed", + "programRetirementAndPreviewTests": "passed" + }, + "handoff": "Source fixes are isolated on eleven/local-20261009-capability-audit. Shared Prism uses a current integration snapshot preserving concurrent work; that build is distinct from a clean Git checkout. No real Live or recording was started." +} diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-integrated-go-tests.txt b/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-integrated-go-tests.txt new file mode 100644 index 00000000..921b4198 --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T101625Z-integrated-go-tests.txt @@ -0,0 +1,26 @@ +? github.com/ZabLaboratory/Orion/cmd/healthcheck [no test files] +ok github.com/ZabLaboratory/Orion/cmd/orion 1.575s +ok github.com/ZabLaboratory/Orion/internal/adapters 2.107s +ok github.com/ZabLaboratory/Orion/internal/api 3.627s +ok github.com/ZabLaboratory/Orion/internal/attestation (cached) +ok github.com/ZabLaboratory/Orion/internal/auth (cached) +ok github.com/ZabLaboratory/Orion/internal/bluehost 4.449s +ok github.com/ZabLaboratory/Orion/internal/blueproject (cached) +ok github.com/ZabLaboratory/Orion/internal/bluespike 0.379s +ok github.com/ZabLaboratory/Orion/internal/bluewire 1.553s +? github.com/ZabLaboratory/Orion/internal/buildinfo [no test files] +? github.com/ZabLaboratory/Orion/internal/canonical [no test files] +ok github.com/ZabLaboratory/Orion/internal/compiler (cached) +ok github.com/ZabLaboratory/Orion/internal/config (cached) +ok github.com/ZabLaboratory/Orion/internal/conformance 1.223s +ok github.com/ZabLaboratory/Orion/internal/effects (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdp 8.055s +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 2.223s +ok github.com/ZabLaboratory/Orion/internal/obs (cached) +ok github.com/ZabLaboratory/Orion/internal/protocol (cached) +ok github.com/ZabLaboratory/Orion/internal/providers 1.309s +ok github.com/ZabLaboratory/Orion/internal/runtime 8.302s +ok github.com/ZabLaboratory/Orion/internal/streamcontrol (cached) +ok github.com/ZabLaboratory/Orion/internal/workload (cached) +ok github.com/ZabLaboratory/Orion/internal/ws 2.341s +? github.com/ZabLaboratory/Orion/third_party/lsdpnative [no test files] diff --git a/evidence/local-20261009-capability-audit/eleven/20261009T103000Z-integration-baseline.json b/evidence/local-20261009-capability-audit/eleven/20261009T103000Z-integration-baseline.json new file mode 100644 index 00000000..f6be6336 --- /dev/null +++ b/evidence/local-20261009-capability-audit/eleven/20261009T103000Z-integration-baseline.json @@ -0,0 +1,2206 @@ +{ + "source": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261003-source-delivery", + "head": "7f13e85f487e2bbfbcac304d29ecf36276197b0e", + "files": [ + { + "file": ".file-size-exceptions.json", + "sha256": "a3f23db50b34cca770c8f3e62f99d452937bc167071ecf6c9981cd75d08f8d01" + }, + { + "file": ".gitattributes", + "sha256": "113c1fd4258b2ef80f29c07548b3ba91193c1eba361f6a7026accf1e5c476c45" + }, + { + "file": ".github/actionlint.yaml", + "sha256": "6cfd1ee44b9768499c7293ae5ce3036ae988e882e888104bd99b88d8c1c4f1d7" + }, + { + "file": ".github/workflows/ci.yml", + "sha256": "a3a1fb84f3a788f062b0ea899433d6e0a1749116d0b5b9f98f7fe831214cd0db" + }, + { + "file": ".github/workflows/file-sizes.yml", + "sha256": "3f8a6aeb0bd4661fb01955251eb05ee490952a76a8f2bba3aae0d76aacf47609" + }, + { + "file": ".github/workflows/release.yml", + "sha256": "31dd91c48d34b6a3f6043a4bb6198229047743ca69af34c934cb4d2057c1e1cf" + }, + { + "file": ".github/workflows/win-sidecar.yml", + "sha256": "5cccab5c6b0028ce73ccd874e7a530d6fc661c5f906e82f5cb85a28d4faff51b" + }, + { + "file": ".gitignore", + "sha256": "99eef2af7bbdbbec03ab7166094697c10f507ad0bb470df6a651eab1c6dff576" + }, + { + "file": ".golangci.yml", + "sha256": "a31f5841d69149910f5417388f1f40e66f43b4e46034ab23d8d58bf26dd86f1b" + }, + { + "file": ".health.json", + "sha256": "f10d3b2aa764ea79d5733fa0dcba557205cd7888d1759c7e23d8da63249a7a25" + }, + { + "file": ".pr-body.md", + "sha256": "9528e0e3ecdd8f0638d3c39239fea5f613d7bf28dc09cd845dac31fb942697c0" + }, + { + "file": "CHANGELOG.md", + "sha256": "52f58e0700dc584c9adca714a7ee594e53934210e73497a3c499c639e56f3e70" + }, + { + "file": "CLAUDE.md", + "sha256": "5db617bc08ba97babb7356f7850871a420c23b3531cefca664a1aaf28d1e8952" + }, + { + "file": "Dockerfile", + "sha256": "914a67e284a723ed2feef423bb37a426814dc80d529533ddd7bac00730f7dd33" + }, + { + "file": "README.md", + "sha256": "152592a479fbaa2aac15885e9b84ae8cf68f1b90d17cfd3a2580387c51e6a3cd" + }, + { + "file": "VERSION", + "sha256": "c28fcca53637bc88e124af1725df13cb98c69dedefd62fb3cdbe1cdb6b760624" + }, + { + "file": "attestation2.md", + "sha256": "78fbf5701e12291f0bcf64f99812285b3f6861237c698b7b8c66932c03b221d2" + }, + { + "file": "attestation4.md", + "sha256": "a815d6030158c23c8ec773c7946b31e49b39bbb5629a8d72db273328a42c01a4" + }, + { + "file": "cmd/healthcheck/main.go", + "sha256": "4a919546eb9de017663cc87fea5e9e9ebc781334a41ba2d809faafe613e6cc71" + }, + { + "file": "cmd/orion/camera_slot_mirror.go", + "sha256": "e14dec0cdb4c4d0fceb729197b5eb93dcb6aef69594c91941f069be011c8eb60" + }, + { + "file": "cmd/orion/egress_boot_test.go", + "sha256": "00cb86327dd54cba7e9980806dc617eb470393559d0431c257b4fe8ef56fc9df" + }, + { + "file": "cmd/orion/egress_wiring.go", + "sha256": "57f36632a521172f453f755d44f7288e25aee7ad29b8609e036815153bf920bf" + }, + { + "file": "cmd/orion/egress_wiring_test.go", + "sha256": "832f1106fe0acb9e0e36cdd905ff5851fc25cec12ae87e4d118093c06a77997e" + }, + { + "file": "cmd/orion/main.go", + "sha256": "3555f4cba5f7c7c8333b8489bb7259b340dc7f38a91052499bdbd17f1691ed2d" + }, + { + "file": "cmd/orion/mirror_wiring.go", + "sha256": "fe06c093b2fd67d2a36d0540aa1ee4b3de9295c3c8ee851f214703cff50dc21b" + }, + { + "file": "cmd/orion/mirror_wiring_test.go", + "sha256": "55eee7414eced91f100746685c64cd955526e277fc203702f9477a9d002bcfbd" + }, + { + "file": "cmd/orion/platform_event_sink.go", + "sha256": "4d9139452bd8f84c837ed5a2f5d20ad371ff6e5bb550f12336d2b0849e911823" + }, + { + "file": "cmd/orion/platform_event_sink_test.go", + "sha256": "28ac9e8e3ede7ffec165c8583c2295e24fa38aae250faba00c93c65f34ec0207" + }, + { + "file": "cmd/orion/scene_control.go", + "sha256": "1c62e68fac2d4c72815ec10323d69471e5ff79bb20c662aeb2bf7f14a9122313" + }, + { + "file": "cmd/orion/scene_intent_local_test.go", + "sha256": "a4466882f5a27764b03622169a6f058ef77c65c1d586d4deea9cac65f88d35fc" + }, + { + "file": "cmd/orion/scene_intent_wiring.go", + "sha256": "9d5fd31ec444f97fda10bd72734f39390c85f652e88bfc8e8a22d53c52295fef" + }, + { + "file": "cmd/orion/scene_intent_wiring_test.go", + "sha256": "9b8e18185baf4fb0a0f42c1056b08d0a617bfc852f72fb7a324022bc7eb95860" + }, + { + "file": "cmd/orion/stream_control.go", + "sha256": "f5951c378ea39e4feb390063cef81b0401e79c405cf111dcabccae153748c0d0" + }, + { + "file": "conformance_allowlist.txt", + "sha256": "9b991084dd0767b20832b9d4b9b5560ddc76684705616ffea4d0199cd63945f2" + }, + { + "file": "contract-fixtures/core.http.request@1/http_request.v1.json", + "sha256": "a92dec30a61973a5b2b1920fad7770d7f063f8414df24d9e4cfff1511050787b" + }, + { + "file": "contract-fixtures/core.http.request@1/http_request.v1.json.sha256", + "sha256": "5750ca59a72f14c8932cb67fd607a1f414219eb67e5eea0c0a726635465d0b8d" + }, + { + "file": "contract-fixtures/inventory/e3ef100a4e0f.json", + "sha256": "9872b82fb79e49a6f17e712c53183c167988424c7516ea29a1891747cfa96a8d" + }, + { + "file": "contract-fixtures/inventory/e3ef100a4e0f.json.sha256", + "sha256": "330dc1a3d5b2b7abab2c4bb44ac7d0b5a42dcbadef738b8709ae2cbef8e9cea3" + }, + { + "file": "docker-compose.localstack.yml", + "sha256": "cd2ea3937938b93fb6eb5962be134a50e5a3cd1d2663fa0854d278b4daeb035c" + }, + { + "file": "docker-compose.yml", + "sha256": "1b623d4ce9dadda972177bcd0c3b442912f9c2b15df10bc638a9ff6bdf2c8d15" + }, + { + "file": "docs/adr/001-multi-blueprint-push-envelope.md", + "sha256": "65af77545aa43e799790a0dab3ab28e5bf6a655b48d68ccafd2b0fc40ed41dc0" + }, + { + "file": "docs/adr/002-scene-lifecycle-canvas-orion.md", + "sha256": "c4fddd18b192159f6416cbbfdfe4250d7440b4352e151b813ab52e9e7c75ce3f" + }, + { + "file": "docs/adr/003-full-blue-execution-engine-and-scene-validation-gate.md", + "sha256": "fd8f12fd51f517958ccaebc37492ba53b5b24f052b657d0cf34a88d22a5b8cfd" + }, + { + "file": "docs/adr/006-exec-activation-r9-lift.md", + "sha256": "a52f81cbb6f52aad14bc5b99af26bc4be262b71da18c21c4cd126711ccf33cf9" + }, + { + "file": "docs/adr/007-db-atomics-dataflow-descriptor-builders.md", + "sha256": "d9f6d3275410a604234055d4f5477520631741f23e82a4e3b6f54267488704bf" + }, + { + "file": "docs/adr/008-active-scene-only-execution.md", + "sha256": "3bf6d979aa812bff2f6b6ba6a51529460ce68b2299e6f6369e133b04bb112690" + }, + { + "file": "docs/adr/009-stream-level-blue-rules.md", + "sha256": "67eae8fc4609c92d41d5a94339a4d14dcd72788ce97df7895529e1c91213c671" + }, + { + "file": "docs/adr/010-http-request-executor-hardening.md", + "sha256": "d3d57cbe433509fcc2a4742b32d6fd846e08164e91280f772825776aa618ae76" + }, + { + "file": "docs/adr/011-animation-play-keyframe-lowering.md", + "sha256": "ff04bbd782d5d28f9570b9ebc3f90ce4142ee8e84dcaaae447108aa119dc4de9" + }, + { + "file": "docs/adr/012-source-read-reclassified-compute.md", + "sha256": "af8131665f8e3c3cd0d00315dbd2bb41b22730c76bfb01ec8747bb4288b0f9f9" + }, + { + "file": "docs/adr/013-platform-event-exec-entrypoint.md", + "sha256": "e29c31b23a2a2eb1fd6527c72081441cf635a77e1af24d9b08dc7172060fd8c8" + }, + { + "file": "docs/adr/014-blueprint-reference-compile-expansion.md", + "sha256": "2ddce915c51be7c7dd9d0df2bbfa7df81cf858a79493131f0cfcad0f0e271482" + }, + { + "file": "docs/adr/015-service-scoped-simulate-endpoint.md", + "sha256": "4fb231ee9f8e3999b6124b6e1b65cb50faa702fbc577c61adb7cada002044af6" + }, + { + "file": "docs/adr/016-embedded-local-execution-profile.md", + "sha256": "b0d19fd383d32a6b927ebc96ca62ac2dfbf9991327024f2b7a5d60ec8d3694cb" + }, + { + "file": "docs/adr/017-blueprint-direct-full-graph-compile.md", + "sha256": "e6529489f0f84ba404ecdf36c7ef10411f116933888229413d5f70716d8177e5" + }, + { + "file": "docs/adr/018-ci-postgres-substrat-runner-zab.md", + "sha256": "0493ca239a7212bc979ed5cd1f3e383da065b039c56dc40b208e40e7efda1852" + }, + { + "file": "docs/contracts/adr012-source-read-compute.md", + "sha256": "c7afd62329e7e6d45445af99cba13e79ad68a3a6e4ca696061333bc97e3226ed" + }, + { + "file": "docs/contracts/embedded-local-contracts.md", + "sha256": "4f5edbe8c6b4d1caec3a14fcfc09deaa1b768997f9b0825200929f1377fcef31" + }, + { + "file": "docs/contracts/phase3-wire-contract.md", + "sha256": "630528324da728c71d92c6788074eab1333f93c9a30118f7fd024a1f58a9aa39" + }, + { + "file": "docs/development/extending-orion.md", + "sha256": "ac28ca304cdf6c27269e96cfa87d48253663a3c96d6f9822e7133cee893544a0" + }, + { + "file": "docs/development/file-size-policy.md", + "sha256": "9b25c85334ba2df209397a57eef923fcb2adeb77c114aaca0c186206c4362388" + }, + { + "file": "docs/development/maturity.md", + "sha256": "a26f2d1469485b91a928981de236575128effad494fb7597100443781b828e6a" + }, + { + "file": "docs/development/scene-control.md", + "sha256": "7091f5951bc660fdc47c023a46cf816ec3b21611c5b853d8f34c4a5cd89b41f3" + }, + { + "file": "docs/development/scene-feature-map.md", + "sha256": "5a1fafbcc39ff9ae6e28cadc28f21fb39b500fc5fa2db687c827fb58b21c03b0" + }, + { + "file": "docs/development/source-render-boundary.md", + "sha256": "85be15918e6c6c32d61188f59bf03b75f512be186429488abafab3b2aea2dd36" + }, + { + "file": "docs/development/workspace-layout-repair-20261006.md", + "sha256": "f2bf8674e2721fb9b1d57559275281faa4db80facea49ced64fa6e788b4cbca2" + }, + { + "file": "docs/proposals/319-postgres-ci-canon.md", + "sha256": "ce2ffafef53d2b27c11bf5a11b252a7e55b98bbfbbafff4aa5328b33b41d5b04" + }, + { + "file": "docs/runbooks/canary-scene-payload.json", + "sha256": "c0dd67984bc9f11a33929525eaad066770dfcfd5dbab55a8f8c2a6b7af965d52" + }, + { + "file": "docs/runbooks/canary-scene-payload.md", + "sha256": "138849c5334f65ed7e9bd377f9a785136dbc33e59e198a9e582d1851b73d5552" + }, + { + "file": "docs/runbooks/canevas-chat-sponso-black-screen-recidive.md", + "sha256": "ce77e9abb3f0ab05534dfbc7591496564004eacc373d7b471bffd15b17aaecb2" + }, + { + "file": "docs/runbooks/ci-runner-orchestrator-backstop-poison.md", + "sha256": "b3e1761dd3062775ff59424dd45e42dff3c7a762fe087093fba38713081fc3e6" + }, + { + "file": "docs/runbooks/ci-runner-pg-image.md", + "sha256": "70be77fbac89c7404a01d9ffa0a6926e72810fe7182af6f4324b7de3e50657ef" + }, + { + "file": "docs/runbooks/e2e-pg-idempotent-bootstrap.md", + "sha256": "7ba9146ba1d89e15bd9c65c9ff9d5e68ac660142dcd1efd89c2aa3fe103255ef" + }, + { + "file": "docs/runbooks/e2e-shared-db-schema-isolation.md", + "sha256": "48171a4af590ad8282270615068057c289b46e481cb5e12604692894da325875" + }, + { + "file": "docs/runbooks/legacy-store-removal-deploy-credential-cleanup-2026-08-13.md", + "sha256": "c4e5b3c477615628c1c2be103e59dc4aa9ca3935f4c3f17f456f1ad66e607445" + }, + { + "file": "docs/runbooks/local-execution-stack.md", + "sha256": "bfea3d2977b74f00d82e9dcc96519a56e3a23eb08b1e9224fa122319d84d7b7a" + }, + { + "file": "docs/runbooks/m1-reactive-chat-scene-payload.json", + "sha256": "716c1856cb33d28f230779d7e7fcdd48c2d722a9e88a8d22eb62c2b4554fa920" + }, + { + "file": "docs/runbooks/m2-live-data.md", + "sha256": "1e0fa213029b796f809f94a83c2b04648ba6635a2fa9b740898df828097a469c" + }, + { + "file": "docs/runbooks/m3-named-leaderboard.md", + "sha256": "d2ba5988208ec6d53b0f867657b27415655e4b0ab55e6b1d7406edfdaf08a5e0" + }, + { + "file": "docs/runbooks/native-recovery.md", + "sha256": "c1187114fe3238a3a8bff603a4cb4fb65058c599fc1b6ff9cbf4cbbdc0ef17d0" + }, + { + "file": "docs/runbooks/ops-orion-thresholds.md", + "sha256": "52d890b17ddee111035d9c3e60a969a4cef8727a7339ef3280ba7e163a2f137a" + }, + { + "file": "docs/runbooks/orion-ci-gomod-cache-fix.md", + "sha256": "b5aa9ebbf4063a69e4d5ef62e536df7e2cbc47bf2eeed9b98b63b81657d4cd5a" + }, + { + "file": "docs/runbooks/orion-cpu-pathological-scene.md", + "sha256": "c4799898eaea8cf585b5e119de9f35f3887116c2221fa239aeb3452315742a65" + }, + { + "file": "docs/runbooks/orion-exec-first-flight-canary-RESULT.md", + "sha256": "c8032e6cbdc4e61dff0bea9eafddceacd9a8d1aea34d7286b77f136930171f82" + }, + { + "file": "docs/runbooks/orion-exec-first-flight-canary.md", + "sha256": "87cf0b62c9120158bac562cf146807b5423bc088513e126202c95e40371a968a" + }, + { + "file": "docs/runbooks/orion-rollback-posture-forward-only-2026-08-15.md", + "sha256": "f2cb59a39f848cc4ab0cc921f470a082e7585072aa86e7d371d1769b31eb2a1b" + }, + { + "file": "docs/runbooks/orion-vps-retirement-2026-08-24.md", + "sha256": "2d203abf6d8ef97fb32ff9a2d838693b38e662061ad1bfc349bae38f31b95865" + }, + { + "file": "docs/runbooks/orion-workload-identity.md", + "sha256": "c9f7936736b30dae5b8f823670babb780f5113cc6f04a4ee9687c064a65e059d" + }, + { + "file": "docs/runbooks/quasar-finale-scene-payloads.json", + "sha256": "08c7b6dc43103a38ff2e1278afa0257e7fbf1c4859f29cef6d3cc7ec6195a3dc" + }, + { + "file": "docs/runbooks/quasar-finale-stream-level-reactive.md", + "sha256": "29a48585c594aaff0ed2e46693cc95cba894737872e4416b0e98ba7f3f3699d4" + }, + { + "file": "docs/runbooks/scene-recompile-after-compiler-fix.md", + "sha256": "fd561f533cdc5092ca0dcc1b694d887721cff1051c102f1f788bdea9e531234a" + }, + { + "file": "docs/runbooks/service-token-cutover-2026-08-08.md", + "sha256": "a5fdd3f5b38ffaa6ad8b82cf16e9e9a94d2c685490635886171c13682987f4e6" + }, + { + "file": "docs/runbooks/solar-deploy-and-lsdp-flip.md", + "sha256": "4a37d8813de54a272bda659d0e17ae20d44242b71dac762e8066681adc1b4cbe" + }, + { + "file": "docs/runbooks/solar-deploy-host-subtree-hotfix.md", + "sha256": "457d147196829e0dd175c16889dd52268b4c6333fe56378f683cbe4d84578c5f" + }, + { + "file": "docs/runbooks/solar-v0.2.11-capture-transparent-deploy.md", + "sha256": "da82388a75cca7dc4c945e7d7f4141705e602c2fd67e3bb940eeacdc4ee79363" + }, + { + "file": "docs/runbooks/solar-v029-animation-fix.md", + "sha256": "638dcc55645ccbe117dc74c1c626a58c307c9a0ac51f05fae474339600d87bde" + }, + { + "file": "forge-agent-report.md", + "sha256": "8021af1e06506a2c803736275553eeaecb64603366e1da75e6900c155dde5fba" + }, + { + "file": "go.mod", + "sha256": "07042312b6d7e4a85e0ba8a062e5620199561e2e85cca5f7ab8e0ef24a65b350" + }, + { + "file": "go.sum", + "sha256": "cd4dec4eb3ad2ac72efc4d9df26b02736969c2fed01490f6146f9b86db828b08" + }, + { + "file": "handoff2.md", + "sha256": "eae0a777b188f9d0827a9cc965cb48c3444cc13d5252fb64d4ad1bdcf7ad79d0" + }, + { + "file": "handoff4.md", + "sha256": "261e07446ac42d27f6fbd37e12454b84c92b0c709d8dec65199d9303088bfdd6" + }, + { + "file": "internal/adapters/events_dataflow_compile_e2e_test.go", + "sha256": "566a25fae1add3bae978bcbb40aa200346f666fab0a2c73d05861e88a3b1b234" + }, + { + "file": "internal/adapters/helpers_test.go", + "sha256": "b9a0453f3fe95efcbc49ad768fc3a0f294a2bf08fc9e0b9e91f5b4c568a59b6e" + }, + { + "file": "internal/adapters/inbox.go", + "sha256": "2237eab87bf191aca9196f4877467ac0ecfd1cbcd7b10b2f9fc20b98e6141bcc" + }, + { + "file": "internal/adapters/inbox_platform_probe_test.go", + "sha256": "e06af91c46999ad49e0460516a43265aa7ddda15a11570c9466322b0cc588513" + }, + { + "file": "internal/adapters/inbox_platform_test.go", + "sha256": "a6ea382a7b17f8a0b7bc12aee023874fd6ac336e39dfaa267d2f05159f166f7b" + }, + { + "file": "internal/adapters/inbox_show_emit_test.go", + "sha256": "661691aa7c6c67d014e5f6fbeb01b5d12acabe746002a89b53d46cbd80924e84" + }, + { + "file": "internal/adapters/inbox_stream_rule_test.go", + "sha256": "14da7cdd2f6fab142ece84ec955cd38b648d94fcfe5874b0619a8312542168f5" + }, + { + "file": "internal/adapters/inbox_system_probe_test.go", + "sha256": "dd1fcf1aa66f904f424bf2bfd9ac9a87ebdf5e99c0c18b594ff41716d7c929c8" + }, + { + "file": "internal/adapters/inbox_system_test.go", + "sha256": "8ca114b131de337f2d03b4b8bddf3c3e6e8d01073e0e249beba44e5fa7d7b1d1" + }, + { + "file": "internal/adapters/inbox_test.go", + "sha256": "5ab6e791b85cf3c9fbaa1169344e73c1822c3ef52a58aec6f2df484b7e4a9381" + }, + { + "file": "internal/adapters/poller_test.go", + "sha256": "9ddb0c2488af988a67c724b6687a7f044c2b7e77fffd3b4ec1394580105464bf" + }, + { + "file": "internal/adapters/stateless_platform_sink_test.go", + "sha256": "23ed8d3a7f36c5680e890ee936b3fdd560b6ea80e7c6bbb84905139dd7d5d6d0" + }, + { + "file": "internal/api/README.md", + "sha256": "94baccfc18786833f01b07959655a59ee8a80670257954345291c7462fd433fe" + }, + { + "file": "internal/api/auth_seam_test.go", + "sha256": "a008bf91d45d1612b2549026a6d55c4c396e7d726a53091856522fefe84aee02" + }, + { + "file": "internal/api/camera_slots.go", + "sha256": "b1113d659e17c2bf335b07aec8dfe6e328f10a42bca71fca282889715058d2c5" + }, + { + "file": "internal/api/camera_slots_test.go", + "sha256": "8d93ccd99774464f2a4e3672b5ab2459dd380f6752cabe51e2ecda19a95534d9" + }, + { + "file": "internal/api/cockpit.go", + "sha256": "552756e620972ba6d3860a4d5e52a1352055c62d297cfde29a084db00dcae38d" + }, + { + "file": "internal/api/cockpit_source_test.go", + "sha256": "af7559626bc9dc6ac52f02b84d440673821f67c77164d272d8f0ab60f2d78a63" + }, + { + "file": "internal/api/cockpit_test.go", + "sha256": "8c2563b50fea8099de7ad5c3e58313f1f499e2be06d883e6bf43b91cb10a9626" + }, + { + "file": "internal/api/db_catalog.go", + "sha256": "ed88cdafc8ca20419db728b5375777e88bb293f1333c2879dc52f5cc5d8155fd" + }, + { + "file": "internal/api/db_catalog_test.go", + "sha256": "09e3ee062092cf167584c9bea7dd1d8cef1a70a4fa47e54df35e82b32ed79f24" + }, + { + "file": "internal/api/editable_native_delivery_test.go", + "sha256": "ffd45e2d95453a4b6715de6c183905d95b3f53360445d35bc7131576a37540a8" + }, + { + "file": "internal/api/editable_preview.go", + "sha256": "ed9dc090c61d2949872cc30ff0fa0188efe89dcfba530f8f2bd2c0c19a4574a9" + }, + { + "file": "internal/api/editable_preview_compile_test.go", + "sha256": "b1f2636d87b5644b77e80fa7b96a9a4692141d5e717c20659a825beeaa2a26cd" + }, + { + "file": "internal/api/editable_preview_source.go", + "sha256": "519262524d20b5c01ef541c52b4e1f66125c5e2be753d57e8cc18cc5afa3fd93" + }, + { + "file": "internal/api/editable_preview_source_test.go", + "sha256": "4658f171b47b75136743741abb1da5b6fc745e4242650dbe5de12a21c3da2ba1" + }, + { + "file": "internal/api/editable_preview_test.go", + "sha256": "7e1f81beb2b4c9a5eeebcc748da8482a78554d84f2e6ede569becdefbf24ffb5" + }, + { + "file": "internal/api/engine_b_fixture_test.go", + "sha256": "1b2226ba778898e32653932278fa4297ccb230362c1dff1808bc5f0c1c2002be" + }, + { + "file": "internal/api/exec_completion.go", + "sha256": "7976ee6c0aaeaf84c35394f74111245978100b1da7327643a9d3ecef47f3dfc2" + }, + { + "file": "internal/api/exec_completion_probe_test.go", + "sha256": "bc4bea9efcccf0bb90287165d3d91647f3ee7e16160ed90aeb8146a3d2add858" + }, + { + "file": "internal/api/exec_completion_test.go", + "sha256": "309c17b058918e640c052d2f8a5192dba6515133ab43627a4204e4e94fa3fb23" + }, + { + "file": "internal/api/host_surface.go", + "sha256": "ff7712dd35eed27f2d7ca6afc86c8cd4ca1591cef38acb64bcf658f644573d01" + }, + { + "file": "internal/api/host_surface_test.go", + "sha256": "6493b8e0f351f4833c13cc3737727ad8694343a222f9dd36be6a77c35ab27a13" + }, + { + "file": "internal/api/lsml_get.go", + "sha256": "ba1f0bcf2a2538cac4b1a9de3f18eec0143163a9545120f0a4d3be2a370bf108" + }, + { + "file": "internal/api/lsml_get_test.go", + "sha256": "975d2b78599d57963d63ac80d04c98685e5a73760059b09b8d0aaa0a31dd926a" + }, + { + "file": "internal/api/native_delivery.go", + "sha256": "c66cba64be1c046315b074f394050ebc1bd1de9589d0190adee07c5b59d4795f" + }, + { + "file": "internal/api/native_delivery_test.go", + "sha256": "2b80a6bffb9bf894c056881cce6c16c2fdfb211c2579b5af85598400e448ec6b" + }, + { + "file": "internal/api/native_operator_visual_test.go", + "sha256": "a1bf7d7dba163cf28540544d413d0c95e4487e51abfd41bca3d33493d1c024c7" + }, + { + "file": "internal/api/native_reception_proof_test.go", + "sha256": "b2411ead4f7da626a41c45b4ea1830f980ac9fdd0a2a30d4dc74b9454dcac859" + }, + { + "file": "internal/api/native_reception_ready_test.go", + "sha256": "c69d6124f9e37daa2a3dc5ee94196fd279db3d6b6f68d78330e12675f6e14cf3" + }, + { + "file": "internal/api/native_scene_presentation.go", + "sha256": "fba979cd7a1fe93a18288df0119a210525b4a4324fa57a8630fc91715a616683" + }, + { + "file": "internal/api/native_scene_presentation_test.go", + "sha256": "038554308a93c462ff941093ad6f0bd20d3c1e49552adfbab94bbabdc4256f9f" + }, + { + "file": "internal/api/native_session_test.go", + "sha256": "c58640c928b72af1bca0af16e1dbb33dc401cf879665d10961c556e787eeead4" + }, + { + "file": "internal/api/operator.go", + "sha256": "98036a010037fb03274c21528dca0719caa72ef6ebbe22f7f656974e2892803b" + }, + { + "file": "internal/api/operator_authz_test.go", + "sha256": "42a29ae73ee8e94cb72298a51096623f427709435e609963c03f5f0b34a94dde" + }, + { + "file": "internal/api/operator_dual_slot_isolation_test.go", + "sha256": "aaef0911e29254949fb5ddc8bc2766ab4f727b1ec1d22be5e2b3972603d5c0e9" + }, + { + "file": "internal/api/operator_execution.go", + "sha256": "d2a96d8f28c0f8e994206c48f8c7320b06d7a92542a3df5e0feb6f4f09caa027" + }, + { + "file": "internal/api/operator_execution_test.go", + "sha256": "0dce3d15777c410adca5705d76e7bb2cb9d864d2c4cfa9e8acd1ef9a20631e64" + }, + { + "file": "internal/api/operator_preview_engine_b_test.go", + "sha256": "64c292980b9d87a6d89bfaf1580e0f43e654e072181cd926fd5ee7e24e3a0304" + }, + { + "file": "internal/api/operator_route_keying_test.go", + "sha256": "787a08a12ef1e05ca368c99d207fd465d5562b8430a52fc354de3acf8953b05f" + }, + { + "file": "internal/api/operator_target_unknown_test.go", + "sha256": "c2da3fb1e99aac149f72eb70748f39917ee4a72dafa095012a0bb922615bf365" + }, + { + "file": "internal/api/operator_test.go", + "sha256": "dd0f44f5fd43b38f45c94142ee61de633b8967faa3f2a947e51b594cf69c8c7d" + }, + { + "file": "internal/api/public.go", + "sha256": "09cc90b203fd1ac59c7df8a444d869c88bc6935f9e677dcec441595b33b32f1e" + }, + { + "file": "internal/api/render_bundle_validate.go", + "sha256": "26ffe334d47a79065747c45067d8f56cd9b10c8268de8f95d070a90a7327d204" + }, + { + "file": "internal/api/runtime_descriptor.go", + "sha256": "c3834d0fd4ac74b846c31898e4773fb78eb0f66b70bc1e06329a783dcbaceaa9" + }, + { + "file": "internal/api/runtime_descriptor_test.go", + "sha256": "f31522918cfb76c003ee3bdd8aefc79459428b7a2c7d0368075045129731bda9" + }, + { + "file": "internal/api/scene_blue_manifest.go", + "sha256": "b71a47524a246bb604777177aa64acae0e9cf8df6bee839f3bed48a3c0092d0a" + }, + { + "file": "internal/api/scene_catalog.go", + "sha256": "3b567101e0f8de07057178d7a198019a176dc8b57fd04561fe3ca8a4bf220ec2" + }, + { + "file": "internal/api/scene_catalog_test.go", + "sha256": "36f94103a53f73c1ab306f6ffa4d0d4f04c702f03c85c29060bf33f4d87d5a2a" + }, + { + "file": "internal/api/scene_control.go", + "sha256": "f643ce41ff90715b26572901495ff94e7663526df72365ce1cc40ad9e88a283f" + }, + { + "file": "internal/api/scene_control_native_test.go", + "sha256": "c40ff2415bf7e52b2952f810023bf8d17801168a37bcf65672bd318e3b18f7ff" + }, + { + "file": "internal/api/scene_intent.go", + "sha256": "945e3e1413ebbc46ace5a09a153483dd0a43a8016128b230b37467108ef14b33" + }, + { + "file": "internal/api/scene_intent_artifacts.go", + "sha256": "3fb5216b328df3821c6467ac4b44d5a03d887fc7eddfefe0f0fb50b52e85c6a4" + }, + { + "file": "internal/api/scene_intent_bridge.go", + "sha256": "0f7a6bdd45a7aa5aedaa06cff6589831cf9294a095945fae0fe6c5701ef943a8" + }, + { + "file": "internal/api/scene_intent_bundle_test.go", + "sha256": "19a280473d5b88da00e08ee245021d87d633508fcff7b5d696b7f0c9bb519904" + }, + { + "file": "internal/api/scene_intent_concurrency_test.go", + "sha256": "f2d817b14915c1a7e6750e24a04a61fa203e3dae1cb44a3187774d37fb4cf705" + }, + { + "file": "internal/api/scene_intent_current_render.go", + "sha256": "8b53fb333933f5cd36d84bbf3e457e014f4821f1314b64c88100c953aac3d1e1" + }, + { + "file": "internal/api/scene_intent_databound_benchmark_test.go", + "sha256": "0cfe9f1558e79ae3963fb671b61e4723b740c093f4e2d4701260e768eef35bec" + }, + { + "file": "internal/api/scene_intent_databound_test.go", + "sha256": "d43dfdb27ffc393df03995c9e0e03766d3a9db83e9e4c058943672240115ca59" + }, + { + "file": "internal/api/scene_intent_idempotency.go", + "sha256": "cb821ce0b4e5c832bb226faf4cc87337848f9fec7f36268b68135c08d0f17350" + }, + { + "file": "internal/api/scene_intent_identity_test.go", + "sha256": "00319166fcb276674ed6f1dab0157beeef42b2a7ed118e5df21e76919f3257a5" + }, + { + "file": "internal/api/scene_intent_local.go", + "sha256": "8f7a7b24ebc93062d645a104b57057d8b9b09018bf63f6ad71dcce53933eaafa" + }, + { + "file": "internal/api/scene_intent_local_test.go", + "sha256": "5545da952c3f65bb5fceb3919295b690f587ab3bb0ee5faa437db9497d1099f0" + }, + { + "file": "internal/api/scene_intent_noblue_test.go", + "sha256": "a342063099385256fabbe970ca65a0a2dc330738c9ee0db38f5d548355456198" + }, + { + "file": "internal/api/scene_intent_providers_test.go", + "sha256": "ba2314e0c840623b47624ed72b44d1c65c0777eecc56075c35e6aa18401f606d" + }, + { + "file": "internal/api/scene_intent_source.go", + "sha256": "9fddf431c3719613756411146fe458b4e6d83c924705034380917596ae306937" + }, + { + "file": "internal/api/scene_intent_source_test.go", + "sha256": "6166821333e54837776bf574b822292644901413df9b6c8e7b2d33bd99f9ced3" + }, + { + "file": "internal/api/scene_intent_static_test.go", + "sha256": "1de9fedfa74b106fb14b61cfc2d122c9b1c1bd3ab883842201980c2b44312573" + }, + { + "file": "internal/api/scene_intent_status.go", + "sha256": "e0148a10a06a4a9e3e6dcb7ba8534b9834f340db115253e1e029aeab2e892ec4" + }, + { + "file": "internal/api/scene_intent_test.go", + "sha256": "88a8a7bf51370c1dfe66f94385b1dd06bdf4318743265a86f08b4a3fa5ef4dc6" + }, + { + "file": "internal/api/scene_intent_verification_cache.go", + "sha256": "783abd4dc0493d94e53da7c8387ba4c239efb5649200d19181e62f1daf12601c" + }, + { + "file": "internal/api/scene_presentation.go", + "sha256": "05f68249b7afb8f2aacb9352459ff3d764c6fdf3b58ed8e4a83f583b4dde80a3" + }, + { + "file": "internal/api/scene_presentation_test.go", + "sha256": "f5b387bf8bc1f080698e7f3455cde2d103227aafc31f796e5ffe49b67253a888" + }, + { + "file": "internal/api/scenes_get.go", + "sha256": "5e775a6b42ccd88fe8324aab27e165f3b5e21d71ca4a664fabbbac6151dae20b" + }, + { + "file": "internal/api/scenes_get_test.go", + "sha256": "211c45381944122cf80fcc65d4b26fd716279f4776875fcf1fd3e74194ee6063" + }, + { + "file": "internal/api/show.go", + "sha256": "a0b3ec6faf127285df3859eb8a95637c436af56a6f1e99b13e21286a341c2a9a" + }, + { + "file": "internal/api/state_snapshot.go", + "sha256": "810f1f7d939686d8c83681f259984a2e5169bde6a24fc5f56360ebc5faeeb62b" + }, + { + "file": "internal/api/state_snapshot_test.go", + "sha256": "ee27fc073fcbdfe8a875447379fac1f3b185465e67b3f9a20167f7268ffe27bf" + }, + { + "file": "internal/api/static.go", + "sha256": "cdf3384a3d264c7ab4db8924ff90b6537afc477f2a987c3e08102a1ac2853d40" + }, + { + "file": "internal/api/stream_rules.go", + "sha256": "59d557227e94acc46883d8aa2658f1be5e459484654dc804fc23259026d55e5b" + }, + { + "file": "internal/api/stream_rules_test.go", + "sha256": "b7c57651044fd4f1dfc7ebe7335a3760356ff211df6906f2c1a5a8d5411b388b" + }, + { + "file": "internal/api/testdata/orion_181_chat_overlay_program.json", + "sha256": "fc5cd671729f44bbe09ad278d93a8cc0ac0add9c275c541df2aa6b16f4a3b97a" + }, + { + "file": "internal/api/testdata/scene-lec-lck.README.md", + "sha256": "70a4d0beefff49a9a2bd94d4958e514ba30a717f655df82099a73a55748cbd70" + }, + { + "file": "internal/api/testdata/scene-lec-lck.program.json", + "sha256": "9754a0b16acbaa5f061e9b45189b9a21443deb97ed37449d277b339f77a2b7b3" + }, + { + "file": "internal/api/util.go", + "sha256": "5a7b5c7f02798fcebd1ff236df69860cdbb4ec15b616254bd5631d6b9276c07d" + }, + { + "file": "internal/api/validate_program.go", + "sha256": "a512bd9acdd1d0057393f01b864594514892dec6df60fd289296e091b7e145b7" + }, + { + "file": "internal/api/validate_program_test.go", + "sha256": "bad33285b357acb7ab46f9773780fc959ae8c6924f30e6b29eccd69d0c9c6ce2" + }, + { + "file": "internal/api/validate_simulate.go", + "sha256": "da31d768e6f07a1bcdbd787121948f4853a65fe0fb3d11c360ad306a2f7055da" + }, + { + "file": "internal/api/validate_simulate_test.go", + "sha256": "0562917433c4d128f2ed3376c5b516d0cd24a4bb47605689d82d245f29760d80" + }, + { + "file": "internal/attestation/verify.go", + "sha256": "22ee1d62ee71d6471e79522844363af307bf1b1d63fbc05d86e7c6d39f0d1347" + }, + { + "file": "internal/attestation/verify_test.go", + "sha256": "e92542ac22afade46a3481890412635a93fa3581c1c0581d3a5ed728f35f2f2b" + }, + { + "file": "internal/auth/auth_source_test.go", + "sha256": "31c8b9e0fa8968d25ed9c3c37a6d5924ef81e75775c9f4a66c50bc4f5743996d" + }, + { + "file": "internal/auth/identity.go", + "sha256": "d204d500da2c7e8bcfc61717ba6b58021fdb743f405035e1199e71bb4699b1a5" + }, + { + "file": "internal/auth/identity_platform_probe_test.go", + "sha256": "2b36b95a005457c08c4132e09d053c1ca375613ea0be3d705a5d417faf206131" + }, + { + "file": "internal/auth/identity_test.go", + "sha256": "b4660b657cbe6cde9ba301a585181134505e7a032a2bbdfc8e5bcb1ef8693751" + }, + { + "file": "internal/auth/local_operator.go", + "sha256": "6ef64d40da7e8a491d03e5661d4ee5893e6cf651a1e65aedc807c635c8cbb6dc" + }, + { + "file": "internal/auth/local_operator_test.go", + "sha256": "0a2e29e06f5a458c1a5c9db4d63bd8b035bb3566371dd6f15fa784c51bc91c20" + }, + { + "file": "internal/auth/local_service_token_store_test.go", + "sha256": "c4388b148ad0d434d2a4e8dfa847b921e901925bde7243bfd678c84b2474d8ed" + }, + { + "file": "internal/auth/probe_test.go", + "sha256": "636f8a9f048af2721f0e5c2243f3ba0742c7dc368f6169324dabf7b298fdbcbf" + }, + { + "file": "internal/auth/service_token_manager.go", + "sha256": "5bb50a9e52319a55c64111921584a4f767941d8fda46922b3f763ea6de9657be" + }, + { + "file": "internal/auth/service_token_manager_test.go", + "sha256": "60e304bd95c96c312c5155eea0c8091c42dde7de243d7a51325df733cdf1f090" + }, + { + "file": "internal/bluehost/README.md", + "sha256": "b23173dbb7607bd825109dbabf880d33322126b1f5bb4022e81eed396a921d36" + }, + { + "file": "internal/bluehost/effect_animation.go", + "sha256": "aa28607a06f5cfbb78275788c107b38b99066591372213ac591cdb1d21a30cd6" + }, + { + "file": "internal/bluehost/effect_assign_slot_test.go", + "sha256": "717df583e5e13a1a202933ff774b711fd76e986b6d382b09ba4ea00b59394cea" + }, + { + "file": "internal/bluehost/effect_http.go", + "sha256": "d046e850be5c2a92f7b10b00a3aa49aa8d08efd49c6b2f48fdf508309633d987" + }, + { + "file": "internal/bluehost/effect_http_gate_position_test.go", + "sha256": "c43267bd0180cdb7e62f2b844e3b17ca433c74bfb3e0e51f633f5d7104ea17d4" + }, + { + "file": "internal/bluehost/effect_http_integration_test.go", + "sha256": "d594e98eaa337c4fde9511697f9bfa774fd9d2a6548d11bb7b62f5fed829b235" + }, + { + "file": "internal/bluehost/effect_local.go", + "sha256": "d45f075708fa76a9be8223a2564beeefdde1bb3b6de35e67ae581035ec9faa58" + }, + { + "file": "internal/bluehost/effect_overlay.go", + "sha256": "d15d91a08d60c836036193d0a4b37f58ccf822cdf54ccc3eb7d7ebb9de68b14c" + }, + { + "file": "internal/bluehost/effect_overlay_test.go", + "sha256": "864ccce16be97c4d2171fff51af448b06fb8699119ecf41960578436d1be9fc3" + }, + { + "file": "internal/bluehost/effects.go", + "sha256": "5b9880454db9e16fe3da93d0055abcd90e63a066d029ccca1be240d336ca8713" + }, + { + "file": "internal/bluehost/effects_preview_db_test.go", + "sha256": "56aaaecbde641ecb2544ea7def7748355448186bbb8470e4603301fa43291caa" + }, + { + "file": "internal/bluehost/effects_preview_read_test.go", + "sha256": "c65331b5c70ff23c0043b80f5c97e2b418e02e275d52bd69fbee503f4e55139e" + }, + { + "file": "internal/bluehost/effects_service_parity_test.go", + "sha256": "e7313a819273b7fa687fdc8f75fab40648bd13f2d875a449db60e29084c210ba" + }, + { + "file": "internal/bluehost/effects_test.go", + "sha256": "e6876dbdaa7b199970038f914f21db7d7efd5fdd04f8d68f8de14163dae80291" + }, + { + "file": "internal/bluehost/event_router.go", + "sha256": "c8d1b848c10cee37e5117ac9d7636f491c79baaab9bf4db36e452269dcbc016b" + }, + { + "file": "internal/bluehost/host.go", + "sha256": "1f692203b77e069acc8388428f705ea5e51c64ac75396b3e09714a224209aa0c" + }, + { + "file": "internal/bluehost/host_entrypoints_test.go", + "sha256": "e05ba6b721b918dde73fe9ada2d9d1ffec408dfd16c3f738b609a7e21dc581a5" + }, + { + "file": "internal/bluehost/host_static_test.go", + "sha256": "d70ded60b49fb8a2ba680c3a832dfbfd18c606e21482ea97701c11512f1eb6f8" + }, + { + "file": "internal/bluehost/host_test.go", + "sha256": "4abdccc94687cbbe7728ab4466639a69738ac7a683cc3b8f171286c35a804e15" + }, + { + "file": "internal/bluehost/http_transport.go", + "sha256": "11b3b1f056a025aa6dec28a1c9fe633ea679b8821cff7b883f736887ed22b03d" + }, + { + "file": "internal/bluehost/http_transport_test.go", + "sha256": "1acef749c92f952f5158fe90f2edbe0114257809e995c207d8f1e51b21617d41" + }, + { + "file": "internal/bluehost/marker_process_test.go", + "sha256": "99d72d1a729c9102b334a89b1a6050c8479e064da25ad5ab2aecd336e08b18ec" + }, + { + "file": "internal/bluehost/outputs.go", + "sha256": "03d185788e18a81a13b537d81e6abbc652e4d2f0e271d5c98038bde4cd1d1a27" + }, + { + "file": "internal/bluehost/outputs_test.go", + "sha256": "26c30362b1da2509a392f329abab6a6b027bd508622b606b91b72d8c1837f5d5" + }, + { + "file": "internal/bluehost/program_metadata.go", + "sha256": "810739a3dd57556ecba6dc54e48149d15077221ba222f88932fd9163885db2cb" + }, + { + "file": "internal/bluehost/projection_test.go", + "sha256": "b55df2dd287f5cb05c98d0ae2a954ed06ecd597bf65a6f99265c88adf62016a0" + }, + { + "file": "internal/bluehost/replacement.go", + "sha256": "25d1c7b01bb6e0e2c07dd18144a14e787154c49ce2a11623e1144798324b837a" + }, + { + "file": "internal/bluehost/replacement_test.go", + "sha256": "935ac0f67a32767263231e28f6d251620669b5c61064b568b3c97f8a076f2ad1" + }, + { + "file": "internal/bluehost/rule_plane.go", + "sha256": "a450892ef75d33a6fa233837ed3572e7e19a7a644c319a33fb0c63580dee6768" + }, + { + "file": "internal/bluehost/rule_plane_test.go", + "sha256": "c38e4497d6e1c086474fd741d5d2398d9e46543ea49245c666a25ae09dd19f54" + }, + { + "file": "internal/bluehost/rule_store_test.go", + "sha256": "e7a7da95b48eafe30c31cde9bdcc2aa98af0052a9aeb947498dcf67b1438212e" + }, + { + "file": "internal/bluehost/rule_topics_test.go", + "sha256": "a74ca7dc1a0d0dfb120490764dc73dbbc657e7742658ba19ac5f5903a8705cba" + }, + { + "file": "internal/bluehost/scene_commit.go", + "sha256": "290750226b87349b7809b6d95aa543cb65e9aa6e3d7af05f453e6402acab777d" + }, + { + "file": "internal/bluehost/scene_interface.go", + "sha256": "f064e099eb7bcb425488d152e730fd700affc890168dbb29c0f6d06455262ffe" + }, + { + "file": "internal/bluehost/scene_interface_test.go", + "sha256": "2e365678555986166bb362558217ec01653835ad874126543fdea622650abbc7" + }, + { + "file": "internal/bluehost/show_emit.go", + "sha256": "b7189cd2df9905c0da21f1d078d96e3eb71ff991f5ac14661019c71a4a874a04" + }, + { + "file": "internal/bluehost/show_emit_test.go", + "sha256": "09b49027550de2e8570dc625d870f2f595cbdeeae55f827db4f75168647817e4" + }, + { + "file": "internal/bluehost/surface_test.go", + "sha256": "66128e3b93a5d5a0511dbba1e868b5478061ca23c35e0718222dbc723d6fc5a8" + }, + { + "file": "internal/bluehost/validate.go", + "sha256": "107aa5b98411be26091fb29e233aa20dc31ccc6fbf5d1ae61b99acc03e03c262" + }, + { + "file": "internal/bluehost/validate_budget_test.go", + "sha256": "250d9c892b66a42e4aba1e5a5f9c555da3dfda7132e431939b4bc159c04fff38" + }, + { + "file": "internal/bluehost/validate_effects_test.go", + "sha256": "0020eaecb9205ea8be29897d6cc5612ff286ec71a550744d9c160b9b3fc12cd6" + }, + { + "file": "internal/bluehost/validate_test.go", + "sha256": "10f0038c9ac9d905dc24ae33a87f30cc7db9e8d9e165c4bb22940543f6f0d42c" + }, + { + "file": "internal/blueproject/project.go", + "sha256": "3746630ebff83bcd8b1be1af8b454b24692c2cd0bad5c888dc64246dc16dce2b" + }, + { + "file": "internal/blueproject/project_test.go", + "sha256": "899d234714107cc1b69f950c064610a237c864f9b3b8670047b8070c9ffc7c6e" + }, + { + "file": "internal/bluespike/spike_test.go", + "sha256": "f3d62d3c0468249bc75fb0b97d9cd9c1c75b3ed7c220057ebd4f60a2084c780f" + }, + { + "file": "internal/bluespike/testdata/01-minimal.program.json", + "sha256": "cc4491390a81b7de1a278d8a56cae167b5bc78e523f1391665a157dad2f655e1" + }, + { + "file": "internal/bluespike/testdata/02-http-requires.program.json", + "sha256": "48cfdd602a27de7535faf9bfdf2390a3d5cc88348c7a39068885ff8cc380b770" + }, + { + "file": "internal/bluespike/testdata/03-overlay-app-stream-rule.program.json", + "sha256": "4b2c5427826de37ae51471a2fc9849ddd688471e028f94d1fd10cb5d59ebd6a3" + }, + { + "file": "internal/bluewire/bridge.go", + "sha256": "74769c4fd9a5bf0921c432b8c6eeeb65e297e8b9c5747d65ab19e15cda37c236" + }, + { + "file": "internal/bluewire/bridge_test.go", + "sha256": "2681f22217b52f031e35dae356fc8656cf3b854a7a15540e80c5ee8179d12bab" + }, + { + "file": "internal/bluewire/registry.go", + "sha256": "d205ceedea6f4d220c6f0018b4fe4dabd8dc3cd475fdc89969ca15f614a95739" + }, + { + "file": "internal/bluewire/registry_test.go", + "sha256": "a480f194250967ceb3bf38e9ae3cf2b50aae123d047494f73275a2c01e72c94e" + }, + { + "file": "internal/buildinfo/buildinfo.go", + "sha256": "692f45385706ba9d29a68c0a9cc14f31f0d63af82772e33e4e6b4b3038186409" + }, + { + "file": "internal/canonical/canonical.go", + "sha256": "907296f37b8d513b42225aa3f8180ed344a69cfb26ef49c4e63dc94de17a5521" + }, + { + "file": "internal/compiler/authoring_gate.go", + "sha256": "11aba58fae79ed763d4e69b3c35f2a752e723d6029f3f71d1b8495724a8e7972" + }, + { + "file": "internal/compiler/authoring_gate_test.go", + "sha256": "48400de378276af943a07c6d3c95d24f73b762477179a0add5266629941d33f6" + }, + { + "file": "internal/compiler/blueprints.go", + "sha256": "b629217003665155ef7a8635d56f71d54fda2e7a76096b51de1f25314bd25f7f" + }, + { + "file": "internal/compiler/bundled_fetcher.go", + "sha256": "049cbf95a2a97d720cf853c047a83cc77eb20b9ad328ac45a0be7911142ca64f" + }, + { + "file": "internal/compiler/bundled_fetcher_contract_test.go", + "sha256": "a7b91b9d5b9008a78fcff725d1fab9e983440313e8be7e35a109e8df000d4024" + }, + { + "file": "internal/compiler/bundled_fetcher_test.go", + "sha256": "64dc632ed297f75fbae63c766898acf453d228bb6159cf3508db04569efc6230" + }, + { + "file": "internal/compiler/compile.go", + "sha256": "c33b9846f7aedff760c7f86ce1dcadf52810d25f3f26ec141813b6e01d5b32f5" + }, + { + "file": "internal/compiler/compile_blueprint.go", + "sha256": "4f850eb0ba94baf716e98f64d7dbf912be85d2c8db8720231012a60e4f712942" + }, + { + "file": "internal/compiler/compile_blueprint_rule.go", + "sha256": "d0691d54f6ee2996d9ec6231dac4bfc2ad9bcc55063efdc620b2effeb9c8ccc1" + }, + { + "file": "internal/compiler/compile_blueprint_rule_test.go", + "sha256": "9163a3f05e7ef7390ff2cbb73f8311d62eae0bdd662fda5b12494dcf3b3b316b" + }, + { + "file": "internal/compiler/compile_exec_inbody.go", + "sha256": "a3450138af40b5fe5701f19fe2edc96e3c89c95e37342aeb76125e3ee18171aa" + }, + { + "file": "internal/compiler/compile_exec_inbody_test.go", + "sha256": "2708f3b1bab16447c49c8cf5e7604af48b1b993e3ac6a71377e20a246e96d902" + }, + { + "file": "internal/compiler/compile_graph_helpers.go", + "sha256": "04de776ed435170e07c7ac7282ee66ac202c6ede46e5eedee69f93ae2b81b320" + }, + { + "file": "internal/compiler/compile_multiblueprint_test.go", + "sha256": "a4847c9a244bd638de0907bb24733497f1af9144aa53a92de6f7ae9189638531" + }, + { + "file": "internal/compiler/compile_platform_bindings.go", + "sha256": "9724849fa79ad1a8212309292ff48efc341e43bb17573adc4e61d7759b6fdadc" + }, + { + "file": "internal/compiler/compile_platform_probe_test.go", + "sha256": "4c306183e96f0bac6593cfe2a690ed6a205171b3f146d6e645dabdb360522ae9" + }, + { + "file": "internal/compiler/compile_platform_test.go", + "sha256": "90afcc8ae444f3347548074362de7db11c36f4d67ca8505c9329c96aea65df6b" + }, + { + "file": "internal/compiler/compile_test.go", + "sha256": "7924d36a516c38b256a87ea9f77b7918d60a22f8ec37ecdfee68d8183db93568" + }, + { + "file": "internal/compiler/compile_toplevel_vars_test.go", + "sha256": "4b05a3296a8c2959ee5aa41a1a00b5d6cc08889ba7e1639e04c2b7bc371d88fc" + }, + { + "file": "internal/compiler/diagnostics.go", + "sha256": "b0dad705c9e150f80f3282adeda4bf418ae82804417926af3d8f3c010e701776" + }, + { + "file": "internal/compiler/egress.go", + "sha256": "422ae6406080b02f7504475b67aaf219554efd8d189c1303885999b1df67645e" + }, + { + "file": "internal/compiler/egress_test.go", + "sha256": "839632d155b954771adc8d8397d2624d979a213f7d50f0364e208cc91ca73bb3" + }, + { + "file": "internal/compiler/emit_lsml.go", + "sha256": "b0032fdb2728a6e36ed1825cc5164e5d116d43e2ceac88855667b532bd90fc5f" + }, + { + "file": "internal/compiler/emit_lsml_1_2_test.go", + "sha256": "a6a52401862e4db34e73ca71f8ec3145e4d2966910cd099b6efe2d16cb24fc93" + }, + { + "file": "internal/compiler/emit_lsml_authoring_test.go", + "sha256": "9ff149d7dd5ed1ab6666d302115415ceb33d7d6aac12441c0f134404c001ffb5" + }, + { + "file": "internal/compiler/emit_lsml_test.go", + "sha256": "aee42813d35124e0121ce63ca2a58362257837c95da0df0e05cb86ab3cd4bd3b" + }, + { + "file": "internal/compiler/emit_lsml_xlang_multiblueprint_test.go", + "sha256": "cc1764eaad599fe9c85bc8f1d7a33dbd195552fe03d79bb0440c469cf0f07ded" + }, + { + "file": "internal/compiler/emit_lsml_xlang_test.go", + "sha256": "b5371e01b2275d4c0d11632724ffaaa3d4e528419511f43ea3f6a7486746617d" + }, + { + "file": "internal/compiler/event_topic_binding_test.go", + "sha256": "47940de79acde66f8d0554f5a41f49e1c69b2e2ee2b92731b6eed7845daebcac" + }, + { + "file": "internal/compiler/events_input_binding_test.go", + "sha256": "ca0256d56f48bb17eca65938d71903203a5f594255b72e4fc43ce2767fc9c055" + }, + { + "file": "internal/compiler/exec_partition.go", + "sha256": "f42700ef8b6de1aea9d0631737e76fe85bbba2a90d42b866719efe2e205c28d7" + }, + { + "file": "internal/compiler/exec_partition_probe_test.go", + "sha256": "e9c419997ee6d5332dc32f9fa518bfd7000b5b4f1c5bfb93cda7974b955e6bf9" + }, + { + "file": "internal/compiler/exec_partition_test.go", + "sha256": "286f476545e1dfd099d6f02805740d8823e6664a6a2bfb35d940285b61f75ecf" + }, + { + "file": "internal/compiler/expand_reference.go", + "sha256": "d7b95cc7fb0dc2d07dc77049867063720e71495683c7a9cee334e0d62830e4a3" + }, + { + "file": "internal/compiler/expand_reference_exec_test.go", + "sha256": "a5803a381d564f381b156802c619c82410b771e6aea73c56fd148d3186c5fc8b" + }, + { + "file": "internal/compiler/expand_reference_matrix_test.go", + "sha256": "9fd96644d7683151a244fcba44bbab177d97958f3742a0192d25ecca47ca3d63" + }, + { + "file": "internal/compiler/expand_reference_seqchain_test.go", + "sha256": "0f052164b220ac82aaba2530aad677f6914530feee8afe7712f73a31ad02c860" + }, + { + "file": "internal/compiler/expand_reference_test.go", + "sha256": "32be3b831abe3d49448feab37ea7108df10af06126995f0c836c83e1f7bb91bd" + }, + { + "file": "internal/compiler/expand_reference_varinput_probe_test.go", + "sha256": "461cf8d23a094d9229bae37be4cc23dac5830955abd25b38aaa64f4fd7ca1e80" + }, + { + "file": "internal/compiler/expand_reference_varinput_test.go", + "sha256": "8ab2fbfaff0ecdd659740354531a064bedaa6164a74fca61e80b0782802cd74d" + }, + { + "file": "internal/compiler/expand_reference_varseed_test.go", + "sha256": "7c5545047d6c80f80e07498f2c08339a34133413f643f8de094cdad65e18baa5" + }, + { + "file": "internal/compiler/fetch_cache.go", + "sha256": "80e359eb29bd25fbb6c01ec12e330eb0a36a063c61a04783bc450553a88101b2" + }, + { + "file": "internal/compiler/fetch_cache_test.go", + "sha256": "fddfa08bb99dafd3af89b760dd5c527186e79df79fecd97ed84634753fa9ec3b" + }, + { + "file": "internal/compiler/fetcher.go", + "sha256": "c55914a0056758b80ab4f5e36666f867c961a1d1c4b06b7f9fcc0f90aa81cfa3" + }, + { + "file": "internal/compiler/frozen_bundle_exec_ports_test.go", + "sha256": "d331aa1ccb40c97e727f75df6e5cab0863bc5217283ac31b98f6684d11c9fb3a" + }, + { + "file": "internal/compiler/graph.go", + "sha256": "f9d605dc7a6bd909101215d0672e3be68c88095c9a948f812f93a16a24f670dc" + }, + { + "file": "internal/compiler/http_fetcher.go", + "sha256": "39d9b21a62c6bdf7f30bae0aecfd879bb616ccf1ee701bc2a7fc27b3f8fc3ae1" + }, + { + "file": "internal/compiler/http_fetcher_test.go", + "sha256": "b20e9ec8fb86e09567926afa72f4ef5aa163fb0d2ce3f019096c07b035967af1" + }, + { + "file": "internal/compiler/http_fetcher_token_test.go", + "sha256": "a1a392e1eea0b508c9d03323dea0e4929cd12fd36b93d624436b2cb3e0f59d0b" + }, + { + "file": "internal/compiler/layout_cache_contract_test.go", + "sha256": "6dac0cdfbcae2a5b601e066e5b8c5c948528624f14ad33f9422cd9899fb8bd8d" + }, + { + "file": "internal/compiler/lower_animate_initial.go", + "sha256": "1ed7e4d26d3525d5291ee60343ebbae92c7b6c504231c8eaca66fb726d91a1ec" + }, + { + "file": "internal/compiler/lower_animate_initial_test.go", + "sha256": "4de430ce8b55d7d84c2ef98c4c9c8b8753fdcae66088437e9fe2b0604524dfe5" + }, + { + "file": "internal/compiler/lower_animation.go", + "sha256": "d294c4a665cf07fae32d0aac6b023a277ea5c5dad7681723c78d66f5854de17f" + }, + { + "file": "internal/compiler/lower_animation_test.go", + "sha256": "bddcd1a1329291ab316e90f4e0f6abb2824a0f66b9090f451dd6a097700e12dc" + }, + { + "file": "internal/compiler/lower_render_props.go", + "sha256": "f35956bc6fd05a4bc535156a14c87807997969a104b448a52d5210367eab435d" + }, + { + "file": "internal/compiler/lower_render_props_test.go", + "sha256": "251bc6fac71fd01b04f1af514bb97954293d6d8d94c97971a7c1ba553dd1bf16" + }, + { + "file": "internal/compiler/lower_transitions.go", + "sha256": "9bf83f51291a28456816e8807e03109965e2b117a5171ea521263a4f7d22bc1d" + }, + { + "file": "internal/compiler/lower_transitions_test.go", + "sha256": "eecbbc96f98f60826603adcac366db5c6047bfaaeb9caa2b63cd2cd108aece96" + }, + { + "file": "internal/compiler/lower_wipe_cover.go", + "sha256": "b8a0faf70c9f64afc711bd2f6d2c489b6e4e1dba043ea35ac5fc676f6d6bcbe3" + }, + { + "file": "internal/compiler/lower_wipe_cover_test.go", + "sha256": "f67aadd24e079ffb6577b4b2e8a3ab8fda91e8a1513431b3e4c23890c23b93ca" + }, + { + "file": "internal/compiler/named_ports_test.go", + "sha256": "64c802a7887427c835303dd9b831c83a554b9cab8da24dc66183cf01f6ea2ea1" + }, + { + "file": "internal/compiler/on_platform_event_test.go", + "sha256": "ec3548786f2ef618ef55dca03d7e966f2747800ce1af210ff65789fe13c03004" + }, + { + "file": "internal/compiler/push_fingerprint.go", + "sha256": "be64278291dc72b5f3220297a73c16aa6b96cd6a2dbdfaa10575c31c3e833638" + }, + { + "file": "internal/compiler/reserved_blueprint_key_test.go", + "sha256": "5ff3047e7b88ec5988b19c9c0ad8bf018e2fbc4431fbef3e7d7e06d0ffce6f0b" + }, + { + "file": "internal/compiler/source_resolve_test.go", + "sha256": "7a767c433b702ae4364f8992e4f3c213a442f82e29bfeb77f4e50784b5e434e0" + }, + { + "file": "internal/compiler/static_bundle.go", + "sha256": "262c87f410ee761acafd4a78428803ffc44f26ff55143cbeb19d1d9ed92dec9a" + }, + { + "file": "internal/compiler/static_bundle_benchmark_test.go", + "sha256": "355009206fedad3940802cdc1d2a946fbe4fc85f58e7b5f91d4b1742a5845e35" + }, + { + "file": "internal/compiler/static_bundle_test.go", + "sha256": "57f7c5d61380aaa59e3e401e2852ac55c5b4ef73e0f630c20f4383ca5c4ec013" + }, + { + "file": "internal/compiler/static_bundle_value_test.go", + "sha256": "a06991aeb87591f0d375090e388dfd85eb8a58e4a694ad38d84d27f205c0c8b4" + }, + { + "file": "internal/compiler/static_node_fields.go", + "sha256": "885863621224f2a64fe1b77373dce088f83ee27ed831f78c172c148b481661d1" + }, + { + "file": "internal/compiler/static_node_fields_test.go", + "sha256": "90fcbf9c2d79cc79c56c4e2a280cb92bd932b53a78e366c68121e05c0e500e6e" + }, + { + "file": "internal/compiler/testdata/blue_compute_manifest.json", + "sha256": "c7298ce473c12194a2f68c47278b2200e465ed9a3f6658b687bd1854bff196b2" + }, + { + "file": "internal/compiler/testdata/xlang_golden.json", + "sha256": "8928d2530c46f832d64a986fd5877eac2d0c921ce2aa9c03fdc628b6d43b1240" + }, + { + "file": "internal/compiler/testdata/xlang_golden_multiblueprint.json", + "sha256": "bf9bd613dba8325479b70ff62d17899fa229c324e1961722511bf378db939ab4" + }, + { + "file": "internal/compiler/testdata/zabcanvas_user_component_pushed_version.json", + "sha256": "3b0cee599b27a708c42f07cca9def4ad1a9430a8e1ac8dc4feea3ec8bc0ed54b" + }, + { + "file": "internal/compiler/types.go", + "sha256": "0578005bf3d5903dff7e22eb52e3328c38266e6e5b36e03e934c476d88d7233e" + }, + { + "file": "internal/config/config.go", + "sha256": "76f09f7869aac4961641cc7dc57c0fc20ae07be827433181d098b2af17af4477" + }, + { + "file": "internal/config/config_lsdp_test.go", + "sha256": "1ac3fd315acb8d36f95300b40ac6965b3d9e93d4aa6db57e467c6f384940518b" + }, + { + "file": "internal/config/config_profile_test.go", + "sha256": "429255c5917c5ebe37f8c90f05e2b3c2c3ceef2f3acde757ac77d10bd1e3533f" + }, + { + "file": "internal/conformance/allowlist.go", + "sha256": "64bda62caa1a73250112919375365b47952b2b7a8b04d887328376c74b0a76d7" + }, + { + "file": "internal/conformance/conformance.go", + "sha256": "5f03f71fc72fb8a7899ea3b5f03e1829796075fe9fc1d66b33803908b3744c4e" + }, + { + "file": "internal/conformance/conformance_test.go", + "sha256": "5e03de0e43dab9c758090fce54812dacd391b550ea52da057c3c63bcf918e3cf" + }, + { + "file": "internal/conformance/manifest.json", + "sha256": "b08ece5698f1fc764641a0a4b384d14cfd2a5317131dda733ef909d52e583e5c" + }, + { + "file": "internal/conformance/querydescriptor_golden.json", + "sha256": "23e10e33f0ebbb01a212c038b3ec24c3b546e81f7ddc4251009856907026c478" + }, + { + "file": "internal/conformance/signature_parity_test.go", + "sha256": "b56af86b213e43110d917e242dcc865eee5f11fec2da1d97a8591df9cecf78cc" + }, + { + "file": "internal/conformance/signatures.json", + "sha256": "bbec68cbcdaaf73c33535fbf62b1892d355d918c533ba7aa74cccee112c289c6" + }, + { + "file": "internal/effects/dbquery.go", + "sha256": "5d2a719541e9c2fdf97039826f29918b2d699558cfa9bbdc54a0abfbc289ee27" + }, + { + "file": "internal/effects/dbquery_local_contract_test.go", + "sha256": "8e38a04e6a48b1be0fa3984f23dc7f43b2953728c374956540b5ab11fdf3c510" + }, + { + "file": "internal/effects/dbquery_test.go", + "sha256": "64c2e3036be50bd01b5a19d6206ca67146b35ba3df7de9652aa41d68239c8a18" + }, + { + "file": "internal/effects/dbschema.go", + "sha256": "57698603e8bad10db49390f0292aa1f6e7ac1134db9320b12d718b4eeb01055d" + }, + { + "file": "internal/effects/dbschema_test.go", + "sha256": "cd9a7d1ece220c33d5bb4cf5770cd531f7e2e21bd4802a069893a49d780c3d30" + }, + { + "file": "internal/effects/egress.go", + "sha256": "8083f2f43b1ab409560a34cb7396f6437d7f4f399836093b731f5554b37753ed" + }, + { + "file": "internal/effects/egress_budget.go", + "sha256": "36af9a20f29301caa4ecd05b25015a3abc8e792b942b96e11f1448bfb325c533" + }, + { + "file": "internal/effects/egress_budget_test.go", + "sha256": "6c87efb779a77f66ae2133dff2afd77735bbbc06f9be95972554f08c9a7c6521" + }, + { + "file": "internal/effects/egress_probe_test.go", + "sha256": "4ad8ebf04262c40433d6dbcf23e97216e1a22ae5a8b721261af69943c81698ee" + }, + { + "file": "internal/effects/egress_test.go", + "sha256": "dae15108d87713b228a4de49d28acc1c303e82b35926d6ca9cc223b79acde6f2" + }, + { + "file": "internal/effects/runner.go", + "sha256": "a889312d28e2d113f962f436d5ab782311362b9ac3fa8ac532d9f189fbe4df5d" + }, + { + "file": "internal/effects/runner_test.go", + "sha256": "89bea0b6403b5ba2132721640d455b3e9d0c58cb7dff9ebaa3fbb9d87cee49c2" + }, + { + "file": "internal/effects/service_token_exchange.go", + "sha256": "8433f08369240c239158a58d84ea34f07c0893a5ac74488771a704dac50ae3c3" + }, + { + "file": "internal/effects/service_token_exchange_test.go", + "sha256": "8e2a4144905ca26efb1e9e181907566c81b22ddb09fedb9dbb702509aff344f8" + }, + { + "file": "internal/effects/servicecall.go", + "sha256": "f1b966f8e899a37cce3ae9259395ec90e3cab6286221401e481d8162d8333bf7" + }, + { + "file": "internal/effects/servicecall_test.go", + "sha256": "399babee4ace54b9189ac38d698855d55f09730fcad3cd2e5eb217d3a56da503" + }, + { + "file": "internal/lsdp/bootstrap_state_test.go", + "sha256": "0e0df812e22c5c96007ef8b8294bb61bcf4fc6dd03b9e11218f8ce5c4b778ee0" + }, + { + "file": "internal/lsdp/bound_leaves.go", + "sha256": "1faf74da6d4f3be8c85afbd98152a56652567241d6575aa35bc2993254b4822b" + }, + { + "file": "internal/lsdp/bound_leaves_lsml.go", + "sha256": "af0a12836cee54a5e51261ab995d06cd35ab3701d0e854a4b0c26ef130a1c07a" + }, + { + "file": "internal/lsdp/bound_leaves_lsml_test.go", + "sha256": "34156f89cc89c9ac907d61eda8d5d91a3467556a539dfd51bff575fdee1cfb66" + }, + { + "file": "internal/lsdp/bound_leaves_test.go", + "sha256": "f3986dbf21da9497b96f488f9f1c1aa0d1f180962a014ad9bbe8390b742c715c" + }, + { + "file": "internal/lsdp/generation.go", + "sha256": "fadaf683047134b4e60eb40ee3cfb73fdf09e6614215925893e3b02723ba271c" + }, + { + "file": "internal/lsdp/generation_test.go", + "sha256": "2198c4d5e6688e9cd75ec10eb82cc89279f34536ab6f106b1046d1fd9040174e" + }, + { + "file": "internal/lsdp/helpers_test.go", + "sha256": "b2c04102309396f5984b3017516ef40f7604db13392ee898a1983f07c0231328" + }, + { + "file": "internal/lsdp/identity_authsource_test.go", + "sha256": "4bbb01ff1fa58acfb97ed2bf3a0161749d3ccb53b062df7e313b031283e94519" + }, + { + "file": "internal/lsdp/keyframe_on_join_test.go", + "sha256": "59c45c653a4364a5a481611cfd78039776a40259bcb61b9a54284300b9590fce" + }, + { + "file": "internal/lsdp/keyframe_switch_test.go", + "sha256": "c3641cb38f539af2d5785bc28d1c88cdc2b4ffb5703ff26be43072bf7cf8d9b1" + }, + { + "file": "internal/lsdp/mirror.go", + "sha256": "5ce9aad970770bca02bb711bd911dec7fc96d4adf8a851d3944846a09ac47623" + }, + { + "file": "internal/lsdp/native_surface.go", + "sha256": "909f994ebf8a12be208064cc3b4ab218b78074f303576ecc709dd9788e21a37f" + }, + { + "file": "internal/lsdp/native_surface_test.go", + "sha256": "bec5bdca784d6480bf79046cce0ed823aae70460eefa4cd881f847bdb108de57" + }, + { + "file": "internal/lsdp/overlay_mirror.go", + "sha256": "1ddc5627169c38c4df84634b630a9032a4c2a6f0d020371120b3d0a4973abbbf" + }, + { + "file": "internal/lsdp/overlay_mirror_test.go", + "sha256": "3303982c0455f5fdd7a2176d67d20eed6ec6465f341c0b5598fb4aa1f9c07dfb" + }, + { + "file": "internal/lsdp/overlay_streamrule_test.go", + "sha256": "477b85e6532023fde93294ac487283ece5daa335a25fdfcbe2eee95c7947ff61" + }, + { + "file": "internal/lsdp/pipeline_e2e_test.go", + "sha256": "3510a0158884b0aa223b912f7cb1036f7795aae1cf4d912a95445c1102eaef5b" + }, + { + "file": "internal/lsdp/preview_isolation_test.go", + "sha256": "e1da14b540a78e2e676c7757f9838430cfd397b9302d971c73a48ecadbeff0cd" + }, + { + "file": "internal/lsdp/projection_metadata_test.go", + "sha256": "0a2bf8de202a7fcf781f4bae5f28747de01a5b5779771da51b8f68912e3e532d" + }, + { + "file": "internal/lsdp/roster_wire_test.go", + "sha256": "63aad8672b2dae57cb6771ea181d089349ba41e1924fb6a9a69dae1fd626a40d" + }, + { + "file": "internal/lsdp/scalar_filter_test.go", + "sha256": "fa33d739e5fb1979ac5225cbbde2f888c1f966188d4c0234db915dad11f66437" + }, + { + "file": "internal/lsdp/security_test.go", + "sha256": "cd7221ac19f262cacaa4b7324dc788a0211777c1d44cf6eb3074ac06d29b9a64" + }, + { + "file": "internal/lsdp/session.go", + "sha256": "f4e8dca712988c40c7077395d4108604112e49c37651dcc4f5345b59a63f720b" + }, + { + "file": "internal/lsdp/session_isolation_test.go", + "sha256": "f735129113fea2527a238490647b55e09d230d604f7617ed5f163cd91e0213d9" + }, + { + "file": "internal/lsdp/slot_mirror.go", + "sha256": "7db168e851dc5d31d57de66b7e0873c41f85a100f86d590b4f8c9660f9531886" + }, + { + "file": "internal/lsdp/slot_mirror_test.go", + "sha256": "d885264d97708c060cae5679f911d9bb18d945d0f390ddf3f24d44949fd1f095" + }, + { + "file": "internal/lsdp/snapshot_identity_gap_test.go", + "sha256": "56848265e410f24e762e3487e681818a8de2179b2a742794fcea0367264859a2" + }, + { + "file": "internal/lsdp/viewer_arming.go", + "sha256": "a7eef07169ab3717c243b83297f9f014296a2cee1c0abf4c08aacf4377ec1e49" + }, + { + "file": "internal/lsdp/viewer_arming_test.go", + "sha256": "f3429ddd2d3064ece489301f807c5b4f03a22ab10618335a482a932481cbcaff" + }, + { + "file": "internal/lsdp/viewer_creds.go", + "sha256": "3e85ad83843928fbb340b280825d5b28c1a95955899c24ef33ae9602ce243089" + }, + { + "file": "internal/lsdp/viewer_creds_test.go", + "sha256": "d1654b27501c1fdebd96a3964f8044e05a5f8556e40307a6b336a275b8621b92" + }, + { + "file": "internal/lsdp/wire.go", + "sha256": "bdfd544d7379c87f355196428ad70f59face5e307de01f6ae50ca2739ede144e" + }, + { + "file": "internal/lsdp/wire_test.go", + "sha256": "ca63ca4af7dceb10717626614ba05e5e1d6856d02aa7a3e0e960adba7c9ea3c4" + }, + { + "file": "internal/lsdpreception/README.md", + "sha256": "2eb37b0609518a0fb1f2871a53a46ed7110e8a25120c9bb1a0a26fc9b751f4b0" + }, + { + "file": "internal/lsdpreception/animation_native_test.go", + "sha256": "8d2fa0554513699b0369c445d2d9e88269221150e310a372f7f80923da3fb8e1" + }, + { + "file": "internal/lsdpreception/blue_native_test.go", + "sha256": "b84c558cd5ea1132e3657235699ded3c43a31fc19be6163ecbe6d51c7d949010" + }, + { + "file": "internal/lsdpreception/control.go", + "sha256": "511eb6447e3a2ecc15451b14ac5032b58201833a01f89d5d9b89d7c3061eb61c" + }, + { + "file": "internal/lsdpreception/mirror.go", + "sha256": "7298668322fb3abf6414010b42f78673dd709068969edbae0ade16c349be74b8" + }, + { + "file": "internal/lsdpreception/mutation.go", + "sha256": "3790a3ac4b66c87684241deb7134346043ee83e159cc9ad14242677568c7f793" + }, + { + "file": "internal/lsdpreception/mutation_test.go", + "sha256": "b6e2790f50a76ff41e2523a68f6a3c0f1437bbb11f98d09f0b2c1e7a922b6dcb" + }, + { + "file": "internal/lsdpreception/producer.go", + "sha256": "b5367b6e2f9dfdf716882cb8a6c59fcea5c853d2aa82c69fc741742250262dff" + }, + { + "file": "internal/lsdpreception/producer_test.go", + "sha256": "fc115d86bf9444d8d12f0c0a16f6d468c61dc3c83234c50f34d03c70acb507f9" + }, + { + "file": "internal/lsdpreception/reception.go", + "sha256": "fc305d8da1ab330a28f1c22c68afe430952cbddd59430af6c7eac8281d0dd0ac" + }, + { + "file": "internal/lsdpreception/reception_test.go", + "sha256": "c08afda5eae9c8e51d92f3f0e57823b1698d509e0b2f733ae7c31d594c8cbf3a" + }, + { + "file": "internal/lsdpreception/recovery_native_test.go", + "sha256": "d47c6106b5759c5458724d7efed13c257c4b7cbea4313195e66ab81052e4cae0" + }, + { + "file": "internal/lsdpreception/recovery_test.go", + "sha256": "b5789bb1ee6402f5cac50d69445f660f11165c027febe9b8d69410332d2f8423" + }, + { + "file": "internal/lsdpreception/route_retention_test.go", + "sha256": "aa3638eb5fb1ea2d17c890230a2e8a324c323027560c52213f7cca5349b77076" + }, + { + "file": "internal/lsdpreception/session.go", + "sha256": "33facbd24521939e8c93a3de6d3fd66cf72d72f106cd64284e77a1ecaf4344e5" + }, + { + "file": "internal/lsdpreception/surface_native_test.go", + "sha256": "5d633c2d7e6642b8221cecf1e08bba99e9132f1adaed880e0150a751e57c9132" + }, + { + "file": "internal/lsdpreception/transition_test.go", + "sha256": "138e0a658deec9edfd7d997ee2bfb4ae921a8b3469f16e166d6882ab038b3272" + }, + { + "file": "internal/lsdpreception/tree.go", + "sha256": "56f4a1ca4b666c818a487b88887c7eea8fd9403632078e7e48f5426481f55f71" + }, + { + "file": "internal/obs/logger.go", + "sha256": "993c6fc53fb8861bd289531f0b61923ff061c2617fb507d2d7198e5887e34d5d" + }, + { + "file": "internal/obs/metrics.go", + "sha256": "0bb2dafa79d7be3266554cd89d7a6d6c8d73d3d3eeb250dd6fece25d15425d1b" + }, + { + "file": "internal/obs/metrics_test.go", + "sha256": "d8068299d04400b34eec5b63e52263af0c399d2388c4b4f1063c59e53afdaa9c" + }, + { + "file": "internal/obs/prism.go", + "sha256": "9fe3124096b11399863936f161f164773ba3350c7b9fc1b5e958d0c449c88b15" + }, + { + "file": "internal/obs/recover.go", + "sha256": "edf6aa2b30761292523e809e111af45ab77161ef408181f3ca95da74a4a63ab8" + }, + { + "file": "internal/protocol/fixtures_test.go", + "sha256": "007c1c00bf34af96342d72ee7d9a47ee94e21d5c4f7b5c0aa83a7f424754865c" + }, + { + "file": "internal/protocol/messages.go", + "sha256": "833b96029868407f58fb9fcb5d21e3356f33e9c2293741bda6b4ab1696c5614b" + }, + { + "file": "internal/protocol/messages_test.go", + "sha256": "358ca4f6b76a05de895fc4f09011d803776e73716349671a09a9476bb853a072" + }, + { + "file": "internal/providers/canonical.go", + "sha256": "b14653c9965527c7dd2febfab17df5928ea8911001cb1723cb880925a326b46e" + }, + { + "file": "internal/providers/events.go", + "sha256": "615ba6d918057dd425bdc6ee1e2b4da8fc45a7006b3af3a5cd1d3ba24633884d" + }, + { + "file": "internal/providers/events_test.go", + "sha256": "4a19e445a9bde44a65f9f2be01d1ec1cd567f3ae007619bd1d36003ad62408b4" + }, + { + "file": "internal/providers/isolation_test.go", + "sha256": "41e1f00f43075edf843553e0bba62255ef620f06a0faa08ef78c54893e5d22df" + }, + { + "file": "internal/providers/policy.go", + "sha256": "b0458a6328c5fe0af45f22c9730bdd4cc01f352ce8c03cf5e5e0512f9907fe40" + }, + { + "file": "internal/providers/providers.go", + "sha256": "1ef4f32c7af54b95e14bbaf724a2a3bd2e4da940c8eb39748a935e74c79b3937" + }, + { + "file": "internal/providers/providers_test.go", + "sha256": "f95e483e79199b0a9e26777ba034ff8b9a3fcdf4606835d5cd7e8463beff1c3b" + }, + { + "file": "internal/runtime/canary_firstflight_harness_test.go", + "sha256": "46b0d33c9e06550dfa46e509e630cef699685bb9913bcacb500b4282a9b5bf35" + }, + { + "file": "internal/runtime/chained_ref_db_exec_test.go", + "sha256": "90d6218ec47b6f3cc3590fdbafbc99b59dff634f376af68b0581974a6d81d376" + }, + { + "file": "internal/runtime/clock.go", + "sha256": "a2eb33e29d045291959df20d476217ce14654f8223bc5b6f3337a5b2ce1bf74d" + }, + { + "file": "internal/runtime/compute.go", + "sha256": "bfb7ad6b99b9700270d3186817322bb81cdd94c799bd7ba5a0dfd0ece78c2119" + }, + { + "file": "internal/runtime/compute_db.go", + "sha256": "cde0bfbf4dfc48acb9c16fdaa722f19d2ae0c703b2e9f8bf9a914a1ed4c160f0" + }, + { + "file": "internal/runtime/compute_db_test.go", + "sha256": "41d79f7a5c84a42f2db3e0e83902928fef204cab261e9b2cb8daebecf1387bd0" + }, + { + "file": "internal/runtime/compute_db_wired_test.go", + "sha256": "7828ea5018c9efcd94fbd9b95d2c501738fc306303fde0148932dc3d7333d51d" + }, + { + "file": "internal/runtime/compute_equal_test.go", + "sha256": "4ee613c493da93f26b5d02f985ac81fdcdd93427fddb8a89af545f6baf3224ca" + }, + { + "file": "internal/runtime/compute_pure.go", + "sha256": "d75b0fe0352b20c54a08d589542b1948a4fda6b62aa1db3b5fc3379b087ecb93" + }, + { + "file": "internal/runtime/compute_pure_probe_test.go", + "sha256": "d066945349a21de7bc87dcaca38dc4037d9a0c09b827cf7f963cb42f56f2a644" + }, + { + "file": "internal/runtime/compute_pure_test.go", + "sha256": "b595d969991d0317bd0d55eb516dd49a08e41a32568717aa3791ec1de2642457" + }, + { + "file": "internal/runtime/compute_source.go", + "sha256": "8d74ccf671d2b2c4259ead29f60236ec8fe66a932959fafb4e2ddbb7b36fca2b" + }, + { + "file": "internal/runtime/compute_source_test.go", + "sha256": "2686a9ae9b33b45945dc41c588e0fbc081ef6b22ba6e4a588b720df68e19dfa1" + }, + { + "file": "internal/runtime/conformance_exec_test.go", + "sha256": "5d6367062946ad9444479fc9040571e1f0d5e5181ed5e822a77896322d69eca6" + }, + { + "file": "internal/runtime/dirtycone_test.go", + "sha256": "396e9376afc3ec140e97ed5b77485f04c9aedca0c30135cdd9f1a8dee910c1be" + }, + { + "file": "internal/runtime/draft_switch_test.go", + "sha256": "855c85906e872a99b1aa5335ecd8af0a6d8875fa4f06c53f237ecc7d038260ea" + }, + { + "file": "internal/runtime/engine_ab_parity_87_test.go", + "sha256": "de5ad05236724a9dca9cef20d3b7a52b1e7afab756fc8a8384b303549019eb32" + }, + { + "file": "internal/runtime/engine_ab_parity_extended_test.go", + "sha256": "c97734eb2583af5ffcbba9f0083fae08ff34a1d97832b9fa2985f8dd59207f61" + }, + { + "file": "internal/runtime/engine_ab_parity_inventory_test.go", + "sha256": "ca82ccbf10a46f32c203e1f01468e51c00599728b7b0896a4a10284822433c51" + }, + { + "file": "internal/runtime/engine_ab_parity_test.go", + "sha256": "f026af2728ceacd32d38e1296855fe811ff60a5b26d89683fa7e1f2580161228" + }, + { + "file": "internal/runtime/engine_ab_parity_transport_test.go", + "sha256": "306efaf0611677766af0ff2131dd4234e6e5e54950c0b3719cb36bdbf7a6f44c" + }, + { + "file": "internal/runtime/event_ingress.go", + "sha256": "32d526d5bd40b9b7b36b193388db59435ea662349d76df246b0a9c8495f01974" + }, + { + "file": "internal/runtime/events_input_reactive_test.go", + "sha256": "9d588105f8651b993464feed373614cbf60df0e248623802b3874a6e9003a3ae" + }, + { + "file": "internal/runtime/exec.go", + "sha256": "a7df78085416c6b5b05fcf89d339752421c97144cbd5ac2d74aa6379432d9ba6" + }, + { + "file": "internal/runtime/exec_activation_probe_test.go", + "sha256": "5b6932679a769156bd43dc05331fa62c58e20f145c08bd722f1b030bd4affbe7" + }, + { + "file": "internal/runtime/exec_anim.go", + "sha256": "6680b7a52b10a4f8fe1c7808ed6b0834e87784aef28f1639e26aca68c373321d" + }, + { + "file": "internal/runtime/exec_anim_probe_test.go", + "sha256": "27972c459ad17e698d2d9f5586824ae075bd5c0d6774df103bd631dc2ff112d0" + }, + { + "file": "internal/runtime/exec_anim_test.go", + "sha256": "ea28afb213773fd6f5b0adc201ad9be8f753c1f73c8d028c26535374b51603bb" + }, + { + "file": "internal/runtime/exec_assign_slot.go", + "sha256": "632af97f18894bbbb920c90c7f3c5a50cbd4469a39816647be02e94e3549b6da" + }, + { + "file": "internal/runtime/exec_assign_slot_test.go", + "sha256": "a163df8c475b99891a0e4cd42ddf77e377daf18a456a720934fdc4e30c2c360a" + }, + { + "file": "internal/runtime/exec_contracts.go", + "sha256": "1f127ba255c546adac23987622718f2b94b95d696834de5c254f8ed79b26cea9" + }, + { + "file": "internal/runtime/exec_counted_loop_test.go", + "sha256": "2ddfeb2ef9f13107b840ed8f4e58c8eaf2e6d412fb3d3acd8ba72a9b27830cdb" + }, + { + "file": "internal/runtime/exec_cpu_test.go", + "sha256": "bc3a94d093ac651c4e1070b6248f1debe5097be2d01d7bb9c911c5a0bbf99623" + }, + { + "file": "internal/runtime/exec_effects.go", + "sha256": "c65fff1792b130b31a17d051eac4cbc36bd3d739ea9efa13909bcef5acd2732b" + }, + { + "file": "internal/runtime/exec_effects_probe_test.go", + "sha256": "3c7f58e533c31419f8c158de49ce5520936fa8260e170f52e29e51704b49002f" + }, + { + "file": "internal/runtime/exec_effects_test.go", + "sha256": "753718a189d749b689e0eec7562f6f338ee99a28523ec93a1b1d462e707a1bf2" + }, + { + "file": "internal/runtime/exec_effects_wiring_test.go", + "sha256": "aab7c6e9272f02a78d01ab49dbc5a3ad0d3b232ad1a952782647b311ceccc80f" + }, + { + "file": "internal/runtime/exec_http_hardening_test.go", + "sha256": "44f515cdb7c195b8e4a8f128fd13b9ad0e2fadbba5f404d09557d8fd712b7878" + }, + { + "file": "internal/runtime/exec_interpreter.go", + "sha256": "a2cb3fbdbfda76ad578d01c058f038117b540ea6cfbc06cec75fc2e1a136310d" + }, + { + "file": "internal/runtime/exec_multiprog_probe_test.go", + "sha256": "dc5d4191157303e76a0cd68812b6c2a904d9b7c1b8e9fd132177def7b169457b" + }, + { + "file": "internal/runtime/exec_multiprog_test.go", + "sha256": "c207739cdd446e134bf06b39c91c99d7b754a4cdc5a385c5e0271ff28c878928" + }, + { + "file": "internal/runtime/exec_on_platform_test.go", + "sha256": "022ac1b1c9832a57a6976a7d84a436b1db1fce53642b7c7068c62f5c0764abfd" + }, + { + "file": "internal/runtime/exec_onair_test.go", + "sha256": "46ab66705348f844d076123df46c967db9b8cbac861be4469cbd23560f406f40" + }, + { + "file": "internal/runtime/exec_operator.go", + "sha256": "d1b76611173a10d70943783826e9b04b2656451a39e733e614678327b06b01d1" + }, + { + "file": "internal/runtime/exec_operator_test.go", + "sha256": "50fa0d3edbf261b2b77a6874b461495d354653fdc4556dc4d29b292e26fec267" + }, + { + "file": "internal/runtime/exec_overlay_app.go", + "sha256": "1dab339278ce241e30a19a4e62fe39a8db4ce6ced53e5315581c64e9f6512fc0" + }, + { + "file": "internal/runtime/exec_overlay_app_test.go", + "sha256": "8e554d817243cc3e9788e4c1e5374e741befa3848e4e05a7c07b332d3b867edc" + }, + { + "file": "internal/runtime/exec_partition_roundtrip_test.go", + "sha256": "177b449e22ba197c3646f45778c9128c8766866c6502f0c8502097e3cd761585" + }, + { + "file": "internal/runtime/exec_probe_test.go", + "sha256": "0fd396c0408dc9d0603d2705759bce95273b9575b31f7aaf33ae0094eeb11efd" + }, + { + "file": "internal/runtime/exec_service_call.go", + "sha256": "e463e657b0dc347f44a813f9df53bf05e39151e2e36cb90fb2a8f3769ae192f8" + }, + { + "file": "internal/runtime/exec_service_call_test.go", + "sha256": "47660de2d7984f3faf5515e042a904aedb60c9dc446fd34f946f9d3722ff77cc" + }, + { + "file": "internal/runtime/exec_show_emit.go", + "sha256": "ba483e73d0041dce76d62a49b1c788a2bd326aeab62cfc839836aab0dbb78f04" + }, + { + "file": "internal/runtime/exec_show_emit_test.go", + "sha256": "aa53c0b12070a0eff506701a9a1e9d387137ed04cdec5da76d061591993b544a" + }, + { + "file": "internal/runtime/exec_test.go", + "sha256": "92a66d015d705df4c0ad052c0f94e839bc6c307de080b143361e4473d6f4a898" + }, + { + "file": "internal/runtime/exec_timer.go", + "sha256": "061cc23d8be527eaa1868df7c26f058ed6bc91d6cea013240026d2a6f74d73c4" + }, + { + "file": "internal/runtime/exec_timer_probe_test.go", + "sha256": "8149a21335d30dee06a976cfa21eddc2ed9e5ab6b4c3b501d75a3819855183bb" + }, + { + "file": "internal/runtime/exec_timer_test.go", + "sha256": "b6c534fa689aaad94b09acc2df17a9ce035b9eaaa6253c2627ef6a2c2d55b92a" + }, + { + "file": "internal/runtime/exec_validation.go", + "sha256": "e1bb3a850b5e88931903724f3782c35c8b2fa0c27f8ba4c6f7a57e46d3302b2a" + }, + { + "file": "internal/runtime/expand_reference_runtime_probe_test.go", + "sha256": "779131d0a3e193878683143250dafb4c6bdc9f00eabff56bb29bdf0f3d987b94" + }, + { + "file": "internal/runtime/named_leaderboard_prodgraph_test.go", + "sha256": "8735724211ecd2c474611ce6a09c31641fd1fdfdcb53d0d7360dbebd25725c84" + }, + { + "file": "internal/runtime/named_leaderboard_reactive_test.go", + "sha256": "b63fb2667c3d352bbe5915a0e47f4ff1630409cc9f0226c32627dbe01aa2e278" + }, + { + "file": "internal/runtime/named_leaderboard_test.go", + "sha256": "387623060021cb2a141d9c7568c8edc6fa48922ef1cc7d5817edac078c7cf80b" + }, + { + "file": "internal/runtime/named_ports_test.go", + "sha256": "40f471d8361e689c93203fc0fb64248c7fb57629110e364fe9b790c5e424632a" + }, + { + "file": "internal/runtime/perf20k_test.go", + "sha256": "0f84e571bc90637ab30e386046e98e3d9a7d810a70c652b1bca43c092b31f76b" + }, + { + "file": "internal/runtime/preview.go", + "sha256": "2e09dcaa1e23e9a7054f87a49506271d1c963b35f0220add32b1b424038ee2b4" + }, + { + "file": "internal/runtime/preview_editable_test.go", + "sha256": "7cc503e6ead1b904c761746a2e2d18ff716630f5afdbcd083c9c2796a100ea5c" + }, + { + "file": "internal/runtime/probe_cone_test.go", + "sha256": "39abf881dad0ae5f609962369d91a7e13d95ee37308a1084ab52a573d3726088" + }, + { + "file": "internal/runtime/race_off_test.go", + "sha256": "3a318ce34760c2e1aa2616b5822e31a86324e59c420bf6188c26d8c969a3485b" + }, + { + "file": "internal/runtime/race_on_test.go", + "sha256": "c4d6bad7295c55e560599ee0d00c74c453763022ce3f4bd3f2b7967709e91ab0" + }, + { + "file": "internal/runtime/reactivation_onstart_test.go", + "sha256": "4c26f059368b831d6869e6db33b64864e5254a52e54ae694222d4fdab0a431c6" + }, + { + "file": "internal/runtime/scene.go", + "sha256": "b968f4d6645d143b89f771e4ffe3f858c22f88d05927fd42729d977fda10fb87" + }, + { + "file": "internal/runtime/scene_emission.go", + "sha256": "aa37ec9aa03695deadfacb3a117994ed26c1f137769d910d7229383e6a411f7b" + }, + { + "file": "internal/runtime/scene_evaluation.go", + "sha256": "b61ae0341e4cdb8d59e107ead3001e20bf6ffc76e162c181d5cb103809d7aa0e" + }, + { + "file": "internal/runtime/scene_index_test.go", + "sha256": "bfb0d1bfaf5ca280c9950ac902ec6e1891770a27251188836062f38ebb20a456" + }, + { + "file": "internal/runtime/scene_test.go", + "sha256": "84a5b8ce0e77322a6bcab9ad706d7446678e89409858a78d99967b4e304bf6d9" + }, + { + "file": "internal/runtime/show.go", + "sha256": "d1c98c1151456b8bef3779863a57c295d1bccb304b92532dd17b873bb320a4c3" + }, + { + "file": "internal/runtime/show_roster_test.go", + "sha256": "e7efcb3084830546a618db91f9613cb85e8bb923bc7258474732d116d819655a" + }, + { + "file": "internal/runtime/state.go", + "sha256": "54c1024e690af10e87cd8a969ebc4a8d7c424523990554d3f9cf15d955d3b4a5" + }, + { + "file": "internal/runtime/stream_rule_test.go", + "sha256": "5ca2900f51d49e35eabfe5af6beb6323d63b396518032e19745ec973ae92b8bf" + }, + { + "file": "internal/runtime/test_session.go", + "sha256": "9e9fb1a842312b2c65a409fddfd56f0fb0920aa1fa5b7cb8fa06dcc22b3740ca" + }, + { + "file": "internal/runtime/testdata/m3_prod_graph.json", + "sha256": "e92e49c0dfffae7c13515351477fde78a8d3b0cb10805840184c33dcfe762b67" + }, + { + "file": "internal/runtime/testdata/m4_draft_switch_graph.json", + "sha256": "a843688f1efe00df68397729e8edf6bc5cbf886386e1b901a9ae34fb6c7e0ca7" + }, + { + "file": "internal/runtime/tick.go", + "sha256": "c11222c4e6d6274d7bb09b31cc9a2dffe103dd77f6ef8fd3eee0f8e767ed895f" + }, + { + "file": "internal/runtime/validation_harness.go", + "sha256": "73638c80da6ea90112665475fdfcbff3ed4e89d03e72efc36f9149f2762f3772" + }, + { + "file": "internal/runtime/validation_harness_probe_test.go", + "sha256": "068c3f64c7a640f589146758053c9d0f613aad06723423db3cb4da09e354f734" + }, + { + "file": "internal/runtime/validation_harness_test.go", + "sha256": "9d2accbe4ad47b489fe95cc4c3001341d7f447a6496a6cbe9f9ad88c04e8560c" + }, + { + "file": "internal/runtime/validation_simulate.go", + "sha256": "d9fecb8e7df136ba72b8899307fdef68eeefa4562443dea5991b0aabce118f79" + }, + { + "file": "internal/runtime/validation_simulate_test.go", + "sha256": "73eb738227fbcfff8b446a56a72f69b4ec7af11bc934f603c1d1421c13c2809d" + }, + { + "file": "internal/streamcontrol/README.md", + "sha256": "0671861ff2467c96836a8e47f771b01068e02977fceae3f93b6e8d59ed33cb04" + }, + { + "file": "internal/streamcontrol/apps.go", + "sha256": "748f86b84534e6ea086e59a7e9ad0657d22e48ac2572c2c8ddc71acae07426d8" + }, + { + "file": "internal/streamcontrol/apps_test.go", + "sha256": "bbb14eb6e008b601e23e356185973c6b08262e2a8e4a7a7483a6f5dabac1dc50" + }, + { + "file": "internal/streamcontrol/controller.go", + "sha256": "0d79321ae7eda17f1817384049b2383da516db86cc1a67ae0d166181ede17ed1" + }, + { + "file": "internal/streamcontrol/process_unix.go", + "sha256": "e03e9e783bf4948d739f5c971666a317189927dc468ff8b26ca53ef6cb8c83ef" + }, + { + "file": "internal/streamcontrol/process_windows.go", + "sha256": "b9f681bbecb648526d6738d11440fe7d7403692d86c6cb302617292b07a8f1fc" + }, + { + "file": "internal/streamcontrol/store.go", + "sha256": "2fe076d99758cf5ad07a82d6c84cd2828ff0b35c42d85b7ed2bb49c9521e16c9" + }, + { + "file": "internal/streamcontrol/store_test.go", + "sha256": "479e8ba9fddb3acf80b730e97b856880f94b1b585a30183d46527bfcf3d55d0a" + }, + { + "file": "internal/workload/client.go", + "sha256": "388bb177061c92a86da1e82063bb64c12e3ab0fac52d1bb47ca4eb16acea268d" + }, + { + "file": "internal/workload/client_test.go", + "sha256": "be9ac6100834e93fcea15aeab4da3cff119411a2c6d845b7c92160f0dd7fa6d6" + }, + { + "file": "internal/ws/connection.go", + "sha256": "d773e7fdd66d522cd1081f03c0b5fc85c1f9a4dd291120ddea83ad98de22e0ed" + }, + { + "file": "internal/ws/server.go", + "sha256": "364ec54691f65dc0fbb377877ecb1ff0be7915b952d830ca2466445316e6202a" + }, + { + "file": "internal/ws/server_authsource_test.go", + "sha256": "f07b2e25b1b3d0222648fdf5fb4c3017be86c1e4c4a85fdd60a2a51f9d26c99f" + }, + { + "file": "internal/ws/server_platform_test.go", + "sha256": "dbf4e8f6ed350397cd14da27a39f944d6f91e0686f4c44e5aa82f03d3f18c49c" + }, + { + "file": "internal/ws/server_test.go", + "sha256": "321bae19aaba23065984d4247b384a1883439dc528894ba6263c7b01e1ca775b" + }, + { + "file": "scripts/check_file_sizes.py", + "sha256": "56bc342f324fa1c67b9ebbce8b4a513bd1dc38f41e479cf85bf482613c3df36a" + }, + { + "file": "scripts/extract-changelog.sh", + "sha256": "c4ab684fc2994dd7650acf898699ab330e37d7540cd45b80ebf52e9ac95839f5" + }, + { + "file": "scripts/gen_conformance_manifest.py", + "sha256": "3d687b91e38e614857d2baf1dfa8472e438e1c3aea07aede80c4c2349feb3bfc" + }, + { + "file": "tests/e2e/README.md", + "sha256": "e059a4d14a51bf3d052aa62115319d5bd9b9313c0c34e1fabb5abe73d907479d" + }, + { + "file": "tests/e2e/canvas_layout_contract_test.go", + "sha256": "662a595313970401971bd61f42208d7c93f207d7ad36d68f362d312282751158" + }, + { + "file": "tests/e2e/e2e_test.go", + "sha256": "dac60408ad6bc5d94c64887df3cdbba9e2565b0d70ab42f8dd915f59687ffa58" + }, + { + "file": "tests/e2e/testdata/canvas-chat-sponso.scene-bundle.json", + "sha256": "e862a652f6725b78e7937f22c885d73892da256a989686f348696f588a0b8110" + }, + { + "file": "tests/e2e/testdata/canvas_layout_from_canvas.json", + "sha256": "c086fcc2c67bb2af00eac8724bfee995df2921dfbc8a13dbfac86fa348cf3cde" + }, + { + "file": "third_party/lsdpnative/LICENSE", + "sha256": "d42cfa19474fe4e66013b60010c87aefd0ef7df1f938306e6095ff02432ef002" + }, + { + "file": "third_party/lsdpnative/README.md", + "sha256": "1c31d7fb3f77a07e27742f8d97aab227c4a22ccbee578219bf44d0543b83ab38" + }, + { + "file": "third_party/lsdpnative/client.go", + "sha256": "abd8bb2e9bf8b633e70d911b02f1551d45889f7231b0694aff06abc0a627191e" + }, + { + "file": "third_party/lsdpnative/subscription.go", + "sha256": "3df50fcb11ba1b1195bc26de064290628c2a5c677490d170f4a99c181a8fa3e9" + } + ] +} \ No newline at end of file diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T124725Z-go-test.log b/evidence/local-20261012-editable-targets/eleven/20261012T124725Z-go-test.log new file mode 100644 index 00000000..f8c3444e --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T124725Z-go-test.log @@ -0,0 +1,26 @@ +? github.com/ZabLaboratory/Orion/cmd/healthcheck [no test files] +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) +ok github.com/ZabLaboratory/Orion/internal/adapters 2.241s +ok github.com/ZabLaboratory/Orion/internal/api (cached) +ok github.com/ZabLaboratory/Orion/internal/attestation (cached) +ok github.com/ZabLaboratory/Orion/internal/auth (cached) +ok github.com/ZabLaboratory/Orion/internal/bluehost 3.465s +ok github.com/ZabLaboratory/Orion/internal/blueproject (cached) +ok github.com/ZabLaboratory/Orion/internal/bluespike (cached) +ok github.com/ZabLaboratory/Orion/internal/bluewire 0.759s +? github.com/ZabLaboratory/Orion/internal/buildinfo [no test files] +? github.com/ZabLaboratory/Orion/internal/canonical [no test files] +ok github.com/ZabLaboratory/Orion/internal/compiler (cached) +ok github.com/ZabLaboratory/Orion/internal/config (cached) +ok github.com/ZabLaboratory/Orion/internal/conformance 0.525s +ok github.com/ZabLaboratory/Orion/internal/effects (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdp 7.086s +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.507s +ok github.com/ZabLaboratory/Orion/internal/obs (cached) +ok github.com/ZabLaboratory/Orion/internal/protocol (cached) +ok github.com/ZabLaboratory/Orion/internal/providers (cached) +ok github.com/ZabLaboratory/Orion/internal/runtime (cached) +ok github.com/ZabLaboratory/Orion/internal/streamcontrol (cached) +ok github.com/ZabLaboratory/Orion/internal/workload (cached) +ok github.com/ZabLaboratory/Orion/internal/ws 1.661s +? github.com/ZabLaboratory/Orion/third_party/lsdpnative [no test files] diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T124735Z-native-proof.log b/evidence/local-20261012-editable-targets/eleven/20261012T124735Z-native-proof.log new file mode 100644 index 00000000..63408702 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T124735Z-native-proof.log @@ -0,0 +1,16 @@ +=== RUN TestLaneCommitNative +2026/10/12 14:47:39 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:8a982fbd-555c-4847-983c-3fe655c3ca43] details:map[status:200] domain:service message:HTTP action completed requestId:8a982fbd-555c-4847-983c-3fe655c3ca43 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:47:39 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:f81cd609-6e07-4dea-8b80-56196bcd5370] details:map[status:200] domain:service message:HTTP action completed requestId:f81cd609-6e07-4dea-8b80-56196bcd5370 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:47:39 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:547c7cd1-fc81-40d7-a510-ebdac62f254f] details:map[status:202] domain:service message:HTTP action completed requestId:547c7cd1-fc81-40d7-a510-ebdac62f254f schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:47:39 WARN editable preview scene mismatch prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:c1a6b61e-211b-47bd-b46e-2ace5f46badf] details:map[status:409] domain:service message:editable preview scene mismatch requestId:c1a6b61e-211b-47bd-b46e-2ace5f46badf schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 14:47:39 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:7c91e4d3-5eef-4a5c-b21c-ae466036b9ba] details:map[status:409] domain:service message:editable preview sequence conflict requestId:7c91e4d3-5eef-4a5c-b21c-ae466036b9ba schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 14:47:39 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:11cf756d-013d-4d44-b433-c2f8e7042ac0] details:map[status:200] domain:service message:HTTP action completed requestId:11cf756d-013d-4d44-b433-c2f8e7042ac0 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:47:39 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:b8b9d873-ac40-4841-b028-8857ec92920a] details:map[status:409] domain:service message:editable preview sequence conflict requestId:b8b9d873-ac40-4841-b028-8857ec92920a schemaVersion:1 severity:warning source:orion.http]" + lane_commit_native_test.go:255: {"active_author_readback":true,"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"preview_unchanged":true,"program_delta_isolated":true,"program_hot_edit_native":true,"program_structural_edit_native":true,"solar_feedback_or_sideband_required":false,"stale_writers_refused":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:256: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.54s) +=== RUN TestSceneControlFailedSelectionDoesNotLoopNative + scene_control_failure_native_test.go:91: NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt +--- PASS: TestSceneControlFailedSelectionDoesNotLoopNative (0.56s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 2.600s diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T124834Z-packaged-descriptor.log b/evidence/local-20261012-editable-targets/eleven/20261012T124834Z-packaged-descriptor.log new file mode 100644 index 00000000..37a2efd9 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T124834Z-packaged-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "194e2e3513a369cda2ea3943eddc7d5b7ae2b45c83a879a183e6112acae91b68", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T124920Z-final-tests.log b/evidence/local-20261012-editable-targets/eleven/20261012T124920Z-final-tests.log new file mode 100644 index 00000000..81ab4683 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T124920Z-final-tests.log @@ -0,0 +1,3 @@ +ok github.com/ZabLaboratory/Orion/internal/api 2.469s +ok github.com/ZabLaboratory/Orion/internal/runtime 8.116s +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125020Z-final-packaged-descriptor.log b/evidence/local-20261012-editable-targets/eleven/20261012T125020Z-final-packaged-descriptor.log new file mode 100644 index 00000000..8c6f239c --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125020Z-final-packaged-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "c9d44059fcc14dbf4ebac34ba6186f7d863ce0ff666d0bdeddbc8b86c71287da", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125129Z-provenance.json b/evidence/local-20261012-editable-targets/eleven/20261012T125129Z-provenance.json new file mode 100644 index 00000000..ed521874 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125129Z-provenance.json @@ -0,0 +1,70 @@ +{ + "worktree": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing", + "branch": "eleven/local-20261012-lane-role-routing", + "base": "11334610a68c0e9bf7dcf27dc6f2075c6b5b2104", + "source_parent": "419eedeb51991fa6e0ab37749ec8a6551c9923be", + "source_files": [ + { + "path": "cmd/orion/main.go", + "sha256": "6a6686492c101047b59d50cc6fc124799ed4d60a5c73407670ed4142b12de9d4" + }, + { + "path": "docs/development/scene-feature-map.md", + "sha256": "3a75f3728052d0b0abe545e3b616f8a509ed3f25a788aea2eb4e043c193d213a" + }, + { + "path": "internal/api/README.md", + "sha256": "f697b5bbb0bd71cec29fb841844137df3000dda1143a8e338db78a3dc40ac17a" + }, + { + "path": "internal/api/editable_preview.go", + "sha256": "abc1229ecca7dc71e014b5b19cb7dbbd8109195b138a62dd7a5086f6bb641b47" + }, + { + "path": "internal/api/editable_targets.go", + "sha256": "d5ddbc2c69d88858a772309ec0e9d84f2a8a37837003169bcae9c4239de478a3" + }, + { + "path": "internal/api/editable_targets_test.go", + "sha256": "90c6c1239c0234fda88bcff3be05fc2c59005320346eb3989af09c1e638fc3bb" + }, + { + "path": "internal/api/lane_commit_native_test.go", + "sha256": "c4ffae8c35620714f92fe1085bb84b5786ff7fa67ea7774df8f0f786c42bf599" + }, + { + "path": "internal/api/public.go", + "sha256": "f81d5df7d7b0150d6dfbe1a342e2773e7fb2bbd16b3158866a6a8f9fc16a875a" + }, + { + "path": "internal/runtime/preview.go", + "sha256": "2840e52b7135149ef89f0e64709bc7034b51b79e7feddf62878947663b0c6d2d" + }, + { + "path": "internal/runtime/preview_roles.go", + "sha256": "aedfb4f606bcf0052dd0c219e09d9187df2a275fc9fef5b0eba9714f85051213" + }, + { + "path": "internal/runtime/editable_targets.go", + "sha256": "e9f7b3b537411a280827b04555cfd8b29ce76cfc54ef717fea1ea9c19a8612c6" + }, + { + "path": "internal/runtime/editable_targets_test.go", + "sha256": "116d00215e4b1c906e3732f83d49c001e0e7c0fb3acd5e512dbec7b92140da2e" + } + ], + "binary": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing\\.cache\\orion-editable-targets-packaged.exe", + "binary_sha256": "c9d44059fcc14dbf4ebac34ba6186f7d863ce0ff666d0bdeddbc8b86c71287da", + "blue_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622", + "blue_manifest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "validation": { + "go_test_all": "pass", + "go_vet_all": "pass", + "final_affected_tests": "pass", + "private_native_rust": "pass", + "private_packaged_descriptor": "pass", + "private_process_exit": 0 + }, + "common_runtime_restarted_by_this_unit": false, + "common_integration_owner": "Main 1" +} diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125129Z-report.md b/evidence/local-20261012-editable-targets/eleven/20261012T125129Z-report.md new file mode 100644 index 00000000..b249d440 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125129Z-report.md @@ -0,0 +1,22 @@ +# Orion active editable authoring — qualification and handoff + +POST/PUT/editor socket accept target preview|program (default preview). GET /api/v1/show/editable-preview/state?target=program&scene_id=... returns only the active editable scene/version/edit_seq/writer_id; operator and embedded-local guards remain. Program hot frames require writer_id. Structural Program POST requires writer_id plus base_edit_seq; edit_seq cannot decrease. Wrong active scene, retired writer, stale sequence or compilation across a Take are rejected before Host or mirror mutation. Writer identity survives Take and rotates on structural replacement. No inactive actor cache or reactivation is added. + +The existing Scene inbox and native mirror carry hot edits to the same physical resource after role permutation. Delivery waits for inbox forwarding and native application ACK, without Solar feedback or socket observer. Host lane leases serialize writes against Take. Service sockets can explicitly target Program with scene/writer; warm Preview compatibility remains. + +Validation: go test ./... and go vet ./... pass; final affected API/runtime/cmd tests pass after the final diagnostic change. The retained socket test edits Preview, keeps the same connection through Take, edits Program and rejects a retired writer with zero observers. Concurrent compilation/hot edit and Take between two noneditable actors refuse before Host mutation. Private Rust proof executes Blue/Blue Take, real editable POST, editable Take, GET active author, PUT on Program A, structural POST on A, unchanged Preview B, and stale role/writer/snapshot refusal. Descriptor read from the packaged process verifies published Blue metadata; private shutdown exits 0. Native rendering is the responsibility of the coordinating Prism/Solar proof; no CEF rendering or physical microphone acceptance is claimed by these Go tests. Race detector remains unavailable in the local CGO-disabled toolchain. + +Artifact: .cache/orion-editable-targets-packaged.exe; SHA256 c9d44059fcc14dbf4ebac34ba6186f7d863ce0ff666d0bdeddbc8b86c71287da. Source parent 419eedeb51991fa6e0ab37749ec8a6551c9923be plus exact source hashes in accompanying provenance. The embedded Go VCS revision is not used as worktree attestation. Blue module is the normal published pseudo-version ff8b1dde0bad, with no local go.mod replacement. + +Solar refresh: the already qualified package v3.0.0-local-3133269cf8bebc4a contains Vision source 4b154bdc3dbbf55bbf8b3402d706b7e20a413330 plus the documented independent-framing continuation. Source and installed WASM hashes match df8307b8ed411dd66cb177da2cae62a77f14aaae6609ed45595d50495c0bfad1. check-vision-assets and check-native-package pass. The coordinator owns its source, package and common relaunch; this Orion unit changes no Prism/Solar sources, shared configuration, device choices, calibration or models. + +Common integration/restart owner: Main 1. The artifact and API contract were delivered there. Qualification of the visible Prism Live editor and final common process is pending that integration. Worktree retained because the shared runtime consumes its artifact and the continuation remains active. No merge or cleanup of foreign worktrees. + +Rollback: restore prior Orion binary48ecd40ce06b6dc34d5125c9a85de70e186026a220c71a94136c8369eebe4045 and matching Prism authoring client through the coordinator; legacy Preview requests remain compatible. + +Logs: +- 20261012T124725Z-go-test.log +- 20261012T124735Z-native-proof.log +- 20261012T124834Z-packaged-descriptor.log +- 20261012T124920Z-final-tests.log +- 20261012T125020Z-final-packaged-descriptor.log diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125222Z-active-defaults-tests.log b/evidence/local-20261012-editable-targets/eleven/20261012T125222Z-active-defaults-tests.log new file mode 100644 index 00000000..ba46f25c --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125222Z-active-defaults-tests.log @@ -0,0 +1,3 @@ +ok github.com/ZabLaboratory/Orion/internal/api 2.597s +ok github.com/ZabLaboratory/Orion/internal/runtime 6.669s +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125300Z-active-defaults-native.log b/evidence/local-20261012-editable-targets/eleven/20261012T125300Z-active-defaults-native.log new file mode 100644 index 00000000..c7ef341f --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125300Z-active-defaults-native.log @@ -0,0 +1,17 @@ +=== RUN TestLaneCommitNative +2026/10/12 14:53:06 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:bcae9b1f-dbd4-4e8c-aac4-4ef34f1c1878] details:map[status:200] domain:service message:HTTP action completed requestId:bcae9b1f-dbd4-4e8c-aac4-4ef34f1c1878 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:53:07 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:c5b61411-016c-4772-b6d5-dc308509fbcc] details:map[status:200] domain:service message:HTTP action completed requestId:c5b61411-016c-4772-b6d5-dc308509fbcc schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:53:07 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:9f8a9e46-260f-4cbb-9269-b74dacbbb8e2] details:map[status:202] domain:service message:HTTP action completed requestId:9f8a9e46-260f-4cbb-9269-b74dacbbb8e2 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:53:07 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:7436d47c-9df4-4a2e-a70d-f9608c15b7c9] details:map[status:200] domain:service message:HTTP action completed requestId:7436d47c-9df4-4a2e-a70d-f9608c15b7c9 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:53:07 WARN editable preview scene mismatch prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:eb2ceca1-a50f-4b89-afed-a0989bf85ebf] details:map[status:409] domain:service message:editable preview scene mismatch requestId:eb2ceca1-a50f-4b89-afed-a0989bf85ebf schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 14:53:07 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:82db8266-8a14-4ade-bc2d-0141f9da0f14] details:map[status:409] domain:service message:editable preview sequence conflict requestId:82db8266-8a14-4ade-bc2d-0141f9da0f14 schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 14:53:07 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:ee4f3a70-16b9-4f61-8a1a-f427847ac33f] details:map[status:200] domain:service message:HTTP action completed requestId:ee4f3a70-16b9-4f61-8a1a-f427847ac33f schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:53:07 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:ed478556-865e-4027-a428-c1a6240ae288] details:map[status:409] domain:service message:editable preview sequence conflict requestId:ed478556-865e-4027-a428-c1a6240ae288 schemaVersion:1 severity:warning source:orion.http]" + lane_commit_native_test.go:264: {"active_author_readback":true,"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"preview_unchanged":true,"program_delta_isolated":true,"program_hot_edit_native":true,"program_structural_edit_native":true,"solar_feedback_or_sideband_required":false,"stale_writers_refused":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:265: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.80s) +=== RUN TestSceneControlFailedSelectionDoesNotLoopNative + scene_control_failure_native_test.go:91: NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt +--- PASS: TestSceneControlFailedSelectionDoesNotLoopNative (0.54s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 2.766s diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125327Z-active-state-guards.log b/evidence/local-20261012-editable-targets/eleven/20261012T125327Z-active-state-guards.log new file mode 100644 index 00000000..b1e946aa --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125327Z-active-state-guards.log @@ -0,0 +1 @@ +ok github.com/ZabLaboratory/Orion/internal/api 1.502s diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125459Z-active-defaults-descriptor.log b/evidence/local-20261012-editable-targets/eleven/20261012T125459Z-active-defaults-descriptor.log new file mode 100644 index 00000000..c17fb09d --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125459Z-active-defaults-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "befcce6e95846d8ecf4b736a7889c69412c6584edcaf51ea7b12bf103beb837e", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125504Z-active-defaults-provenance.json b/evidence/local-20261012-editable-targets/eleven/20261012T125504Z-active-defaults-provenance.json new file mode 100644 index 00000000..48ebe0c5 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125504Z-active-defaults-provenance.json @@ -0,0 +1,40 @@ +{ + "source_parent": "a052866", + "binary": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing\\.cache\\orion-editable-targets-packaged.exe", + "binary_sha256": "befcce6e95846d8ecf4b736a7889c69412c6584edcaf51ea7b12bf103beb837e", + "source_files": [ + { + "path": "internal/api/editable_targets.go", + "sha256": "74199ef78b1b016eda119167e2795723205e48c8d2af57eb66953805b5b26a80" + }, + { + "path": "internal/runtime/editable_targets.go", + "sha256": "58333ef4de520a5e53ae78f6f4d517590d45b64de26698e6d346ca4f9396541a" + }, + { + "path": "internal/api/editable_targets_test.go", + "sha256": "b3ba6b5fe367fa2df75d2b09153567848414880c28883ae3f5629528869f6bf1" + }, + { + "path": "internal/api/lane_commit_native_test.go", + "sha256": "7b9931a64d88f00a0ccd1cc5916be0e96c3f148d81fd9d91184b3b6ffdbb2aaa" + }, + { + "path": "internal/api/README.md", + "sha256": "480f793a646fd5dd19b9138afb037769dcfc959a6392ebbbd39f956e9d1921d5" + } + ], + "active_defaults_after_native_put": { + "edit_seq": 1, + "width": 32, + "native_program_matches": true, + "preview_unchanged": true + }, + "read_guards": { + "anonymous": 403, + "wrong_scene_or_role": 409, + "unknown_target": 400 + }, + "tests": "affected packages and all editable API guards pass; affected vet passes; private native proof passes", + "shared_runtime_modified": false +} diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125504Z-active-defaults-report.md b/evidence/local-20261012-editable-targets/eleven/20261012T125504Z-active-defaults-report.md new file mode 100644 index 00000000..dcec153d --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125504Z-active-defaults-report.md @@ -0,0 +1,9 @@ +# Active editable defaults read-back + +GET /api/v1/show/editable-preview/state now returns live defaults alongside active author identity. It holds the Host lane lease, waits for queued actor inputs, captures state, and checks actor identity/sequence/role epoch remained stable. It publishes no LSML mutation or snapshot and stores no inactive scene. + +The native proof checks a Program PUT reaches solar/lane-a width32, followed by GET edit_seq1/default32; Preview B remains unchanged. The socket test checks GET anonymous403, retired scene/old role409 and invalid target400. Tests for affected packages and all editable API guards pass; go vet of affected packages passes. The new packaged descriptor is separately probed in the accompanying log. + +Final binary SHA256 befcce6e95846d8ecf4b736a7889c69412c6584edcaf51ea7b12bf103beb837e supersedes the C9 candidate from the initial report. Contract, artifact and Solar package3133269c were delivered to Main 1, who owns the common refresh and visible CEF validation. This unit did not restart or mutate the common runtime. + +Source parent a052866 plus file hashes in companion provenance. Continuation worktree/branch remain unchanged. diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125917Z-native-author-guards.log b/evidence/local-20261012-editable-targets/eleven/20261012T125917Z-native-author-guards.log new file mode 100644 index 00000000..3f480ea5 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125917Z-native-author-guards.log @@ -0,0 +1,3 @@ +ok github.com/ZabLaboratory/Orion/internal/runtime 6.451s +ok github.com/ZabLaboratory/Orion/internal/api 2.491s +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T125947Z-final-native-author-proof.log b/evidence/local-20261012-editable-targets/eleven/20261012T125947Z-final-native-author-proof.log new file mode 100644 index 00000000..adcf98d3 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T125947Z-final-native-author-proof.log @@ -0,0 +1,17 @@ +=== RUN TestLaneCommitNative +2026/10/12 14:59:54 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:9f5036eb-f4ea-455d-bb38-d792de2c0061] details:map[status:200] domain:service message:HTTP action completed requestId:9f5036eb-f4ea-455d-bb38-d792de2c0061 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:59:54 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:1da71020-7393-4340-adb1-f4b1df66a88f] details:map[status:200] domain:service message:HTTP action completed requestId:1da71020-7393-4340-adb1-f4b1df66a88f schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:59:54 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:3d18e099-e725-41c6-9a92-79c49f46e23f] details:map[status:202] domain:service message:HTTP action completed requestId:3d18e099-e725-41c6-9a92-79c49f46e23f schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:59:54 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:be45f72d-ad77-4dbc-b73d-87b6c15d15a4] details:map[status:200] domain:service message:HTTP action completed requestId:be45f72d-ad77-4dbc-b73d-87b6c15d15a4 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:59:54 WARN editable preview scene mismatch prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:0e79a1f5-6803-4e98-ab68-f275632a7493] details:map[status:409] domain:service message:editable preview scene mismatch requestId:0e79a1f5-6803-4e98-ab68-f275632a7493 schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 14:59:54 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:77283e85-df8f-4c63-8e0f-b2cf126df3d6] details:map[status:409] domain:service message:editable preview sequence conflict requestId:77283e85-df8f-4c63-8e0f-b2cf126df3d6 schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 14:59:54 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:2cc4950a-b2b0-447d-81cb-db2b5a953275] details:map[status:200] domain:service message:HTTP action completed requestId:2cc4950a-b2b0-447d-81cb-db2b5a953275 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 14:59:54 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:3ab6aae4-eaba-45f3-abac-553e5199bec9] details:map[status:409] domain:service message:editable preview sequence conflict requestId:3ab6aae4-eaba-45f3-abac-553e5199bec9 schemaVersion:1 severity:warning source:orion.http]" + lane_commit_native_test.go:264: {"active_author_readback":true,"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"preview_unchanged":true,"program_delta_isolated":true,"program_hot_edit_native":true,"program_structural_edit_native":true,"solar_feedback_or_sideband_required":false,"stale_writers_refused":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:265: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.83s) +=== RUN TestSceneControlFailedSelectionDoesNotLoopNative + scene_control_failure_native_test.go:91: NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt +--- PASS: TestSceneControlFailedSelectionDoesNotLoopNative (0.57s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 3.289s diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T130018Z-native-author-descriptor.log b/evidence/local-20261012-editable-targets/eleven/20261012T130018Z-native-author-descriptor.log new file mode 100644 index 00000000..54a63112 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T130018Z-native-author-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "7f723c35750a3ee350a20c0998482aac0354c8fee73eba3eb1431af5e96c7b24", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T130054Z-final-artifact.json b/evidence/local-20261012-editable-targets/eleven/20261012T130054Z-final-artifact.json new file mode 100644 index 00000000..dce6ab12 --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T130054Z-final-artifact.json @@ -0,0 +1,33 @@ +{ + "source_parent": "a2fa3c98a1bc5eea37912e5958f54ec2e7031f7a", + "binary": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing\\.cache\\orion-editable-targets-packaged.exe", + "binary_sha256": "7f723c35750a3ee350a20c0998482aac0354c8fee73eba3eb1431af5e96c7b24", + "source_files": [ + { + "path": "internal/runtime/preview.go", + "sha256": "ec6d9112a02e3b701b0031531c1674051e3542f554ec940a8bbb6f6203443077" + }, + { + "path": "internal/runtime/preview_roles.go", + "sha256": "a82e447a06778cd06a191cb1638a8a4825f6e6545b440d8663aab0efa42ed3bf" + }, + { + "path": "internal/runtime/editable_targets.go", + "sha256": "a530efb6f78c5186687cd946509893b11dc11f4d5956c79128641fa2a4bb43da" + }, + { + "path": "internal/runtime/editable_targets_test.go", + "sha256": "a77179a230a46eaf7858c85dcc927efb017ed8168b9dcdf592f29c0da7514942" + }, + { + "path": "internal/api/README.md", + "sha256": "87ebcf7e00c286891e964bb6356fb51947f2cce4e8b9a03399450adc82d91e58" + } + ], + "legacy_generation_exposed_as_program": false, + "native_actor_api_runtime_tests": "pass", + "private_native_program_patch_structure_and_active_defaults": "pass", + "packaged_descriptor_and_shutdown_zero": "pass", + "affected_go_vet": "pass", + "shared_runtime_changed": false +} diff --git a/evidence/local-20261012-editable-targets/eleven/20261012T130054Z-final-handoff.md b/evidence/local-20261012-editable-targets/eleven/20261012T130054Z-final-handoff.md new file mode 100644 index 00000000..94ae96eb --- /dev/null +++ b/evidence/local-20261012-editable-targets/eleven/20261012T130054Z-final-handoff.md @@ -0,0 +1,7 @@ +# Final Orion handoff + +Final binary SHA256 7f723c35750a3ee350a20c0998482aac0354c8fee73eba3eb1431af5e96c7b24 replaces previous194e/C9/BEFC candidates. File .cache/orion-editable-targets-packaged.exe. GET state includes coherent active defaults; target/writer/sequence contract unchanged. Legacy generation actors are not exposed as physical Program authors. Only a native Take or active Program replacement establishes that authority. + +Affected runtime/API/cmd tests and vet pass. The final private Rust probe passes Program patch and structural replacement on A, active read-back defaults32/edit_seq1, unchanged Preview B, stale writes refused and no Solar sideband/feedback requirement. The executable descriptor probe confirms Blue ff8b/d377, private shutdown0. Logs in this directory record each stage and the final artifact pins match the source hashes here. The artifact/contract were delivered to Main 1 for its common integration and relaunch; no shared process or Prism/Solar code was modified by this unit. + +The owned worktree is retained for active common use. Scope remains Orion only; no merge, foreign revert or cleanup is performed. diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-build-metadata.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-build-metadata.log new file mode 100644 index 00000000..75dfb36e --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-build-metadata.log @@ -0,0 +1,29 @@ +D:\Documents\Zab\Orion\.worktrees\eleven-local-20261012-lane-role-routing\.cache\orion-idle-recovery-packaged.exe: go1.26.4 + path github.com/ZabLaboratory/Orion/cmd/orion + mod github.com/ZabLaboratory/Orion (devel) + dep github.com/Lumencast/lumencast-go v0.3.2-0.20260816093300-0c7cfc65c694 h1:2y14teoPqAKlg8YsBPrYmkHQl6DNbY9MDhO9+QyIY34= + dep github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20261012083435-ff8b1dde0bad h1:OI43JUxSQrGAm2eCn0WYc+z8/1zb64MD0epIsTiwTDc= + dep github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= + dep github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= + dep github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= + dep github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= + dep github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= + dep github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= + dep github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= + dep github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= + dep github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= + dep github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= + dep github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= + dep github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= + dep go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= + dep golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= + dep golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= + dep golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= + dep google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= + build -buildmode=exe + build -compiler=gc + build -trimpath=true + build CGO_ENABLED=0 + build GOARCH=amd64 + build GOOS=windows + build GOAMD64=v1 diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-actual-scene.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-actual-scene.log new file mode 100644 index 00000000..e2754b16 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-actual-scene.log @@ -0,0 +1,13 @@ +=== RUN TestEditableIdleDeltaNative +2026/10/12 17:37:00 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:c226fe8c-8c08-4759-9f68-3dfe3839da41] details:map[status:200] domain:service message:HTTP action completed requestId:c226fe8c-8c08-4759-9f68-3dfe3839da41 schemaVersion:1 severity:info source:orion.http]" + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":2},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":1},"idle_ms":2000,"native_barrier_ms":6.289,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":1,"ws_ack_ms":6.796,"ws_to_native_barrier_ms":0.506} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":3},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":2},"idle_ms":100,"native_barrier_ms":4.763,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":2,"ws_ack_ms":4.763,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":4},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":3},"idle_ms":100,"native_barrier_ms":5.176,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":3,"ws_ack_ms":5.176,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":5},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":4},"idle_ms":2000,"native_barrier_ms":5.135,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":4,"ws_ack_ms":5.135,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":6},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":5},"idle_ms":100,"native_barrier_ms":5.94,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":5,"ws_ack_ms":5.94,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":7},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":6},"idle_ms":100,"native_barrier_ms":4.368,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":6,"ws_ack_ms":4.368,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":8},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":7},"idle_ms":6000,"native_barrier_ms":6.128,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":7,"ws_ack_ms":6.128,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:132: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":9},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":8},"idle_ms":100,"native_barrier_ms":4.853,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":8,"ws_ack_ms":4.853,"ws_to_native_barrier_ms":0} +--- PASS: TestEditableIdleDeltaNative (10.69s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 12.185s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-baseline.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-baseline.log new file mode 100644 index 00000000..b75996e1 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-baseline.log @@ -0,0 +1,13 @@ +=== RUN TestEditableIdleDeltaNative +2026/10/12 17:34:58 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:07c6ee6d-22cd-4da2-aadb-0c120f2ec25b] details:map[status:200] domain:service message:HTTP action completed requestId:07c6ee6d-22cd-4da2-aadb-0c120f2ec25b schemaVersion:1 severity:info source:orion.http]" + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":2},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":1},"idle_ms":2000,"native_barrier_ms":1.349,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":1,"ws_ack_ms":1.856,"ws_to_native_barrier_ms":0.506} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":3},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":2},"idle_ms":100,"native_barrier_ms":0,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":2,"ws_ack_ms":0,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":4},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":3},"idle_ms":100,"native_barrier_ms":0,"native_to_ws_ack_ms":0.591,"native_value_verified":true,"seq":3,"ws_ack_ms":0.591,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":5},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":4},"idle_ms":2000,"native_barrier_ms":0.535,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":4,"ws_ack_ms":1.194,"ws_to_native_barrier_ms":0.658} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":6},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":5},"idle_ms":100,"native_barrier_ms":0.507,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":5,"ws_ack_ms":0.507,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":7},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":6},"idle_ms":100,"native_barrier_ms":0.507,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":6,"ws_ack_ms":0.507,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":8},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":7},"idle_ms":6000,"native_barrier_ms":0.526,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":7,"ws_ack_ms":1.172,"ws_to_native_barrier_ms":0.645} + editable_idle_native_test.go:104: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":9},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":8},"idle_ms":100,"native_barrier_ms":0.508,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":8,"ws_ack_ms":1.023,"ws_to_native_barrier_ms":0.515} +--- PASS: TestEditableIdleDeltaNative (10.59s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 12.922s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-long-pause.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-long-pause.log new file mode 100644 index 00000000..7d01b357 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-delta-native-long-pause.log @@ -0,0 +1,13 @@ +=== RUN TestEditableIdleDeltaNative +2026/10/12 17:39:36 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:319d8e66-8aaf-4b8c-b26f-70e06f38b97b] details:map[status:200] domain:service message:HTTP action completed requestId:319d8e66-8aaf-4b8c-b26f-70e06f38b97b schemaVersion:1 severity:info source:orion.http]" + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":2},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":1},"idle_ms":31000,"native_barrier_ms":6.576,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":1,"ws_ack_ms":6.576,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":3},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":2},"idle_ms":100,"native_barrier_ms":6.133,"native_to_ws_ack_ms":0.526,"native_value_verified":true,"seq":2,"ws_ack_ms":6.659,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":4},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":3},"idle_ms":100,"native_barrier_ms":6.281,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":3,"ws_ack_ms":6.281,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":5},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":4},"idle_ms":2000,"native_barrier_ms":3.641,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":4,"ws_ack_ms":4.213,"ws_to_native_barrier_ms":0.572} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":6},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":5},"idle_ms":100,"native_barrier_ms":5.211,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":5,"ws_ack_ms":5.211,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":7},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":6},"idle_ms":100,"native_barrier_ms":5.392,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":6,"ws_ack_ms":5.392,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":8},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":7},"idle_ms":6000,"native_barrier_ms":7.433,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":7,"ws_ack_ms":7.433,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":9},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":8},"idle_ms":100,"native_barrier_ms":5.018,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":8,"ws_ack_ms":5.018,"ws_to_native_barrier_ms":0} +--- PASS: TestEditableIdleDeltaNative (39.71s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 41.316s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-expiry-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-expiry-final.log new file mode 100644 index 00000000..2f81d0c7 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-expiry-final.log @@ -0,0 +1,13 @@ +=== RUN TestEditableIdleDeltaNative +2026/10/12 17:46:34 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:198cda1a-da8d-4162-90cc-7a3834b021e4] details:map[status:200] domain:service message:HTTP action completed requestId:198cda1a-da8d-4162-90cc-7a3834b021e4 schemaVersion:1 severity:info source:orion.http]" + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":1},"idle_ms":122000,"native_barrier_ms":6.879,"native_to_ws_ack_ms":0.558,"native_value_verified":true,"seq":1,"ws_ack_ms":7.438,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"idle_ms":100,"native_barrier_ms":5.662,"native_to_ws_ack_ms":0.532,"native_value_verified":true,"seq":2,"ws_ack_ms":6.195,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":4},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"idle_ms":100,"native_barrier_ms":5.992,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":3,"ws_ack_ms":5.992,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":5},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":4},"idle_ms":2000,"native_barrier_ms":4.53,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":4,"ws_ack_ms":4.53,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":6},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":5},"idle_ms":100,"native_barrier_ms":4.86,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":5,"ws_ack_ms":4.86,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":7},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":6},"idle_ms":100,"native_barrier_ms":4.373,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":6,"ws_ack_ms":4.373,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":8},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":7},"idle_ms":6000,"native_barrier_ms":5.858,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":7,"ws_ack_ms":6.365,"ws_to_native_barrier_ms":0.506} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":9},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":8},"idle_ms":100,"native_barrier_ms":6.456,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":8,"ws_ack_ms":6.456,"ws_to_native_barrier_ms":0} +--- PASS: TestEditableIdleDeltaNative (130.70s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 132.129s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-expiry-shutdown-failure.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-expiry-shutdown-failure.log new file mode 100644 index 00000000..40f31d34 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-expiry-shutdown-failure.log @@ -0,0 +1,40 @@ +=== RUN TestEditableIdleDeltaNative +2026/10/12 17:42:01 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:2ef85205-6f0b-48fa-968a-9248ce36d510] details:map[status:200] domain:service message:HTTP action completed requestId:2ef85205-6f0b-48fa-968a-9248ce36d510 schemaVersion:1 severity:info source:orion.http]" + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":0,"delivered":1},"idle_ms":122000,"native_barrier_ms":10.183,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":1,"ws_ack_ms":10.183,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"idle_ms":100,"native_barrier_ms":4.729,"native_to_ws_ack_ms":0.531,"native_value_verified":true,"seq":2,"ws_ack_ms":5.26,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":4},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"idle_ms":100,"native_barrier_ms":3.676,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":3,"ws_ack_ms":3.676,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":5},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":4},"idle_ms":2000,"native_barrier_ms":5.333,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":4,"ws_ack_ms":5.333,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":6},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":5},"idle_ms":100,"native_barrier_ms":5.33,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":5,"ws_ack_ms":5.33,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":7},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":6},"idle_ms":100,"native_barrier_ms":5.518,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":6,"ws_ack_ms":5.518,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":8},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":7},"idle_ms":6000,"native_barrier_ms":6.506,"native_to_ws_ack_ms":0,"native_value_verified":true,"seq":7,"ws_ack_ms":6.506,"ws_to_native_barrier_ms":0} + editable_idle_native_test.go:141: IDLE_NATIVE_TIMING {"after":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":9},"before":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":8},"idle_ms":100,"native_barrier_ms":5.701,"native_to_ws_ack_ms":0.51,"native_value_verified":true,"seq":8,"ws_ack_ms":6.212,"ws_to_native_barrier_ms":0} +--- PASS: TestEditableIdleDeltaNative (130.70s) +panic: runtime error: invalid memory address or nil pointer dereference +[signal 0xc0000005 code=0x0 addr=0x8 pc=0x7ff63581e3ce] + +goroutine 10 [running]: +github.com/ZabLaboratory/Orion/third_party/lsdpnative.(*Client).Close(0x20318c888000?) + D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/third_party/lsdpnative/client.go:105 +0xe +github.com/ZabLaboratory/Orion/internal/lsdpreception.(*Producer).run.func1() + D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/internal/lsdpreception/producer.go:208 +0x24 +panic({0x7ff635acbc60?, 0x7ff63622a0f0?}) + C:/Program Files/Go/src/runtime/panic.go:860 +0x13a +github.com/ZabLaboratory/Orion/third_party/lsdpnative.(*Client).Close(0x7ff635bfe820?) + D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/third_party/lsdpnative/client.go:105 +0xe +github.com/ZabLaboratory/Orion/internal/lsdpreception.(*Producer).exchange(0x20318c8841c0, 0x20318c7f1d40, {0x7ff635adf380, 0x20318ca8a780}) + D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/internal/lsdpreception/producer.go:123 +0x3d9 +github.com/ZabLaboratory/Orion/internal/lsdpreception.(*Producer).run(0x20318c8841c0) + D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/internal/lsdpreception/producer.go:263 +0xbb6 +created by github.com/ZabLaboratory/Orion/internal/lsdpreception.NewProducer in goroutine 9 + D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/internal/lsdpreception/producer.go:64 +0x176 +FAIL github.com/ZabLaboratory/Orion/internal/api 132.529s +FAIL +file:///D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/.cache/run-idle-delta-tests.mjs:12 + if(code!==0) throw Error(`Private idle-delta test exit ${code}`); + ^ + +Error: Private idle-delta test exit 1 + at file:///D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/.cache/run-idle-delta-tests.mjs:12:21 + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + +Node.js v24.16.0 diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-all-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-all-final.log new file mode 100644 index 00000000..c8af44b9 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-all-final.log @@ -0,0 +1,26 @@ +? github.com/ZabLaboratory/Orion/cmd/healthcheck [no test files] +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) +ok github.com/ZabLaboratory/Orion/internal/adapters (cached) +ok github.com/ZabLaboratory/Orion/internal/api 2.190s +ok github.com/ZabLaboratory/Orion/internal/attestation (cached) +ok github.com/ZabLaboratory/Orion/internal/auth (cached) +ok github.com/ZabLaboratory/Orion/internal/bluehost 2.991s +ok github.com/ZabLaboratory/Orion/internal/blueproject (cached) +ok github.com/ZabLaboratory/Orion/internal/bluespike (cached) +ok github.com/ZabLaboratory/Orion/internal/bluewire (cached) +? github.com/ZabLaboratory/Orion/internal/buildinfo [no test files] +? github.com/ZabLaboratory/Orion/internal/canonical [no test files] +ok github.com/ZabLaboratory/Orion/internal/compiler (cached) +ok github.com/ZabLaboratory/Orion/internal/config (cached) +ok github.com/ZabLaboratory/Orion/internal/conformance (cached) +ok github.com/ZabLaboratory/Orion/internal/effects (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdp (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.193s +ok github.com/ZabLaboratory/Orion/internal/obs (cached) +ok github.com/ZabLaboratory/Orion/internal/protocol (cached) +ok github.com/ZabLaboratory/Orion/internal/providers (cached) +ok github.com/ZabLaboratory/Orion/internal/runtime (cached) +ok github.com/ZabLaboratory/Orion/internal/streamcontrol (cached) +ok github.com/ZabLaboratory/Orion/internal/workload (cached) +ok github.com/ZabLaboratory/Orion/internal/ws (cached) +? github.com/ZabLaboratory/Orion/third_party/lsdpnative [no test files] diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-descriptor-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-descriptor-final.log new file mode 100644 index 00000000..f830d8d5 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-descriptor-final.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "a016dc627dbb6115362fca7c07a7295ce9287c5aac1016878058de59dac8e512", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-final-unit.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-final-unit.log new file mode 100644 index 00000000..671f5616 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-final-unit.log @@ -0,0 +1,8 @@ +=== RUN TestFailedDialDoesNotRetainTypedNilClient +--- PASS: TestFailedDialDoesNotRetainTypedNilClient (0.00s) +=== RUN TestRecoveryRetriesClosedConnectionImmediately +--- PASS: TestRecoveryRetriesClosedConnectionImmediately (0.00s) +=== RUN TestImmediateRecoveryStillBacksOffAfterFailedReconnect +--- PASS: TestImmediateRecoveryStillBacksOffAfterFailedReconnect (0.03s) +PASS +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.281s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-lane-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-lane-final.log new file mode 100644 index 00000000..35d81e48 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-lane-final.log @@ -0,0 +1,17 @@ +=== RUN TestLaneCommitNative +2026/10/12 17:46:59 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:fb3a099d-f7a0-4f65-af4a-895b81be2f06] details:map[status:200] domain:service message:HTTP action completed requestId:fb3a099d-f7a0-4f65-af4a-895b81be2f06 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:47:00 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:b6052a7c-bf91-4a70-984b-a90b8bc77be1] details:map[status:200] domain:service message:HTTP action completed requestId:b6052a7c-bf91-4a70-984b-a90b8bc77be1 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:47:00 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:58db3f3c-fe31-47ad-a85f-3b97c8063c84] details:map[status:202] domain:service message:HTTP action completed requestId:58db3f3c-fe31-47ad-a85f-3b97c8063c84 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:47:00 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:ce51add2-97d9-4bb9-896c-03fd02bacd2f] details:map[status:200] domain:service message:HTTP action completed requestId:ce51add2-97d9-4bb9-896c-03fd02bacd2f schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:47:00 WARN editable preview scene mismatch prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:aabaa6d5-a80f-4c6b-96a6-272e2887962a] details:map[status:409] domain:service message:editable preview scene mismatch requestId:aabaa6d5-a80f-4c6b-96a6-272e2887962a schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 17:47:00 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:0ab9bdd1-4db9-4d77-addf-47b94f4faadf] details:map[status:409] domain:service message:editable preview sequence conflict requestId:0ab9bdd1-4db9-4d77-addf-47b94f4faadf schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 17:47:00 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:2ec56d13-7e89-42ec-b7a0-5c614691abe1] details:map[status:200] domain:service message:HTTP action completed requestId:2ec56d13-7e89-42ec-b7a0-5c614691abe1 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:47:00 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:9eebed0d-c651-46df-a18b-bcae7ad64f7b] details:map[status:409] domain:service message:editable preview sequence conflict requestId:9eebed0d-c651-46df-a18b-bcae7ad64f7b schemaVersion:1 severity:warning source:orion.http]" + lane_commit_native_test.go:264: {"active_author_readback":true,"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"preview_unchanged":true,"program_delta_isolated":true,"program_hot_edit_native":true,"program_structural_edit_native":true,"solar_feedback_or_sideband_required":false,"stale_writers_refused":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:265: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.54s) +=== RUN TestSceneControlFailedSelectionDoesNotLoopNative + scene_control_failure_native_test.go:91: NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt +--- PASS: TestSceneControlFailedSelectionDoesNotLoopNative (0.54s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 2.464s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-release-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-release-final.log new file mode 100644 index 00000000..cd0ffe64 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-release-final.log @@ -0,0 +1,11 @@ +=== RUN TestProgramReleaseNative +2026/10/12 17:46:55 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:7f2fcd58-096f-42a0-aaef-6b1143dc216b] details:map[status:200] domain:service message:HTTP action completed requestId:7f2fcd58-096f-42a0-aaef-6b1143dc216b schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:46:55 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:f820ddf2-6f66-4c8f-a287-fdbaef4c416c] details:map[status:200] domain:service message:HTTP action completed requestId:f820ddf2-6f66-4c8f-a287-fdbaef4c416c schemaVersion:1 severity:info source:orion.http]" +2026/10/12 17:46:55 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:ca9e12e0-f7ec-47ca-b875-825de0998ab9] details:map[status:202] domain:service message:HTTP action completed requestId:ca9e12e0-f7ec-47ca-b875-825de0998ab9 schemaVersion:1 severity:info source:orion.http]" + program_release_native_test.go:255: REAL_NATIVE_PROGRAM_RELEASE_PROOF first-start-empty=true retired=solar/lane-b preview_unchanged=true late_publication_refused=true next-start-no-reload=true receipt={"artifact_set":"sha256:f78211d4f36aef7d25d280899b900e03ca0c6784c8282edeb65abbd0a1ec1e6a","command_id":"release-1","edit_seq":1,"expected_revisions":{"preview":1,"program":1,"role_map":1},"expected_role_map":{"on_air":"B","preview":"A"},"output_state":"stopped","retired":true,"runtime_instance_id":"release-native-runtime","scene_id":"release-live","scene_version":"sha256:f78211d4f36aef7d25d280899b900e03ca0c6784c8282edeb65abbd0a1ec1e6a","schema":"orion.program-release.v1","status":"released","stop_command_id":"confirmed-stop-1","take_command_id":"first-take","target":"solar/lane-b","writer_id":"C7IMBXRCUMNN6XZJLDDKAA2KPB"} +--- PASS: TestProgramReleaseNative (0.84s) +=== RUN TestProgramReleaseBlueNative + program_release_native_test.go:312: REAL_NATIVE_BLUE_RELEASE_PROOF SDK instance stopped, physical Program null, next steps refused +--- PASS: TestProgramReleaseBlueNative (0.00s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 2.189s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-vet-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-recovery-vet-final.log new file mode 100644 index 00000000..e69de29b diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-after.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-after.log new file mode 100644 index 00000000..78a24703 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-after.log @@ -0,0 +1,6 @@ +=== RUN TestIdleSocketRecoveryNative + idle_recovery_native_test.go:64: CLOSED_SOCKET_TIMING {"configured_backoff_ms":250,"native_value_verified":true,"producer_ack_ms":1.052,"status":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"step":0} + idle_recovery_native_test.go:64: CLOSED_SOCKET_TIMING {"configured_backoff_ms":250,"native_value_verified":true,"producer_ack_ms":0.53,"status":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"step":1} +--- PASS: TestIdleSocketRecoveryNative (0.01s) +PASS +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.399s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-before.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-before.log new file mode 100644 index 00000000..249a083d --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-before.log @@ -0,0 +1,6 @@ +=== RUN TestIdleSocketRecoveryNative + idle_recovery_native_test.go:64: CLOSED_SOCKET_TIMING {"configured_backoff_ms":250,"native_value_verified":true,"producer_ack_ms":250.863,"status":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"step":0} + idle_recovery_native_test.go:64: CLOSED_SOCKET_TIMING {"configured_backoff_ms":250,"native_value_verified":true,"producer_ack_ms":0.543,"status":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"step":1} +--- PASS: TestIdleSocketRecoveryNative (0.26s) +PASS +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.560s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-final.log b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-final.log new file mode 100644 index 00000000..07d41597 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-idle-socket-native-final.log @@ -0,0 +1,6 @@ +=== RUN TestIdleSocketRecoveryNative + idle_recovery_native_test.go:64: CLOSED_SOCKET_TIMING {"configured_backoff_ms":250,"native_value_verified":true,"producer_ack_ms":1.058,"status":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":2},"step":0} + idle_recovery_native_test.go:64: CLOSED_SOCKET_TIMING {"configured_backoff_ms":250,"native_value_verified":true,"producer_ack_ms":0.776,"status":{"pending":0,"capacity":256,"recovering":false,"terminal":false,"reconnects":1,"delivered":3},"step":1} +--- PASS: TestIdleSocketRecoveryNative (0.01s) +PASS +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.258s diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-native-harness.mjs b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-native-harness.mjs new file mode 100644 index 00000000..47a427b7 --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-native-harness.mjs @@ -0,0 +1,13 @@ +import { SolarReceptionServer } from 'file:///D:/Documents/Zab/Prism/.worktrees/eleven-local-20261010-voice-controls/.cache/solar-update/source/dist/server/index.mjs'; +import { spawn } from 'node:child_process'; +const resources = Object.fromEntries(['orion/state','solar/generations','solar/sessions'].map(key=>[key,{type:'orion.state/1',initial:{}}])); +for(const key of ['solar/lane-a','solar/lane-b']) resources[key]={type:'solar.lsml/1',initial:null}; +const receiver = new SolarReceptionServer({binaryPath:'D:/Documents/Zab/Prism/.worktrees/eleven-local-20261010-voice-controls/.cache/solar-update/source/dist/native/win32-x64/lsdpd.exe',origins:['http://127.0.0.1:8099'],resources}); +try { + const connection=await receiver.start(); + const pkg=process.env.ORION_TEST_IDLE_PROBE_PACKAGE??'./internal/api'; + const test=process.env.ORION_TEST_IDLE_PROBE_TEST??'^TestEditableIdleDeltaNative$'; + const child=spawn('go',['test',pkg,'-run',test,'-v','-count=1'],{env:{...process.env,ORION_TEST_PRIVATE_LANE_ADDRESS:connection.address},stdio:'inherit'}); + const code=await new Promise((resolve,reject)=>{child.on('error',reject);child.on('exit',resolve)}); + if(code!==0) throw Error(`Private idle-delta test exit ${code}`); +} finally {await receiver.stop();} diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-provenance.json b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-provenance.json new file mode 100644 index 00000000..673000ea --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-provenance.json @@ -0,0 +1,84 @@ +{ + "worktree": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing", + "branch": "eleven/local-20261012-lane-role-routing", + "base": "ab3d9f5668a69f0f578fc8da3f339081ae1e0700", + "source_commit": "2899262027ad3f57a2701fedbf5c288aaa5cf041", + "source_files": [ + { + "path": "docs/development/scene-feature-map.md", + "sha256": "85133a2ba6f5eb1b60da8b7ceb95d77db77c94b151dc48887d22ef7580266ad6" + }, + { + "path": "docs/runbooks/native-recovery.md", + "sha256": "1c41b358795e04be528baa2181390af1cb22c5c66b6c3194e1b505c0af4faab8" + }, + { + "path": "internal/api/README.md", + "sha256": "3e209bc0996136558f042b0a4a566d4fa7abceeeaef2c9c407121680ba597401" + }, + { + "path": "internal/api/editable_idle_native_test.go", + "sha256": "8fc60066506a4c16472ba0dc134f25c04a5a90478c0a2c7b1f5901184318c848" + }, + { + "path": "internal/lsdpreception/README.md", + "sha256": "ecebee2d6cd9ac7ab40cbf26213c6de76d5da8c10fafddc28177655eb51dd4dc" + }, + { + "path": "internal/lsdpreception/idle_recovery_native_test.go", + "sha256": "4ff9ee8e6dd87b0a08b830eae99df16f92ccf6642f6b3d577aab50747b55989c" + }, + { + "path": "internal/lsdpreception/idle_recovery_test.go", + "sha256": "6fbc550a1e05e895486876f327adcb045bc06c50cd7cad89e2c35badbe638e83" + }, + { + "path": "internal/lsdpreception/producer.go", + "sha256": "b7523b4a8d00a0ed42a74b9c570afba07265aa7e92d6d450b6a3fa75b1d57d5c" + }, + { + "path": "go.mod", + "sha256": "a6ab8c922941c2b952f3e83b96f1a88fb7757145a93435886cb7c252d61e074a" + }, + { + "path": "go.sum", + "sha256": "476e5d6e8d8f4c6674dc53f288615445f12ab175430d4bc159870ed89ae2d45d" + }, + { + "path": "third_party/lsdpnative/client.go", + "sha256": "4dcfc00acaeeed321e6cfcabf241abdee72c18680089e29dc7f5dddfbac44366" + } + ], + "binary": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing\\.cache\\orion-idle-recovery-packaged.exe", + "binary_sha256": "a016dc627dbb6115362fca7c07a7295ce9287c5aac1016878058de59dac8e512", + "blue_module": "v0.1.1-0.20261012083435-ff8b1dde0bad", + "blue_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622", + "blue_manifest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "buildvcs": false, + "fixture_path": "D:/Documents/Zab/Prism/.worktrees/eleven-local-20261008-scene-sync/.cache/live-edit/current-preview-lsml.json", + "fixture_sha256": "30d9caec89e00632e0da8bb77db5702eead00f27487f41d764604e83f47a30e1", + "native_server_source": "e695e14f9f664f430ffc2e0e75d083fab88abc7f", + "native_server_sha256": "7bd059c56b0daa56b3da24f0ccdb3b6a888709feff9618cd3b8cd2a045bdce60", + "common_runtime_touched": false, + "common_integration_owner": "Main 1", + "validation": { + "native_program_release": "pass", + "native_lane_commit": "pass", + "deterministic_recovery_and_shutdown_tests": "pass", + "natural_idle_122s_native": "pass", + "go_test_all": "pass", + "private_descriptor": "pass", + "natural_idle_probe_exit": 0, + "go_vet_all": "pass", + "private_descriptor_exit": 0, + "forced_socket_native": "pass" + }, + "results": { + "natural_expiry_reconnects_after": 1, + "closed_socket_final_ms": 1.058, + "closed_socket_before_ms": 250.863, + "natural_expiry_native_barrier_ms": 6.879, + "natural_expiry_ws_ack_ms": 7.438, + "natural_expiry_reconnects_before": 0 + } +} diff --git a/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-report.md b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-report.md new file mode 100644 index 00000000..b1267cbe --- /dev/null +++ b/evidence/local-20261012-idle-delta/eleven/20261012T154833Z-report.md @@ -0,0 +1,53 @@ +# Orion — premier delta après expiration du socket natif + +Worktree de continuation : `D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing`. Branche : `eleven/local-20261012-lane-role-routing`. Base : `ab3d9f5668a69f0f578fc8da3f339081ae1e0700`. Commits signés : `76e3b476a3008526c3f5a6f75ab68d2efa5dedec` (reprise immédiate), `2899262027ad3f57a2701fedbf5c288aaa5cf041` (Dial échoué/shutdown). Aucun redémarrage ou mutation du dev commun par cette unité. Main 1 possède Prism, la relance et la qualification affichée. + +## Cause observée + +Prism a mesuré un premier ACK WS à 264,841 ms sur une feuille, puis des ACK à 5–15 ms. Main 1 a confirmé par ses lectures encadrant le banc que `native_delivery.reconnects` passe de 2 à 3 au premier delta, avec pending 0 et aucune erreur terminale après reprise. Références Prism : `.cache/live-edit/pixel-wire.json`, `pixel-wire-second.json`, `native-delivery-before.json`, `native-delivery-after.json` dans son worktree `eleven-local-20261008-scene-sync`. + +L'auteur Scene attend directement son inbox : aucun sleep de réveil. Producer attend également sa queue. Le client TCP Go utilise déjà TCP_NODELAY ; aucune modification du binding byte-pinné `third_party/lsdpnative/client.go`. Le seul délai correspondant était le backoff inconditionnel de 250 ms dans `Producer.exchange` après transport perdu. + +La preuve privée distingue document froid et socket expiré. Avec la scène actuelle réhydratée depuis son LSML immuable et ses assets non-font, les pauses 2, 6 et 31 secondes donnent des ACK d'environ 4–7 ms, sans reconnexion. Après 122 secondes, le receiver ferme naturellement le socket inactif ; la même mutation implique alors une reconnexion. Fermer uniquement le socket producer du banc, sans arrêter le receiver, reproduit précisément le délai historique de 250,863 ms. + +## Correction + +Une seule première reconnexion est immédiate après perte d'un client établi. La requête conserve exactement son ID et son payload, y compris en cas d'issue incertaine. Si cette reprise échoue, les tentatives suivantes conservent le délai de 250 ms. L'échec de Dial initial conserve également le backoff. Pas de keepalive applicatif, pas de delta artificiel, pas de polling de scène. + +Le test long a aussi révélé un crash préexistant à l'arrêt : `native.Dial` en erreur peut retourner un `*native.Client(nil)` converti en interface non nil. L'ancien code le mémorisait puis appelait Close dessus. Désormais le client n'est remplacé qu'après Dial réussi. Le test de cancellation utilise le vrai Dial natif ; l'interface reste nil, sans panic. Le premier log d'expiration avec ce crash est conservé comme preuve de découverte, distinct du log final passé. + +## Résultats et régressions + +| Banc privé | Avant | Final | +| --- | --- | --- | +| Socket producer fermé, receiver conservé | Premier ACK 250,863 ms | Premier ACK 1,058 ms ; suivant 0,776 ms | +| Scène actuelle après expiration naturelle de 122 s | Délai commun signalé par Prism, avec reconnects +1 | ACK WS 7,438 ms ; barrière native 6,879 ms ; reconnects 0 → 1 | + +Les huit deltas du test long sont vérifiés dans l'état natif après leur ACK. Les suivants prennent 4,4–6,5 ms. Le test et son processus Go se terminent avec exit 0, sans panic. Le receiver privé est arrêté par le harness. Les temps sont des observations sur cette machine, pas des assertions de SLA. + +Validations finales : + +- `go test ./...` et `go vet ./...` passent avec le SDK Blue publié, sans remplacement local. +- Tests déterministes : reprise immédiate à identité inchangée, backoff après échec, Dial natif annulé sans client invalide. +- `TestIdleSocketRecoveryNative` : application réelle après perte du socket et maintien du receiver. +- `TestEditableIdleDeltaNative` : API/WS réellement enregistrés, même auteur, une feuille, ACK natif, pauses et expiration naturelle. +- `TestProgramReleaseNative` et `TestProgramReleaseBlueNative` : retrait Program réel, Preview conservé, replay protégé et instance SDK arrêtée. +- `TestLaneCommitNative` et `TestSceneControlFailedSelectionDoesNotLoopNative` : échanges de rôles/éditions et anti-boucle conservés. +- Probe HTTP du binaire final : descriptor attendu et arrêt gracieux exit 0. +- `git diff --check` passe ; le binding pin reste inchangé depuis la base. + +## Artefact final + +`D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/.cache/orion-idle-recovery-packaged.exe` + +SHA256 : `a016dc627dbb6115362fca7c07a7295ce9287c5aac1016878058de59dac8e512`. + +Source : `2899262027ad3f57a2701fedbf5c288aaa5cf041`. Module Blue : `v0.1.1-0.20261012083435-ff8b1dde0bad`. Descriptor revision `ff8b1dde0bad4f53e876651a0e0748cca3e9f622`, digest `sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41`. Le manifeste adjacent contient les hashes source, fixture et binaire. La fixture utilisateur n'est ni publiée ni copiée dans les preuves. + +Build : `go build -trimpath -buildvcs=false -ldflags "-s -w -X github.com/ZabLaboratory/Orion/internal/buildinfo.BlueRuntimeSourceDigest=sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41 -X github.com/ZabLaboratory/Orion/internal/buildinfo.BlueRuntimeSourceRevision=ff8b1dde0bad4f53e876651a0e0748cca3e9f622" -o .cache/orion-idle-recovery-packaged.exe ./cmd/orion`. Le stamping Go automatique reste désactivé car il annonçait le checkout canonique ; le vrai commit du worktree est renseigné dans la provenance explicite. + +L'artefact intermédiaire `887c4c...` antérieur à la correction shutdown est remplacé par ce binaire final. Au signalement de Main 1, le dev commun utilisait Orion `93ed5f...`. Ces essais privés ne modifient pas son installation ; Main 1 reçoit le nouvel artefact pour une intégration coordonnée. + +## Limites et suite + +La mesure native ne certifie pas la latence pixel ni la cadence Chromium dans Prism. Main 1 doit refaire le premier delta après une pause supérieure à deux minutes dans le dev commun avec le binaire final. Le banc réhydrate la source immuable et les assets non-font du snapshot ; il ne lance pas CEF et ne restaure pas les digests du font bank ou des captures caméra. Aucune émission externe, caméra, micro, calibration ou configuration utilisateur modifiée. Le détecteur de courses Go n'est pas exécuté (CGO désactivé). Worktree conservé pour l'intégration ; seul `.cache/` préexistant reste non suivi après commit des preuves. diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-all-packages.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-all-packages.log new file mode 100644 index 00000000..1de76364 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-all-packages.log @@ -0,0 +1,26 @@ +? github.com/ZabLaboratory/Orion/cmd/healthcheck [no test files] +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) +ok github.com/ZabLaboratory/Orion/internal/adapters (cached) +ok github.com/ZabLaboratory/Orion/internal/api 2.426s +ok github.com/ZabLaboratory/Orion/internal/attestation (cached) +ok github.com/ZabLaboratory/Orion/internal/auth (cached) +ok github.com/ZabLaboratory/Orion/internal/bluehost 3.146s +ok github.com/ZabLaboratory/Orion/internal/blueproject (cached) +ok github.com/ZabLaboratory/Orion/internal/bluespike (cached) +ok github.com/ZabLaboratory/Orion/internal/bluewire (cached) +? github.com/ZabLaboratory/Orion/internal/buildinfo [no test files] +? github.com/ZabLaboratory/Orion/internal/canonical [no test files] +ok github.com/ZabLaboratory/Orion/internal/compiler (cached) +ok github.com/ZabLaboratory/Orion/internal/config (cached) +ok github.com/ZabLaboratory/Orion/internal/conformance (cached) +ok github.com/ZabLaboratory/Orion/internal/effects (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdp 6.819s +ok github.com/ZabLaboratory/Orion/internal/lsdpreception (cached) +ok github.com/ZabLaboratory/Orion/internal/obs (cached) +ok github.com/ZabLaboratory/Orion/internal/protocol (cached) +ok github.com/ZabLaboratory/Orion/internal/providers (cached) +ok github.com/ZabLaboratory/Orion/internal/runtime 6.085s +ok github.com/ZabLaboratory/Orion/internal/streamcontrol (cached) +ok github.com/ZabLaboratory/Orion/internal/workload (cached) +ok github.com/ZabLaboratory/Orion/internal/ws (cached) +? github.com/ZabLaboratory/Orion/third_party/lsdpnative [no test files] diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-native-mixed-proof.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-native-mixed-proof.log new file mode 100644 index 00000000..250d0501 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-native-mixed-proof.log @@ -0,0 +1,7 @@ +=== RUN TestLaneCommitNative +2026/10/12 10:41:02 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:86989714-80a3-4853-9f44-2d0b6c128745] details:map[status:200] domain:service message:HTTP action completed requestId:86989714-80a3-4853-9f44-2d0b6c128745 schemaVersion:1 severity:info source:orion.http]" + lane_commit_native_test.go:191: {"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"program_delta_isolated":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:192: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.53s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 1.781s diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-pinned-sdk-tests.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-pinned-sdk-tests.log new file mode 100644 index 00000000..64ce2d9e --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-pinned-sdk-tests.log @@ -0,0 +1,6 @@ +ok github.com/ZabLaboratory/Orion/internal/api 2.934s +ok github.com/ZabLaboratory/Orion/internal/bluehost 3.655s +ok github.com/ZabLaboratory/Orion/internal/bluewire 1.373s +ok github.com/ZabLaboratory/Orion/internal/lsdpreception 1.691s +ok github.com/ZabLaboratory/Orion/internal/runtime 6.542s +ok github.com/ZabLaboratory/Orion/cmd/orion 1.790s diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-race-limitation.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-race-limitation.log new file mode 100644 index 00000000..d0701b0f --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-race-limitation.log @@ -0,0 +1 @@ +go: -race requires cgo; enable cgo by setting CGO_ENABLED=1 diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-report.md b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-report.md new file mode 100644 index 00000000..aa7a939d --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-report.md @@ -0,0 +1,23 @@ +# Physical lane role routing + +Workspace Orion/.worktrees/eleven-local-20261012-lane-role-routing; branch eleven/local-20261012-lane-role-routing; base11334610a68c0e9bf7dcf27dc6f2075c6b5b2104. Native Git identity verified. Dedicated Blue workspace owns the additive runtime API. + +Two stable physical native resources preserve the original Solar source document. A verified native TakeCommitted is projected to /scene_control/defaults/lane_commit. Orion validates role/revision/scene/instance correlation, acquires both scene admission leases, joins both bridge loops, transfers the same actor/mirror authority and reconciles observed + desired roles atomically. Exact bounded replay does not perform another permutation. Stale/conflicting/foreign/busy/identity/capability transfers explicitly refuse. Main owns native frame/PTS verification and blocks further Preview preparation until the correlated receipt. + +No full document assignment, new mirror, Blue Load/Start/on-start or Solar load occurs at the role commit. Camera/viewer changes remain absolute leaves. New Preview replaces only its physical resource. Editable admission stops any previous Preview Blue actor, occupies the static Host slot, and keeps its native mutation mirror for stream rules. Desired/current/observed identities derive from the actual mirrors rather than an obsolete catalog selection. + +Compatibility: native receiver advertisement enables physical mode; older resources retain their own route. Legacy Engine A and standalone rules retain their execution contracts. No SDK mutation in foreign caches, no Computer Use, stream, recording, physical capture/microphone, or common runtime restart by this workstream. + +Retained fixes: imported20 active Orion snapshot files for source/reference synchronization, source-only editable delivery, loopback/cache authorization, optimized Solar phase/ack timings and explicit native route release. Kept newer base retirement of inactive editable actors and ReleasePreview/ReleaseEditableAir. Provenance list is next to this report. + +Validation: Go all packages passed with the matching local SDK; affected packages passed again against the published pinned SDK in normal go.mod. Blue tests/manifest passed in its repository. Native Rust TestLaneCommitNative passed with a private synthetic node: two correlated role commits, actual Blue→editable HTTP API, receipt sources, atomically reconciled desired/current, documents identical at both Takes, retained Program deltas while Preview changes, static Program rejects stepping the prior Blue actor, foreign runtime refusal. Native frame/PTS values in this Orion probe are synthetic contract inputs; actual Pulsar verification is separately proven in its repository and real rendering in the coordinator Prism/Solar evidence. + +Race detector not executed: local Go CGO_ENABLED=0 and no gcc/clang on PATH. This is a qualification limit; ordinary Go tests and explicit lease/join tests pass. No global environment or installed compiler changed. + +Superseded artifact: .cache/orion-lane-routing.exe SHA25654611b862d1ebcce486ffc8465b7d94ee7b62045c9c2251f36548003618a2df1 passed functional tests but omitted packaging provenance ldflags. Its descriptor returned unknown and Prism correctly refused LOCAL_BLUE_RUNTIME_MISMATCH:source_digest. It must not be installed. This was an artifact packaging mistake, not a runtime guard defect. + +Corrected integration artifact: .cache/orion-lane-routing-packaged.exe SHA256e596696af6930a3b594d7b6de7bf92f5805951dbd85dd812cb30fc6fed3cc351. Normal go.mod pins Blue v0.1.1-0.20261012083435-ff8b1dde0bad with no replacement. Built using go build -trimpath -ldflags "-s -w -X github.com/ZabLaboratory/Orion/internal/buildinfo.BlueRuntimeSourceDigest=sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41 -X github.com/ZabLaboratory/Orion/internal/buildinfo.BlueRuntimeSourceRevision=ff8b1dde0bad4f53e876651a0e0748cca3e9f622" -o .cache/orion-lane-routing-packaged.exe ./cmd/orion. These are the provenance flags in Prism's standard build-orion-sidecar script. A plain go build is not a packaged artifact. + +Actual packaged executable booted twice against private native Rust resources and an isolated synthetic local scene bundle/trust fixture; its HTTP /api/v1/runtime/descriptor returned the exact manifest digest and Blue revision, API blue.runtime.api.v1 and ABI blue-runtime-abi.v1. Each private process stopped gracefully with exit0. Packaged descriptor/buildinfo logs are 20261012T090100Z beside this report. Go's embedded VCS metadata resolves the canonical checkout revision with dirty=true in this worktree; it is not an Orion source HEAD attestation. Actual source HEAD at packaging is 3b6c79986200206b523f7fb7b79963171812cd67. Coordinator Main1 owns installation, actual common launch and two Solar/Vision host proof. No guard disabled and no common runtime modified by this workstream. + +Remaining integration: verify actual two Solar engine/document identities, visible single return, native pixels, mutation isolation, stinger and preserved voice/config in Prism. This report does not substitute source tests for that live evidence. Keep all active worktrees/build artifacts until integrated and no longer consumed. No merged/deployed claim. diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-source-provenance.json b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-source-provenance.json new file mode 100644 index 00000000..16e1d600 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T084100Z-source-provenance.json @@ -0,0 +1,33 @@ +{ + "base": "11334610a68c0e9bf7dcf27dc6f2075c6b5b2104", + "retained_active_snapshot_files": [ + "internal/api/README.md", + "internal/api/editable_native_delivery_test.go", + "internal/api/editable_preview.go", + "internal/api/editable_preview_source.go", + "internal/api/editable_preview_source_test.go", + "internal/api/editable_preview_test.go", + "internal/api/native_scene_presentation.go", + "internal/api/native_scene_presentation_test.go", + "internal/api/operator.go", + "internal/api/public.go", + "internal/api/scene_intent.go", + "internal/api/scene_presentation.go", + "internal/bluehost/README.md", + "internal/bluehost/effects.go", + "internal/bluehost/host.go", + "internal/lsdpreception/README.md", + "internal/lsdpreception/control.go", + "internal/lsdpreception/producer.go", + "internal/lsdpreception/recovery_test.go", + "internal/lsdpreception/route_retention_test.go" + ], + "retained_base_fixes": [ + "inactive editable retirement", + "ReleasePreview/ReleaseEditableAir" + ], + "blue_commit": "ff8b1dde0bad", + "blue_module": "v0.1.1-0.20261012083435-ff8b1dde0bad", + "integrated_binary": ".cache/orion-lane-routing.exe", + "integrated_binary_sha256": "54611b862d1ebcce486ffc8465b7d94ee7b62045c9c2251f36548003618a2df1" +} diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T090100Z-packaged-buildinfo.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T090100Z-packaged-buildinfo.log new file mode 100644 index 00000000..5fa1bf1b --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T090100Z-packaged-buildinfo.log @@ -0,0 +1,33 @@ +.cache/orion-lane-routing-packaged.exe: go1.26.4 + path github.com/ZabLaboratory/Orion/cmd/orion + mod github.com/ZabLaboratory/Orion v1.1.1-0.20260928024901-1db586b75d55+dirty + dep github.com/Lumencast/lumencast-go v0.3.2-0.20260816093300-0c7cfc65c694 h1:2y14teoPqAKlg8YsBPrYmkHQl6DNbY9MDhO9+QyIY34= + dep github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20261012083435-ff8b1dde0bad h1:OI43JUxSQrGAm2eCn0WYc+z8/1zb64MD0epIsTiwTDc= + dep github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= + dep github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= + dep github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= + dep github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= + dep github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= + dep github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= + dep github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= + dep github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= + dep github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= + dep github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= + dep github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= + dep github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= + dep go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= + dep golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= + dep golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= + dep golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= + dep google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= + build -buildmode=exe + build -compiler=gc + build -trimpath=true + build CGO_ENABLED=0 + build GOARCH=amd64 + build GOOS=windows + build GOAMD64=v1 + build vcs=git + build vcs.revision=1db586b75d55eaa596048724ca9fc5d292eef4ad + build vcs.time=2026-09-28T02:49:01Z + build vcs.modified=true diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T090100Z-packaged-descriptor.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T090100Z-packaged-descriptor.log new file mode 100644 index 00000000..f1b1cc48 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T090100Z-packaged-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "e596696af6930a3b594d7b6de7bf92f5805951dbd85dd812cb30fc6fed3cc351", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-descriptor.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-descriptor.log new file mode 100644 index 00000000..86727a61 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "48ecd40ce06b6dc34d5125c9a85de70e186026a220c71a94136c8369eebe4045", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-native.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-native.log new file mode 100644 index 00000000..92a9c28c --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-native.log @@ -0,0 +1,10 @@ +=== RUN TestLaneCommitNative +2026/10/12 11:22:42 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:38630854-3749-4025-975e-8867c0df014c] details:map[status:200] domain:service message:HTTP action completed requestId:38630854-3749-4025-975e-8867c0df014c schemaVersion:1 severity:info source:orion.http]" + lane_commit_native_test.go:191: {"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"program_delta_isolated":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:192: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.54s) +=== RUN TestSceneControlFailedSelectionDoesNotLoopNative + scene_control_failure_native_test.go:91: NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt +--- PASS: TestSceneControlFailedSelectionDoesNotLoopNative (0.55s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 2.263s diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-regression.log b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-regression.log new file mode 100644 index 00000000..db3d0089 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-regression.log @@ -0,0 +1,26 @@ +? github.com/ZabLaboratory/Orion/cmd/healthcheck [no test files] +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) +ok github.com/ZabLaboratory/Orion/internal/adapters 1.883s +ok github.com/ZabLaboratory/Orion/internal/api (cached) +ok github.com/ZabLaboratory/Orion/internal/attestation (cached) +ok github.com/ZabLaboratory/Orion/internal/auth (cached) +ok github.com/ZabLaboratory/Orion/internal/bluehost (cached) +ok github.com/ZabLaboratory/Orion/internal/blueproject (cached) +ok github.com/ZabLaboratory/Orion/internal/bluespike 0.366s +ok github.com/ZabLaboratory/Orion/internal/bluewire (cached) +? github.com/ZabLaboratory/Orion/internal/buildinfo [no test files] +? github.com/ZabLaboratory/Orion/internal/canonical [no test files] +ok github.com/ZabLaboratory/Orion/internal/compiler (cached) +ok github.com/ZabLaboratory/Orion/internal/config (cached) +ok github.com/ZabLaboratory/Orion/internal/conformance 0.736s +ok github.com/ZabLaboratory/Orion/internal/effects (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdp 6.636s +ok github.com/ZabLaboratory/Orion/internal/lsdpreception (cached) +ok github.com/ZabLaboratory/Orion/internal/obs (cached) +ok github.com/ZabLaboratory/Orion/internal/protocol (cached) +ok github.com/ZabLaboratory/Orion/internal/providers 0.745s +ok github.com/ZabLaboratory/Orion/internal/runtime (cached) +ok github.com/ZabLaboratory/Orion/internal/streamcontrol (cached) +ok github.com/ZabLaboratory/Orion/internal/workload (cached) +ok github.com/ZabLaboratory/Orion/internal/ws 1.268s +? github.com/ZabLaboratory/Orion/third_party/lsdpnative [no test files] diff --git a/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-report.md b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-report.md new file mode 100644 index 00000000..6b403b70 --- /dev/null +++ b/evidence/local-20261012-lane-role-routing/eleven/20261012T093000Z-control-failure-report.md @@ -0,0 +1,13 @@ +# Failed selection feedback loop + +Continuation in Orion/.worktrees/eleven-local-20261012-lane-role-routing, branch eleven/local-20261012-lane-role-routing, previous HEAD775f623b1dbb6f9b4e9d1563b6bab2335d213376. The common Prism test exposed repeated BASE_MISMATCH while applying lane_commit; native state contained a persisted desired Program and observed failed SCENE_CATALOG_UNAVAILABLE. + +SceneControl.Run previously queued every desired lane on every native notification. A failed catalog selection wrote preparing then failed, never set successful current, and thereby triggered itself again via its own observed writes. selection.lsml is only seeded at boot; the feedback loop was in the native watcher, not continuous disk reload. + +The watcher now queues each changed desired identity once, including failed admissions. Observed-only writes and reconnect snapshots do not retry failed intent. Removing a desired identity forgets it, so a later newly added identity may be admitted. Role commit still reconciles actual Sources/current/desired before queue comparison and never performs another admission. README documents this existing intended contract. No scene cache or runtime guard was disabled. + +New packaged executable .cache/orion-lane-routing-packaged.exe SHA25648ecd40ce06b6dc34d5125c9a85de70e186026a220c71a94136c8369eebe4045 supersedes E596. Normal pinned Blue SDK and standard packaging ldflags preserved. Actual private executable HTTP descriptor returned digest sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41 and revisionff8b1dde0bad4f53e876651a0e0748cca3e9f622; graceful private shutdown0. + +Native Rust proof passed TestSceneControlFailedSelectionDoesNotLoopNative: absent catalog admits one failed attempt; four unrelated observed writes plus250ms do not change activation_id; changed desired version admits one new failed attempt, stable after another250ms. TestLaneCommitNative still passes the two mixed Blue/editable role transfers and isolation contract. Tests use only a disposable private receiver and synthetic sources; no common process control, physical capture, microphone, stream or recording. Go all packages and git diff --check pass. Native/descriptor/regression logs use the same20261012T093000Z prefix. + +This removes an observed uncontrolled writer. It does not prove every common BASE_MISMATCH was caused by that writer; coordinator Main1 additionally verifies native hash/error transport and owns real installation/restart, rendering and final three-Take qualification. Keep active worktrees and binaries while consumed by that integration. diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-build-metadata.log b/evidence/local-20261012-program-release/eleven/20261012T145918Z-build-metadata.log new file mode 100644 index 00000000..e4ed5c64 --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-build-metadata.log @@ -0,0 +1,29 @@ +D:\Documents\Zab\Orion\.worktrees\eleven-local-20261012-lane-role-routing\.cache\orion-program-release-packaged.exe: go1.26.4 + path github.com/ZabLaboratory/Orion/cmd/orion + mod github.com/ZabLaboratory/Orion (devel) + dep github.com/Lumencast/lumencast-go v0.3.2-0.20260816093300-0c7cfc65c694 h1:2y14teoPqAKlg8YsBPrYmkHQl6DNbY9MDhO9+QyIY34= + dep github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20261012083435-ff8b1dde0bad h1:OI43JUxSQrGAm2eCn0WYc+z8/1zb64MD0epIsTiwTDc= + dep github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= + dep github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= + dep github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= + dep github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= + dep github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= + dep github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= + dep github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= + dep github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= + dep github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= + dep github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= + dep github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= + dep github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= + dep go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= + dep golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= + dep golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= + dep golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= + dep google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= + build -buildmode=exe + build -compiler=gc + build -trimpath=true + build CGO_ENABLED=0 + build GOARCH=amd64 + build GOOS=windows + build GOAMD64=v1 diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-native-regression-harness.mjs b/evidence/local-20261012-program-release/eleven/20261012T145918Z-native-regression-harness.mjs new file mode 100644 index 00000000..08fbc807 --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-native-regression-harness.mjs @@ -0,0 +1,11 @@ +import { SolarReceptionServer } from 'file:///D:/Documents/Zab/Prism/.worktrees/eleven-local-20261010-voice-controls/.cache/solar-update/source/dist/server/index.mjs'; +import { spawn } from 'node:child_process'; +const resources = Object.fromEntries(['orion/state','solar/generations','solar/sessions'].map(k=>[k,{type:'orion.state/1',initial:{}}])); +for(const key of ['solar/lane-a','solar/lane-b']) resources[key]={type:'solar.lsml/1',initial:null}; +const node = new SolarReceptionServer({binaryPath:'D:/Documents/Zab/Prism/.worktrees/eleven-local-20261010-voice-controls/.cache/solar-update/source/dist/native/win32-x64/lsdpd.exe',origins:['http://127.0.0.1:8099'],resources}); +try { + const connection=await node.start(); + const child=spawn('go',['test','./internal/api','-run','^(TestLaneCommitNative|TestSceneControlFailedSelectionDoesNotLoopNative)$','-v','-count=1'],{env:{...process.env,ORION_TEST_PRIVATE_LANE_ADDRESS:connection.address},stdio:'inherit'}); + const code=await new Promise((resolve,reject)=>{child.on('error',reject);child.on('exit',resolve)}); + if(code!==0) throw new Error(`Go native test exit ${code}`); +} finally {await node.stop();} diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-native-release-harness.mjs b/evidence/local-20261012-program-release/eleven/20261012T145918Z-native-release-harness.mjs new file mode 100644 index 00000000..d6678bdc --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-native-release-harness.mjs @@ -0,0 +1,11 @@ +import { SolarReceptionServer } from 'file:///D:/Documents/Zab/Prism/.worktrees/eleven-local-20261010-voice-controls/.cache/solar-update/source/dist/server/index.mjs'; +import { spawn } from 'node:child_process'; +const resources=Object.fromEntries(['orion/state','solar/generations','solar/sessions'].map(key=>[key,{type:'orion.state/1',initial:{}}])); +for(const key of ['solar/lane-a','solar/lane-b']) resources[key]={type:'solar.lsml/1',initial:null}; +const receiver=new SolarReceptionServer({binaryPath:'D:/Documents/Zab/Prism/.worktrees/eleven-local-20261010-voice-controls/.cache/solar-update/source/dist/native/win32-x64/lsdpd.exe',origins:['http://127.0.0.1:8099'],resources}); +try { + const connection=await receiver.start(); + const child=spawn('go',['test','./internal/api','-run','^TestProgramRelease(Native|BlueNative)$','-v','-count=1'],{env:{...process.env,ORION_TEST_PRIVATE_LANE_ADDRESS:connection.address},stdio:'inherit'}); + const code=await new Promise((resolve,reject)=>{child.on('error',reject);child.on('exit',resolve)}); + if(code!==0) throw Error(`Private native program release exit ${code}`); +} finally {await receiver.stop();} diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-descriptor.log b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-descriptor.log new file mode 100644 index 00000000..17d5e495 --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-descriptor.log @@ -0,0 +1,95 @@ +{ + "binary_sha256": "93ed5f1a14f5aba16aba1ce8bff75fea88d69daabae61ebd9ef72f7e77c07c99", + "descriptor": { + "schema_version": "blue.runtime.descriptor.v1", + "runtime_api": "blue.runtime.api.v1", + "runtime_module": "blue-runtime-go", + "runtime_module_version": "0.1.0", + "runtime_abi": "blue-runtime-abi.v1", + "canonicalization": "lsml.canonicalise.v1", + "program_schemas": [ + "blue.program.v1" + ], + "supported_opcodes": [ + "core.animation.play@1", + "core.cast.to-boolean@1", + "core.cast.to-float@1", + "core.cast.to-integer@1", + "core.cast.to-string@1", + "core.compare.equal@1", + "core.compare.greater-equal@1", + "core.compare.greater-than@1", + "core.compare.less-equal@1", + "core.compare.less-than@1", + "core.compare.not-equal@1", + "core.data.aggregate@1", + "core.data.get-field@1", + "core.data.list-append@1", + "core.data.list-at@1", + "core.data.list-length@1", + "core.data.set-field@1", + "core.db.from@1", + "core.db.join@1", + "core.db.limit@1", + "core.db.order@1", + "core.db.query@1", + "core.db.select@1", + "core.db.where@1", + "core.effect.invoke@1", + "core.event.on-event@1", + "core.event.on-platform-event@1", + "core.event.on-start@1", + "core.event.on-tick@1", + "core.flow.branch@1", + "core.flow.delay@1", + "core.flow.for-each@1", + "core.flow.for-loop@1", + "core.flow.gate@1", + "core.flow.select@1", + "core.flow.sequence@1", + "core.flow.while@1", + "core.http-request@1", + "core.http.request@1", + "core.input@1", + "core.literal@1", + "core.logic.and@1", + "core.logic.not@1", + "core.logic.or@1", + "core.logic.xor@1", + "core.math.abs@1", + "core.math.add@1", + "core.math.ceil@1", + "core.math.clamp@1", + "core.math.div@1", + "core.math.floor@1", + "core.math.lerp@1", + "core.math.max@1", + "core.math.min@1", + "core.math.mod@1", + "core.math.mul@1", + "core.math.round@1", + "core.math.sub@1", + "core.operator.await-value@1", + "core.operator.on-call@1", + "core.output@1", + "core.overlay-app.set@1", + "core.print@1", + "core.service.call@1", + "core.show.emit@1", + "core.source.read@1", + "core.string.concat@1", + "core.string.format@1", + "core.string.length@1", + "core.string.lower@1", + "core.string.split@1", + "core.string.upper@1", + "core.variable.get@1", + "core.variable.set@1" + ], + "source_digest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "source_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622" + }, + "private_process": true, + "common_runtime_touched": false +} +private_process_exit=0 diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-native-final.log b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-native-final.log new file mode 100644 index 00000000..a7597f29 --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-native-final.log @@ -0,0 +1,11 @@ +=== RUN TestProgramReleaseNative +2026/10/12 16:56:49 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:705a86cc-6ef5-436a-85e2-a8cd09748274] details:map[status:200] domain:service message:HTTP action completed requestId:705a86cc-6ef5-436a-85e2-a8cd09748274 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:56:50 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:ef95d5cb-6f87-4822-bbc9-377af90c0ae5] details:map[status:200] domain:service message:HTTP action completed requestId:ef95d5cb-6f87-4822-bbc9-377af90c0ae5 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:56:50 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:96705c33-404b-4991-9e9e-203588ba7c3f] details:map[status:202] domain:service message:HTTP action completed requestId:96705c33-404b-4991-9e9e-203588ba7c3f schemaVersion:1 severity:info source:orion.http]" + program_release_native_test.go:255: REAL_NATIVE_PROGRAM_RELEASE_PROOF first-start-empty=true retired=solar/lane-b preview_unchanged=true late_publication_refused=true next-start-no-reload=true receipt={"artifact_set":"sha256:f78211d4f36aef7d25d280899b900e03ca0c6784c8282edeb65abbd0a1ec1e6a","command_id":"release-1","edit_seq":1,"expected_revisions":{"preview":1,"program":1,"role_map":1},"expected_role_map":{"on_air":"B","preview":"A"},"output_state":"stopped","retired":true,"runtime_instance_id":"release-native-runtime","scene_id":"release-live","scene_version":"sha256:f78211d4f36aef7d25d280899b900e03ca0c6784c8282edeb65abbd0a1ec1e6a","schema":"orion.program-release.v1","status":"released","stop_command_id":"confirmed-stop-1","take_command_id":"first-take","target":"solar/lane-b","writer_id":"URKWUHZVZ2ZJAP5YMMFWCTI3HH"} +--- PASS: TestProgramReleaseNative (0.63s) +=== RUN TestProgramReleaseBlueNative + program_release_native_test.go:312: REAL_NATIVE_BLUE_RELEASE_PROOF SDK instance stopped, physical Program null, next steps refused +--- PASS: TestProgramReleaseBlueNative (0.01s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 2.169s diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-native-regression.log b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-native-regression.log new file mode 100644 index 00000000..91d18f79 --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-native-regression.log @@ -0,0 +1,17 @@ +=== RUN TestLaneCommitNative +2026/10/12 16:55:27 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:247fe821-1d50-4c81-bd1e-fc7836e214cc] details:map[status:200] domain:service message:HTTP action completed requestId:247fe821-1d50-4c81-bd1e-fc7836e214cc schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:55:27 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:d3873b62-def0-4600-91e7-1ba2732151dc] details:map[status:200] domain:service message:HTTP action completed requestId:d3873b62-def0-4600-91e7-1ba2732151dc schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:55:27 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:ec2ae787-3720-44df-b7ea-8473bdd8e2c4] details:map[status:202] domain:service message:HTTP action completed requestId:ec2ae787-3720-44df-b7ea-8473bdd8e2c4 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:55:27 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:b9aef1aa-2ceb-43d0-b970-67cb0016d6c8] details:map[status:200] domain:service message:HTTP action completed requestId:b9aef1aa-2ceb-43d0-b970-67cb0016d6c8 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:55:27 WARN editable preview scene mismatch prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:3108acbd-9b4f-4738-944c-8c3d4dd24570] details:map[status:409] domain:service message:editable preview scene mismatch requestId:3108acbd-9b4f-4738-944c-8c3d4dd24570 schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 16:55:27 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:556fe8b0-7d0e-4499-b190-9e5d51e3afb1] details:map[status:409] domain:service message:editable preview sequence conflict requestId:556fe8b0-7d0e-4499-b190-9e5d51e3afb1 schemaVersion:1 severity:warning source:orion.http]" +2026/10/12 16:55:27 INFO HTTP action completed prism="map[code:ACTION_SUCCEEDED context:map[requestId:122a1d67-afab-4924-b0e1-a933b5ca21c5] details:map[status:200] domain:service message:HTTP action completed requestId:122a1d67-afab-4924-b0e1-a933b5ca21c5 schemaVersion:1 severity:info source:orion.http]" +2026/10/12 16:55:27 WARN editable preview sequence conflict prism="map[code:EDITABLE_PREVIEW_CONFLICT context:map[requestId:9490272e-d437-4b92-8ae0-cc9cd2e41289] details:map[status:409] domain:service message:editable preview sequence conflict requestId:9490272e-d437-4b92-8ae0-cc9cd2e41289 schemaVersion:1 severity:warning source:orion.http]" + lane_commit_native_test.go:264: {"active_author_readback":true,"documents_identical_at_both_commits":true,"first_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-1","take_command_id":"take-1","intent_id":"intent-1","frame_id":12,"pts_ns":1234,"server_seq":4,"previous_role_map":{"on_air":"A","preview":"B"},"role_map":{"on_air":"B","preview":"A"},"previous_revisions":{"program":0,"preview":1,"role_map":0},"revisions":{"program":1,"preview":1,"role_map":1},"scene_id":"scene-b","scene_version":"source-v1","status":"committed","targets":{"preview":"solar/lane-a","program":"solar/lane-b"},"sources":{"preview":{"scene_id":"scene-a","scene_version":"source-v1","artifact_set":"artifact-a"},"program":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"}}},"mixed_receipt":{"schema":"orion.lane-commit.v1","runtime_instance_id":"private-native","prepare_command_id":"prepare-2","take_command_id":"take-2","intent_id":"intent-2","frame_id":13,"pts_ns":1235,"server_seq":8,"previous_role_map":{"on_air":"B","preview":"A"},"role_map":{"on_air":"A","preview":"B"},"previous_revisions":{"program":1,"preview":2,"role_map":1},"revisions":{"program":2,"preview":2,"role_map":2},"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","status":"committed","targets":{"preview":"solar/lane-b","program":"solar/lane-a"},"sources":{"preview":{"scene_id":"scene-b","scene_version":"source-v1","artifact_set":"artifact-b"},"program":{"scene_id":"scene-c","scene_version":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef","artifact_set":"sha256:425d3ed68fa088423dce4465cfa77b8c7bc4b4e13b618a851b902039889decef"}}},"preview_unchanged":true,"program_delta_isolated":true,"program_hot_edit_native":true,"program_structural_edit_native":true,"solar_feedback_or_sideband_required":false,"stale_writers_refused":true,"static_program_old_blue_stopped":true} + lane_commit_native_test.go:265: private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed +--- PASS: TestLaneCommitNative (0.81s) +=== RUN TestSceneControlFailedSelectionDoesNotLoopNative + scene_control_failure_native_test.go:91: NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt +--- PASS: TestSceneControlFailedSelectionDoesNotLoopNative (0.62s) +PASS +ok github.com/ZabLaboratory/Orion/internal/api 3.119s diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-published-all.log b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-published-all.log new file mode 100644 index 00000000..a0eab4ce --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-published-all.log @@ -0,0 +1,26 @@ +? github.com/ZabLaboratory/Orion/cmd/healthcheck [no test files] +ok github.com/ZabLaboratory/Orion/cmd/orion (cached) +ok github.com/ZabLaboratory/Orion/internal/adapters (cached) +ok github.com/ZabLaboratory/Orion/internal/api 2.462s +ok github.com/ZabLaboratory/Orion/internal/attestation (cached) +ok github.com/ZabLaboratory/Orion/internal/auth (cached) +ok github.com/ZabLaboratory/Orion/internal/bluehost (cached) +ok github.com/ZabLaboratory/Orion/internal/blueproject (cached) +ok github.com/ZabLaboratory/Orion/internal/bluespike (cached) +ok github.com/ZabLaboratory/Orion/internal/bluewire (cached) +? github.com/ZabLaboratory/Orion/internal/buildinfo [no test files] +? github.com/ZabLaboratory/Orion/internal/canonical [no test files] +ok github.com/ZabLaboratory/Orion/internal/compiler (cached) +ok github.com/ZabLaboratory/Orion/internal/config (cached) +ok github.com/ZabLaboratory/Orion/internal/conformance (cached) +ok github.com/ZabLaboratory/Orion/internal/effects (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdp (cached) +ok github.com/ZabLaboratory/Orion/internal/lsdpreception (cached) +ok github.com/ZabLaboratory/Orion/internal/obs (cached) +ok github.com/ZabLaboratory/Orion/internal/protocol (cached) +ok github.com/ZabLaboratory/Orion/internal/providers (cached) +ok github.com/ZabLaboratory/Orion/internal/runtime (cached) +ok github.com/ZabLaboratory/Orion/internal/streamcontrol (cached) +ok github.com/ZabLaboratory/Orion/internal/workload (cached) +ok github.com/ZabLaboratory/Orion/internal/ws (cached) +? github.com/ZabLaboratory/Orion/third_party/lsdpnative [no test files] diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-vet.log b/evidence/local-20261012-program-release/eleven/20261012T145918Z-program-release-vet.log new file mode 100644 index 00000000..e69de29b diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-provenance.json b/evidence/local-20261012-program-release/eleven/20261012T145918Z-provenance.json new file mode 100644 index 00000000..39a64111 --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-provenance.json @@ -0,0 +1,122 @@ +{ + "worktree": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing", + "branch": "eleven/local-20261012-lane-role-routing", + "base": "f30707b9f979f127f940915d6669a4c0f8d08668", + "source_commit": "6d38b2aa2bd19d4f76c291ad991f7db826e89cb1", + "source_files": [ + { + "path": "cmd/orion/main.go", + "sha256": "8db0ab5e45a51350db3a06f3f847edf6e493742495c28e669f501d77909f903c" + }, + { + "path": "docs/development/scene-control.md", + "sha256": "215f2bb4abb3b1e6feb7717de7295f792535dcd1bdb7b9cd0dda2fcc284b18e3" + }, + { + "path": "docs/development/scene-feature-map.md", + "sha256": "c850076c2d440812c53b16b23092d4c2226ccb55e9ce5712c29278d01bf8d11a" + }, + { + "path": "internal/api/README.md", + "sha256": "c9694a57dda267fe3d41b4207255b276cdfd922c1bd8c132d4b62f838d4c22fe" + }, + { + "path": "internal/api/program_admission_fence_test.go", + "sha256": "afa82b0301dd07369855b4cc2598a1ffcedee9858bed91b45e2c933ffb686844" + }, + { + "path": "internal/api/program_identity.go", + "sha256": "064bad26fe6d216ffbd581fd54dd9dd9a47ca554f528e18994a8a63caefb1931" + }, + { + "path": "internal/api/program_release.go", + "sha256": "36cffc129c633612d4aaf6e10a1bdacbe5a54a3218594b47b780d6d1fe532a4c" + }, + { + "path": "internal/api/program_release_native_test.go", + "sha256": "c9591731a432e08a64e71521cb0f737f2aac539dc242b8c3629a2a3fb75428f1" + }, + { + "path": "internal/api/scene_control.go", + "sha256": "938cc4a9b946b990ef9c6e39653c34f59d0a86222778881cf8646cc6fb2838bb" + }, + { + "path": "internal/api/scene_intent.go", + "sha256": "a87b475a507200d0fdcde2ee9c51d215f19546f25404d2899864e40009ac67b7" + }, + { + "path": "internal/bluehost/README.md", + "sha256": "829c4ed08875d542fe091cb1277b8c67eeccc966bd92f3f2333a0e1ab542a443" + }, + { + "path": "internal/bluehost/authority.go", + "sha256": "2a5246209af07652ee356adbbb9a0bb3032af45ffc0b21fcb7e9fdb0787329e4" + }, + { + "path": "internal/bluehost/host.go", + "sha256": "b3753db37829824c97a0c490eafc4bd623cc4c15e52accefdf4a0b272dcb1709" + }, + { + "path": "internal/bluehost/program_release_test.go", + "sha256": "9d02dd123e38342e947f6410b4410ed16c4f67909be77b837db02b54a09d1891" + }, + { + "path": "internal/bluehost/scene_commit.go", + "sha256": "04710c2c9afa3ff54b489f2dbe666091ce2a236e962e097d1b7ef8249ddad0f6" + }, + { + "path": "internal/lsdpreception/README.md", + "sha256": "b4754ad57e3904279bc9b527fef68fea1d0258f75a573cf0655e6ecfe4513c97" + }, + { + "path": "internal/lsdpreception/control.go", + "sha256": "9e76e39c8bef7fcba76d11b451c9591f7e87dd82800a3800dc1173d835f73fa3" + }, + { + "path": "internal/lsdpreception/mirror.go", + "sha256": "92758d08fe96837bb7ebf25df51db75e66233a8fb1c25cd8c1442ee93f013f2d" + }, + { + "path": "internal/lsdpreception/program_identity.go", + "sha256": "8eb8ddb1b5aeef94a193f7d9bdadb121081be9584102ff3d737c4b7e3e542da3" + }, + { + "path": "internal/lsdpreception/program_release.go", + "sha256": "53f13979c2255fd92bb869c77811d4019a8f15a6cfbe94bdcfb62da567d86652" + }, + { + "path": "internal/lsdpreception/program_release_test.go", + "sha256": "55bf2a459094cb3b0c233f139ab573b89a6aa762f17eb99f7e93e02af0a32ffa" + }, + { + "path": "internal/runtime/program_release.go", + "sha256": "caf7873675507d3e17aa9c4a572afd219c7f00666cf4124af8ed149562ce4a2c" + }, + { + "path": "go.mod", + "sha256": "a6ab8c922941c2b952f3e83b96f1a88fb7757145a93435886cb7c252d61e074a" + }, + { + "path": "go.sum", + "sha256": "476e5d6e8d8f4c6674dc53f288615445f12ab175430d4bc159870ed89ae2d45d" + } + ], + "binary": "D:\\Documents\\Zab\\Orion\\.worktrees\\eleven-local-20261012-lane-role-routing\\.cache\\orion-program-release-packaged.exe", + "binary_sha256": "93ed5f1a14f5aba16aba1ce8bff75fea88d69daabae61ebd9ef72f7e77c07c99", + "blue_module": "v0.1.1-0.20261012083435-ff8b1dde0bad", + "blue_revision": "ff8b1dde0bad4f53e876651a0e0748cca3e9f622", + "blue_manifest": "sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41", + "buildvcs": false, + "vcs_note": "Go stamped the canonical checkout HEAD; automatic VCS stamping disabled. This manifest records the actual signed worktree source commit and file hashes.", + "validation": { + "private_packaged_descriptor": "pass", + "go_vet_all": "pass", + "go_test_all": "pass", + "private_native_lane_commit_regression": "pass", + "graceful_private_exit": 0, + "private_native_release": "pass", + "private_native_blue_release": "pass" + }, + "common_runtime_touched": false, + "common_integration_owner": "Main 1" +} diff --git a/evidence/local-20261012-program-release/eleven/20261012T145918Z-report.md b/evidence/local-20261012-program-release/eleven/20261012T145918Z-report.md new file mode 100644 index 00000000..bd5ccddf --- /dev/null +++ b/evidence/local-20261012-program-release/eleven/20261012T145918Z-report.md @@ -0,0 +1,42 @@ +# Orion — libération native du Program après arrêt des sorties + +Worktree : `D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing`. Branche : `eleven/local-20261012-lane-role-routing`. Base de cet incrément : `f30707b9f979f127f940915d6669a4c0f8d08668`. Implémentation signée : `6d38b2aa2bd19d4f76c291ad991f7db826e89cb1`. + +Mandat coordonné avec Main 1 : fournir dans Orion le contrôle LSDP permettant de libérer le Program réel après arrêt confirmé des sorties, tout en conservant le Preview et les deux moteurs physiques. Main 1 reste propriétaire de Prism, de l'intégration et de la relance commune. Ce worktree de continuation est conservé pour cette intégration ; aucun checkout étranger n'a été modifié. + +## Comportement et contrat + +Le propriétaire desktop confirme l'arrêt des sorties. Il lit une fois l'identité Program via `/scene_control/defaults/inspect_program`, puis publie `/scene_control/defaults/release_program` dans la ressource native `orion/state`. Aucun transport ni endpoint HTTP supplémentaire. Voir `docs/development/scene-control.md` pour les schémas et exemples complets. + +Orion contrôle runtime, dernier Take, rôles physiques, epochs Program/role-map, scène, adresse source, artifact-set et writer/edit-seq. Une révision Preview plus récente que le dernier Take est admise. Un writer intervenant entre inspection et libération impose une nouvelle inspection. + +La lease Program et la clôture de publication protègent le retrait : annulation/jonction du travail Program en cours, suspension des admissions, arrêt bridge/auteur/instance SDK, retrait des miroirs Program, Drop via le mécanisme natif partagé et attente de son ACK. La réconciliation conditionnelle retire uniquement desired.program et invalide observed.program en préservant les sélections Preview concurrentes. `released` est publié après ACK et persistance ; une observation `pending` peut précéder cette confirmation. Les échecs restent explicites, avec `retired:true` si l'autorité a déjà été retirée. + +Les requêtes/ACK ont un echo exact et une identité de commande. `attempt` permet une redélivrance explicite de la même commande après un ACK absent. Le replay historique ne retire jamais le nouveau Program d'un Take ultérieur. La rétention des reçus est bornée à 64. Le prochain Take conserve le Preview existant, sa scène et son writer, sans recharger le document. Les admissions Program sont rouvertes au transfert de rôle confirmé, y compris pour une scène éditable à admission statique. + +## Validation + +- `go test ./...` : succès avec le module Blue publié, sans remplacement local. +- `go vet ./...` : succès. +- Récepteur Rust privé, `TestProgramReleaseNative` : premier Take avec Program vide, inspection réelle via LSDP, édition Program réelle via API, refus runtime/epoch/identité/writer périmés, annulation du travail Program sans annuler Preview, Drop/ACK réel, Preview et epoch de compilation inchangés, publication tardive refusée, restart sans reload, ancien replay sans mutation du nouveau Program. +- Récepteur Rust privé, `TestProgramReleaseBlueNative` : admission/exécution réelle SDK Blue, libération de l'instance, document Program null et Step suivant refusé. +- Régression native `TestLaneCommitNative` : échange physique, éditions Program isolées, documents conservés, API de source et instance Blue vers editable toujours validés. +- Régression native `TestSceneControlFailedSelectionDoesNotLoopNative` : pas de boucle de réadmission créée par les observations. +- Probe du nouveau binaire : `/api/v1/runtime/descriptor` retourne le digest/révision SDK attendus ; arrêt gracieux du processus privé avec exit 0. +- `git diff --check` : succès. Les logs et les harnesses privés accompagnent ce rapport. + +## Artefact d'intégration + +`D:/Documents/Zab/Orion/.worktrees/eleven-local-20261012-lane-role-routing/.cache/orion-program-release-packaged.exe` + +SHA256 : `93ed5f1a14f5aba16aba1ce8bff75fea88d69daabae61ebd9ef72f7e77c07c99`. + +Module Blue : `v0.1.1-0.20261012083435-ff8b1dde0bad`. Descriptor source revision : `ff8b1dde0bad4f53e876651a0e0748cca3e9f622`. Descriptor source digest : `sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41`. + +Build : `go build -trimpath -buildvcs=false -ldflags "-s -w -X github.com/ZabLaboratory/Orion/internal/buildinfo.BlueRuntimeSourceDigest=sha256:d377fa500620d9f9e1e4c725f97414a24e28dfff3fcda3b0f701fd5d89b25c41 -X github.com/ZabLaboratory/Orion/internal/buildinfo.BlueRuntimeSourceRevision=ff8b1dde0bad4f53e876651a0e0748cca3e9f622" -o .cache/orion-program-release-packaged.exe ./cmd/orion`. + +Le build initial sans injection annonçait volontairement `unknown` dans le descriptor : le probe l'a refusé. L'artefact livré applique l'injection du script standard Prism. Le stamping VCS automatique Go annonçait à tort le HEAD du checkout canonique Orion ; il est désactivé dans ce build. Le manifeste adjacent enregistre le vrai commit du worktree et les hashes des fichiers source. + +## Limites et suite + +La confirmation d'arrêt est attestée par Prism ; Orion ne lit pas indépendamment l'état des sorties Pulsar. Les preuves privées démontrent réception et cycle natifs, pas un arrêt de diffusion RTMP dans Prism ni la fluidité Chromium. Le détecteur de courses Go n'a pas été exécuté : CGO désactivé. L'intégration commune, la preuve stop/start Prism et les mesures de rendu restent à Main 1. Aucune relance ou copie dans le dev commun effectuée par cette unité ; aucun micro, caméra, calibration ou configuration utilisateur modifié. diff --git a/evidence/local-20261018-prism-release-orion/eleven/20261018T192222Z-release-candidate.md b/evidence/local-20261018-prism-release-orion/eleven/20261018T192222Z-release-candidate.md new file mode 100644 index 00000000..5eda38ea --- /dev/null +++ b/evidence/local-20261018-prism-release-orion/eleven/20261018T192222Z-release-candidate.md @@ -0,0 +1,8 @@ +# Orion candidate and toolchain gate + +- Candidate source: `29afefa038487dd45e9f7ec03b1ade591ce54532`, the clean worktree configured for Prism development. This source contains the #463 lineage and subsequent native reconnect fixes. +- `go test ./...`: passed locally on Windows with Go 1.26.4. This tests code behavior but does not validate the release toolchain. +- The earlier #463 `govulncheck` job used Go 1.26.6 and reported reachable standard-library vulnerabilities fixed in Go 1.26.9. The CI and release workflows now pin Go 1.26.9; [Go's release history](https://go.dev/doc/devel/release#go1.26.9) dates the patch to 2026-10-08. +- Both workflow YAML files parsed, and `git diff --check` passed. + +The updated CI, packaged sidecar provenance, and Prism clean-profile Studio startup remain release gates. No published Orion binary is claimed by this record. diff --git a/evidence/local-20261018-prism-release-orion/eleven/20261018T195300Z-lumencast-go-vendor-provenance.json b/evidence/local-20261018-prism-release-orion/eleven/20261018T195300Z-lumencast-go-vendor-provenance.json new file mode 100644 index 00000000..9924c01c --- /dev/null +++ b/evidence/local-20261018-prism-release-orion/eleven/20261018T195300Z-lumencast-go-vendor-provenance.json @@ -0,0 +1,14 @@ +{ + "source": "Lumencast/lumencast-go", + "revision": "0c7cfc65c694ce4ab943eb4e7711fd226c671180", + "packages": [ + "lsml", + "protocol", + "server" + ], + "file_count": 45, + "source_bytes": 248915, + "aggregate_sha256": "43be509fc3efaab1e68047bf8cb72ffd39797d30db1790bca597554f0085ef44", + "comparison": "Every vendored file equals the source commit checkout byte-for-byte.", + "orion_validation": "go mod tidy and go test ./... passed locally." +} diff --git a/go.mod b/go.mod index f379f2fa..577fcb2f 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.26.2 require ( github.com/Lumencast/lumencast-go v0.3.2-0.20260816093300-0c7cfc65c694 - github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20260928141015-4cad89dba613 + github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20261012083435-ff8b1dde0bad github.com/coder/websocket v1.8.14 github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.9.2 @@ -28,3 +28,5 @@ require ( golang.org/x/sys v0.35.0 // indirect google.golang.org/protobuf v1.36.8 // indirect ) + +replace github.com/Lumencast/lumencast-go => ./third_party/lumencast-go diff --git a/go.sum b/go.sum index 721f6c2d..716a3804 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ -github.com/Lumencast/lumencast-go v0.3.2-0.20260816093300-0c7cfc65c694 h1:2y14teoPqAKlg8YsBPrYmkHQl6DNbY9MDhO9+QyIY34= -github.com/Lumencast/lumencast-go v0.3.2-0.20260816093300-0c7cfc65c694/go.mod h1:S99/WPDLew+UDUW9tHsoaGdMMDCdtf4dF/HJbxn8rAE= -github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20260928141015-4cad89dba613 h1:e4/+hAt/BtjcEpICnc3LRS5soBwpUIOCU9EsaZsvMro= -github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20260928141015-4cad89dba613/go.mod h1:IFCHQr+8V5XV/Z8qFyNtvvSSTnAHFUTX1AMkyOVWnK8= +github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20261012083435-ff8b1dde0bad h1:OI43JUxSQrGAm2eCn0WYc+z8/1zb64MD0epIsTiwTDc= +github.com/ZabLaboratory/Blue/runtime/go v0.1.1-0.20261012083435-ff8b1dde0bad/go.mod h1:IFCHQr+8V5XV/Z8qFyNtvvSSTnAHFUTX1AMkyOVWnK8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= diff --git a/internal/api/README.md b/internal/api/README.md new file mode 100644 index 00000000..f280730a --- /dev/null +++ b/internal/api/README.md @@ -0,0 +1,204 @@ +# Orion scene execution and selection + +Canvas owns scene/Blue functional validation. This domain checks signed artifact +identity/integrity, exposes operator controls, and +coordinates the two Blue slots with the two physical Solar resources. Startup +wiring is in `cmd/orion/scene_control.go`; the feature map is in +`docs/development/scene-feature-map.md`. + +`scene_intent.go` preserves principal/owner/tenant/stream/action checks, program +digests and per-lane admission leases. `scene_intent_source.go` verifies source, +program, optional compatibility-render bytes and optional Canvas Blue manifest. +No compiler runs at scene selection. Manifest transport integrity does not grant +execution authority; signed programs and refs are checked separately. + +`scene_catalog.go` owns private immutable admitted capsules. Preparation through +`POST /api/v1/runtime/scene-catalog` does not run Blue or change the displayed +scene. Entries are keyed by principal, scene, version, stream and action; their +limit is 64 entries/64 MiB with the existing 1 MiB capsule limit. References from +the old external artifact cache are normalized to admitted bytes; that cache is +never written. A present Blue manifest is verified and retained, including its +declarations and closure. Older capsules without it keep signed executable +authority but cannot claim a complete authoring closure. +Manifest identity matches the source LSML address and signed revision_id, not +the artifact-set digest. Source-less compatibility envelopes retain their old +identity contract. `scene_intent_source_test.go` checks distinct identities and +refuses mismatched source/revision even with a correct manifest transport digest. + +`scene_control.go` watches `/scene_control` in native `orion/state`. Only a +changed desired selection starts an activation; failed admissions wait for a +changed desired identity instead of retrying on their own observations. Observed updates/reconnects do +not replay on-start. Each lane cancels and joins its predecessor before replacing +it. Only desired selection is saved to Orion's owned `selection.lsml`; live +mutated scene documents and runtime observations stay in RAM. On startup, absent +native control is seeded from that file, and every cached ref/program is +reverified. Expired refs remain a visible failure until newly admitted capsules +are supplied. + +`scene_presentation.go` stages a fresh Blue instance without stepping it, pauses +the exact old bridge and freezes its scene projection. `native_scene_presentation.go` +prepares/commits/finalizes the selected Solar and waits for a renderer response +in `orion/state`. A native route receipt alone is insufficient. New on-start and +ticks are gated until acceptance. Cancellation/failure before finalization +restores the actual old host/bridge/mirror; compensation errors are explicit. +Global stream rules belong to `internal/streamcontrol` and remain independent. + +Prepare carries the accepted LSML root and candidate source. Commit/finalize +carry the candidate once at the root with only request/phase metadata; a fresh +Solar can reconstruct that stage without duplicating the full source. Cleanup +still follows the renderer's matching active receipt before opening the Blue gate. +Each phase watches accepted native feedback before publishing, eliminating the +50 ms polling interval. Reception verifies/reconnects that bounded subscription; +the phase still has its 15 second deadline and reasserts the same absolute source +each second after interruption. Request, lane, phase and scene/version checks +remain mandatory, and cleanup cancels and joins the watcher. +Optional request-local timing callbacks distinguish Blue preparation, Solar +read/replace/wait/cleanup and bridge flush. HTTP `Server-Timing` contains numeric +durations only; no source, effect payload, credential or authorization changes. + +Tests cover admission and identity, catalog isolation/corruption/expired refs, +desired-only persistence, staged replacement and compensation. Opt-in +`TestRealNativeSceneControlVisual` requires real Rust, two CEF Solar renderers, +the complete existing scene and authenticated read-query gateway; it also checks +every discovered command on both lanes, failed-source compensation, receiver +recovery and fresh Orion hosts. No business-output oracle runs in Orion. +See `docs/development/scene-control.md` for the wire contract. +Solar's `scripts/prove-cold-start-cef.py` additionally runs the actual Orion +executable across a full process stop/restart from owned caches, with two CEF +Solar renderers and the actual Rust receiver. Its test signatures and cache +manifest are explicit fixtures by default. Its `--capsule` mode instead consumes +the HTTP/SQL admission and signatures produced by an actual local Canvas using +the real gateway identity and published Blue. No admission verdict is seeded. +Remote Canvas deployment and mTLS workload retrieval remain separate boundaries. +See [current maturity](../../docs/development/maturity.md). + +`operator_execution.go` reports the portable runtime dispatch for arbitrary calls +and resolved awaits, including global rules. The existing fired/resolved status +is preserved; the additive execution receipt carries runtime status and emitted +invocation IDs/capability/operation, without request or result payloads. These IDs +join the adapter completion diagnostics. It never declares the whole Blue finished while asynchronous +effects can still run. Public runtime failures retain code, stage, message and +target; scene replacement returns SCENE_CHANGING. No business outputs are sampled +in operator logs. Effect adapters log their completion and execution error. + +`operator_execution_test.go` discovers all commands and armed awaits in arbitrary +transport fixtures on Program, Preview and stream rules, exercises each through +the registered HTTP router and checks runtime receipts/errors. This is a routing +regression test, not validation of authored Blue functionality. The real CEF +proof discovers the published scene's full command list. An unsupported test +payload widget fails coverage explicitly. + +The historical `/validate/program` endpoint is retained because Canvas consumes +its execution diagnostics: isolated, bounded runtime load/start/step, without +external effects. Its `servable` field is the existing compatibility contract; +Canvas owns the scene validation decision. Scene activation never calls this +probe, simulates a Blue, or checks expected business outputs. + +Local editable Preview accepts `render_mode: source-only`: LSML identity and +canonical content address are verified before installing the isolated clone, with +no static tree lowering. The accepted document carries `x-solar-authoring` with +format `solar.authoring/1`, the immutable `lsml_bundle` base, embedded non-font assets and font digest references. +These travel atomically on the same native LSDP scene resource for Preview and +promoted generations. Live default edits remain LSDP mutations. The former HTTP +source GET is unregistered; Solar does not fetch editable sources from Orion. +This delivery does not grant Blue execution or publish a Canvas revision. Empty render mode +retains compatibility compilation; unknown modes fail closed. + +Editable authoring accepts `target: preview|program` on POST, PUT and editor +WebSocket packets; omission preserves the Preview contract. The two actors stay +on the physical native resources transferred by Take. Program requires the +active `scene_id` and `writer_id`; a structural POST also requires +`base_edit_seq` and a non-decreasing `edit_seq`. Its replacement rotates the +writer ID. A Take preserves writer ID and sequence. Compiled snapshots are fenced +against concurrent edits and physical role changes before Host or mirror mutation. +`GET /api/v1/show/editable-preview/state?scene_id=...&target=...` returns only the +active editable identity, version, edit sequence, writer ID and live `defaults`, +with `no-store`. The read pins its lane and drains accepted actor inputs so values +and author sequence remain coherent; it publishes no mutation or snapshot. +It never activates, compiles or retrieves an inactive actor. Embedded/operator +guards remain mandatory. Service socket packets may explicitly bind the same +target/scene/writer; omitted fields retain the warm Preview component contract. +The compatibility `/air` generation actor is not a physical Program author; +only the native Take or replacement on the active Program establishes that role. + +`editable_targets.go` owns target validation, active read-back and delivery; +`runtime/editable_targets.go` owns actor selection and structural fencing under +the role pin. Hot edits reuse the existing scene inbox, mirror and receiver +application ACK. Solar feedback and optional socket observers are not required. +Observers are scoped to their requested target. Tests in `editable_targets_test.go` +cover a socket retained across Take, stale writers and concurrent compilation. +`lane_commit_native_test.go` verifies active read-back, hot and structural Program +edits, unchanged Preview and stale snapshot refusal on a private Rust receiver. + +## Native lane authority handoff + +`lane_commit.go` consumes `/scene_control/defaults/lane_commit` on `orion/state`. +The parent is the boot-seeded `orion.scene-control.v1` document. Payload fields +are schema=`orion.lane-commit.v1`, runtime_instance_id, prepare_command_id, +take_command_id, intent_id, frame_id, pts_ns, server_seq, previous_role_map, +role_map, previous_revisions, revisions, scene_id and scene_version. Role maps +use `{on_air:A|B,preview:A|B}`; revisions use `{program,preview,role_map}`. +Both previous fields come directly from native TakeCommitted, after Prepare. +scene_version is the accepted source LSML version, distinct from artifact-set. + +The response `/scene_control/defaults/observed/lane_commit` repeats the payload +with status=`committed|refused`, optional reason, physical targets and actual +sources `{scene_id,scene_version,artifact_set}`. Exact replay also reports +`replayed:true` without changing authority. Main checks exact correlation before +opening another preparation. Observe fields are applied atomically with logical +desired/current reconciliation from the actual mirrors, never a new scene intent. +Unknown runtime, stale/conflicting commit, busy preparation, mismatched Preview +or a refused Blue authority transfer cannot silently succeed. + +Admission leases cover the two Host slots; bridge loops are cancelled/joined, +the existing Blue actors re-admitted in their new modes, and their same bridges +retargeted without Load/Start/Step/on-start. Editable Preview occupies a static +Host slot and supplies its native mirror to stream-level LSML effects, stopping +any older Preview Blue actor. Operator and platform-event execution/projection +share the slot lease so a result cannot cross a simultaneous role transfer. +Scene control serializes selection and role commit; a busy selection refuses the +commit. `NativeScenePresenter` fixes the physical target per admission and marks +all phase wrappers with their logical lane for Solar acknowledgments. + +## Program lifetime after confirmed output stop + +`program_identity.go` handles the one-shot LSDP `inspect_program` request under +the Program lease. It returns the active physical source and editable writer/seq +after draining accepted inputs; no per-edit identity publisher is introduced. +`program_release.go` consumes `release_program` on the same control resource, +fences runtime/take/Program-role revisions/source/artifact/writer identity, +cancels and joins pending Program selection, then freezes its mirror, detaches +the author, stops the bridge/Host and drops the physical document. Preview and +its compilation epoch remain untouched; the two Solar engines keep their identity. + +`released` follows native application ACK, removal of only desired/current Program +and owned selection persistence. State-dependent control writes rebase through +`WriteLeavesFromState`, preserving concurrent Preview selections. Failed cleanup +is visible, with `retired` distinguishing actual retirement from refusal. Exact +replay never retires a subsequent actor; an increased delivery `attempt` permits +retrying a pending native ACK without publishing another Drop. Only the next +confirmed physical Take enables Program admission again. Work started before +release or role transfer is fenced before Host publication. + +The desktop owner confirms output shutdown via `output_state: stopped` and +`stop_command_id`; Orion does not independently query Pulsar output state. +Wire envelopes and status fields are specified in +[scene-control](../../docs/development/scene-control.md). No HTTP route added. +Tests: `program_release_native_test.go` (private Rust receiver), +`program_admission_fence_test.go`, `lsdpreception/program_release_test.go` and +`bluehost/program_release_test.go`. Native proof does not certify CEF presentation. + +`editable_idle_native_test.go` measures editor WS admission, author publication, +native barrier and return ACK separately after explicit idle periods. Its opt-in +private receiver can load an existing native authoring snapshot with assets; +it verifies the actual accepted leaf without printing its document or credentials. +The recovery contract and probe variables belong to +[native recovery](../../docs/runbooks/native-recovery.md). Timings are observations, +not wall-clock regression assertions; deterministic recovery tests check retry, +identity and backoff behavior. + +Unit tests live beside these handlers; the opt-in native test requires +ORION_TEST_PRIVATE_LANE_ADDRESS from an isolated synthetic receiver. It must +never target the shared Prism runtime. This path covers native signed Blue and +editable scenes; compatibility Engine A and standalone rule actors retain their +own execution contracts. diff --git a/internal/api/camera_slots.go b/internal/api/camera_slots.go index 8f488e06..d7b93371 100644 --- a/internal/api/camera_slots.go +++ b/internal/api/camera_slots.go @@ -67,7 +67,7 @@ func optionalReleaseRouteUnavailable(err error) bool { // operator-gated and bounded: the payload contains no room token, URL, or // scene data, only the current logical slots plus explicit stale refs resolved // by Prism. Program/Pulsar are not involved in this path. -func postCameraSlots(assigner CameraSlotAssigner) http.HandlerFunc { +func postCameraSlots(assigner CameraSlotAssigner, flush ...func(context.Context) error) http.HandlerFunc { return requireOperator(func(w http.ResponseWriter, r *http.Request) { if assigner == nil { writeJSON(w, http.StatusServiceUnavailable, map[string]string{ @@ -220,6 +220,12 @@ func postCameraSlots(assigner CameraSlotAssigner) http.HandlerFunc { return } } + if len(flush) > 0 { + if err := flushNativeDelivery(r.Context(), PublicDeps{NativeLSDPFlush: flush[0]}, false); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"status": "unavailable", "reason": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } + } writeJSON(w, http.StatusOK, cameraSlotProjectionResponse{ Status: "projected", StreamID: "live", diff --git a/internal/api/cockpit.go b/internal/api/cockpit.go index f2b0e6e6..f01ea92e 100644 --- a/internal/api/cockpit.go +++ b/internal/api/cockpit.go @@ -32,22 +32,15 @@ import ( // frozen contract) but Orion has no multi-stream partition — the current show // IS the stream. An absent stream_id is a 400; any value resolves to the show. // -// ENGINE B ANTENNA (ORION-OPERATOR-RAIL-ENGINE-B, #335): the antenna's -// scene-scope facet now derives from bluehost.Host's on-air instance -// (appendEngineBScene), not Show.Active() — Show's roster is structurally -// empty in production since #331. ?target=preview is unchanged (still -// Engine A, operatorTarget). The antenna's awaits facet now joins -// blueruntime's live armed-await registry (Host.PendingAwaitNames, #344) -// against bluehost's declared metadata (AwaitDecl) — see appendEngineBScene's -// doc for the join and its one accepted gap (an armed await absent from the -// declared set — never producible via the compiler on a single program, see -// that doc — is omitted, not fabricated). +// ENGINE B: both scene facets derive from the Host's independent slots, +// exactly like call/resolve/pending. Canonical LSML supplies operator inputs; +// the Blue program supplies triggers and metadata joined with live awaits. +// Legacy Preview is consulted only when no native Host is configured. // // UNKNOWN TARGET (Prism#740, ORION-UNKNOWN-TARGET-CONTRACT): ?target= is now // validated by operator.go's resolveTargetKind before either branch below // runs — an unrecognized value is 400 UNKNOWN_TARGET, not a silent fall -// through to the antenna branch. See getCockpitContracts's inline comment -// for why the preview leg stays on Engine A regardless. +// through to the antenna branch. // cockpitContractItem is a facet item wrapped with its scope. Because Go // has no generics-in-JSON-shape ergonomics here, each facet has its own typed @@ -117,31 +110,17 @@ func getCockpitContracts(deps PublicDeps) http.HandlerFunc { Awaits: []cockpitAwait{}, } - // Scene-scope contract → the operator surface the rail drives. Mode-aware - // (preview/antenne split), validated by the same single point every - // ?target=-reading route shares (resolveTargetKind, operator.go — - // Prism#740, ORION-UNKNOWN-TARGET-CONTRACT): an unrecognized value is now - // 400 UNKNOWN_TARGET rather than silently falling open to the antenna. - // ``target=preview`` derives it from the PREVIEW slot's live clone - // (Engine A, unchanged — operatorTarget); ``target`` absent derives from - // the ANTENNA's Engine B on-air instance (ORION-OPERATOR-RAIL-ENGINE-B, - // #335) — Show.Active() has had no production populator since #331 and is - // structurally empty. Vanishes on a flip/take of whichever side it reads. - // - // The preview leg here is STILL Engine A (deps.Preview), unlike - // call/resolve/pending's engineBSlot — deliberately not re-routed by this - // work unit (its only populator, POST /show/preview-active-scene, was - // retired the same way Show's was, so this leg is dead in production - // today; re-pointing it at Engine B's SlotPreview is a real fix but a - // different, undecided chantier, not a side effect of hardening the - // unknown-target reject). + // Use the same target validation and Blue slots as operator gestures. + // Empty native Preview stays empty; legacy fallback requires no Host. kind, ok := resolveTargetKind(w, r) if !ok { return } switch kind { case targetPreview: - if active := operatorTarget(deps, r); active != nil { + if host := engineBHost(deps); host != nil { + appendEngineBScene(&out, host, bluehost.SlotPreview, deps.Logger) + } else if active := operatorTarget(deps, r); active != nil { appendScene(&out, active, scopeScene, "") } case targetAntenna: @@ -154,7 +133,7 @@ func getCockpitContracts(deps PublicDeps) http.HandlerFunc { // appended for antenna and preview targets and survive every slot flip. if deps.StreamRules != nil && deps.StreamRules.Plane != nil { appendRulePlane(&out, deps.StreamRules.Plane, deps.Logger) - } else { + } else if deps.Show != nil { // Compatibility seam for isolated Engine A fixtures and callers that // intentionally construct PublicDeps without the production plane. for _, rule := range deps.Show.StreamRuleScenes() { @@ -255,16 +234,14 @@ func addressBlueprintKey(key string) string { return key } -// appendEngineBScene derives the antenna's Engine B contract (scope `scene`) +// appendEngineBScene derives a slot's Engine B contract (scope `scene`) // and appends it to out — the Engine B analogue of appendScene(active, ...) // for the one instance bluehost.Host hosts per slot (ORION-OPERATOR-RAIL- // ENGINE-B, #335). No-op when slot holds no instance. // -// Params come from the LSML render-bundle's `operator_inputs` field (same -// generic, best-effort decode getOperatorInputs already uses for this same -// field — ZabCanvas's lsml_bundle schema for it is NOT a confirmed-matching -// contract against Orion's own compiler shape, so a field that doesn't -// decode just stays zero-valued, never an error). +// Params come from admitted LSML operator_inputs. Compatibility bundles +// are consulted only when no canonical source interface was attached. +// Malformed declarations contribute no typed controls. // // Triggers come from the loaded program's declared on-call entrypoints // (bluehost.Host.DeclaredContracts), addressed under defaultBlueprintToken @@ -281,7 +258,11 @@ func appendEngineBScene(out *cockpitContracts, host *bluehost.Host, slot bluehos if host.Digest(slot) == "" { return } - for _, p := range bundleOperatorInputs(host.Bundle(slot)) { + var params []runtime.ContractParam + if json.Unmarshal(host.OperatorInputs(slot), ¶ms) != nil { + params = nil + } + for _, p := range params { out.Params = append(out.Params, cockpitParam{ContractParam: p, Scope: scopeScene}) } triggers, _ := host.DeclaredContracts(slot) @@ -310,21 +291,3 @@ func appendEngineBScene(out *cockpitContracts, host *bluehost.Host, slot bluehos }) } } - -// bundleOperatorInputs extracts an LSML render-bundle's `operator_inputs` -// field into the shared ContractParam shape. Best-effort, generic top-level -// key decode (mirrors getOperatorInputs, scenes_get.go) rather than a typed -// contract Orion owns end-to-end: nil/malformed bundle or an unrecognised -// field shape yields nil (never an error) rather than a broken response. -func bundleOperatorInputs(bundle []byte) []runtime.ContractParam { - if len(bundle) == 0 { - return nil - } - var envelope struct { - OperatorInputs []runtime.ContractParam `json:"operator_inputs"` - } - if json.Unmarshal(bundle, &envelope) != nil { - return nil - } - return envelope.OperatorInputs -} diff --git a/internal/api/cockpit_source_test.go b/internal/api/cockpit_source_test.go new file mode 100644 index 00000000..86d8e352 --- /dev/null +++ b/internal/api/cockpit_source_test.go @@ -0,0 +1,101 @@ +package api + +import ( + "crypto/ed25519" + "encoding/json" + "net/http" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" +) + +func TestCockpit_SourceOnlyIntentPreviewAndProgram(t *testing.T) { + pub, priv, _ := ed25519.GenerateKey(nil) + program := buildEngineBOperatorProgram(t, "league", "called", "pick", "core.primitive.integer", "picked") + source := []byte(`{"lsml":"1.1","layout":{"kind":"text"},"operator_inputs":[{"path":"league","label":"League","type":"text","enum_values":["LEC","LCK"],"writable_by":["operator"]}]}`) + envelope, digest := canvasEnvelopeWithBundle(program, source) + deps, observed := noblueDeps(t, pub, envelope) + t.Cleanup(func() { + deps.Bridges.StopAll() + _ = deps.Host.Release(bluehost.SlotPreview, "test") + _ = deps.Host.Release(bluehost.SlotOnAir, "test") + }) + ref := signedRef(t, priv, "canvas-key-1", attestation.ActionPreparePreview, time.Now(), "scene-1", digest) + mux := http.NewServeMux() + // Use the real scene-intent path and public contract routes, without a + // compatibility bundle or compilation at any point. + RegisterPublic(mux, PublicDeps{Logger: testLogger(), SceneIntent: &deps}) + // Avoid the legacy-rule compatibility lookup on this isolated fixture. + f := &cockpitFixture{mux: mux} + for _, target := range []struct { + action attestation.Action + name, query string + slot bluehost.Slot + }{ + {attestation.ActionPreparePreview, "preview", "&target=preview", bluehost.SlotPreview}, + {attestation.ActionTakeOnAir, "on-air", "", bluehost.SlotOnAir}, + } { + if rec := sendIntent(t, deps, ref, target.action, target.name, "source-"+target.name); rec.Code != http.StatusOK { + t.Fatalf("intent: %d %s", rec.Code, rec.Body.String()) + } + // The initial Blue step is asynchronous behind the source snapshot. + deadline := time.Now().Add(3 * time.Second) + for len(deps.Host.PendingAwaitNames(target.slot)) == 0 && time.Now().Before(deadline) { + time.Sleep(time.Millisecond) + } + _, body := getContracts(t, f, "operator", "?stream_id=show"+target.query) + if len(body.Params) != 1 || body.Params[0].Path != "league" || len(body.Params[0].EnumValues) != 2 { + t.Fatalf("source params: %+v", body.Params) + } + if len(body.Triggers) != 1 || body.Triggers[0].EntrypointID != "league" || len(body.Awaits) != 1 || body.Awaits[0].AwaitName != "pick" { + t.Fatalf("source Blue contract: %+v", body) + } + if deps.Host.Bundle(target.slot) != nil { + t.Fatal("operator contract recreated a compiled bundle") + } + if string(observed.source) != string(source) { + t.Fatal("LSML source mutated") + } + } + for _, query := range []struct { + path string + status int + }{ + {"/api/v1/scenes/scene-1/operator-inputs?v=" + deps.Host.Digest(bluehost.SlotOnAir), http.StatusOK}, + {"/api/v1/scenes/scene-1/operator-inputs?v=" + digest, http.StatusNotFound}, + {"/api/v1/scenes/scene-wrong/operator-inputs?v=" + digest, http.StatusNotFound}, + {"/api/v1/scenes/scene-1/operator-inputs?v=wrong", http.StatusNotFound}, + {"/api/v1/scenes/scene-1/operator-inputs", http.StatusNotFound}, + } { + rec := opRequest(t, mux, "GET", query.path, "operator", nil) + if rec.Code != query.status { + t.Fatalf("%s: %d %s", query.path, rec.Code, rec.Body.String()) + } + if rec.Code == http.StatusOK { + var body struct { + OperatorInputs []json.RawMessage `json:"operator_inputs"` + } + if json.Unmarshal(rec.Body.Bytes(), &body) != nil || len(body.OperatorInputs) != 1 { + t.Fatalf("inputs: %s", rec.Body.String()) + } + } + } +} + +func TestCockpit_PreviewUsesOwnBlueSlotAndEmptyStaysEmpty(t *testing.T) { + live := buildEngineBOperatorProgram(t, "live-call", "live-called", "live-pick", "core.primitive.integer", "live-picked") + preview := buildEngineBOperatorProgram(t, "preview-call", "preview-called", "preview-pick", "core.primitive.integer", "preview-picked") + ef := newEngineBOperatorFixtureOnSlot(t, bluehost.SlotOnAir, live) + f := &cockpitFixture{mux: ef.mux} + _, empty := getContracts(t, f, "operator", "?stream_id=show&target=preview") + if len(empty.Params)+len(empty.Triggers)+len(empty.Awaits) != 0 { + t.Fatalf("empty Preview leaked: %+v", empty) + } + ef.takeSlot(t, bluehost.SlotPreview, preview) + _, body := getContracts(t, f, "operator", "?stream_id=show&target=preview") + if len(body.Triggers) != 1 || body.Triggers[0].EntrypointID != "preview-call" || len(body.Awaits) != 1 || body.Awaits[0].AwaitName != "preview-pick" { + t.Fatalf("Preview contract: %+v", body) + } +} diff --git a/internal/api/cockpit_test.go b/internal/api/cockpit_test.go index 664fb8e8..3bbb810e 100644 --- a/internal/api/cockpit_test.go +++ b/internal/api/cockpit_test.go @@ -408,7 +408,7 @@ func TestCockpit_EngineBDeclaredAwaitNeverArmedIsExcluded(t *testing.T) { // TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna proves slot // isolation: an await armed on bluehost.Host's PREVIEW slot must not appear // in the antenna's cockpit contract, which reads SlotOnAir exclusively -// (appendEngineBScene's only call site, getCockpitContracts). +// (getCockpitContracts maps an absent target to SlotOnAir). func TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna(t *testing.T) { previewProgram := buildEngineBOperatorProgram(t, "call", "called", "hidden", "core.primitive.integer", "picked") onAirProgram := buildEngineBOperatorProgram(t, "call", "called", "", "", "") @@ -446,28 +446,10 @@ func TestCockpit_EngineBPreviewArmedAwaitDoesNotLeakToAntenna(t *testing.T) { } } -// TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot restores a proof the -// bail owner had removed to avoid an early collision with this work unit's -// unification (Prism#740 addendum, ORION-UNKNOWN-TARGET-CONTRACT): the -// antenna leg of GET /cockpit/contracts must report only the on-air -// program's armed await when BOTH slots are populated and armed -// simultaneously with DIFFERENTLY NAMED awaits — the same "a distinct name, -// not just non-empty vs. empty" shape as -// TestOperator_PendingIsolatesArmedAwaitsPerSlot -// (operator_dual_slot_isolation_test.go, PR#393), applied to the fourth -// route that reads ?target=. -// -// Before this unification, isolation on this leg rested on a hardcoded -// argument at the appendEngineBScene call site (cockpit.go), never on a -// branch reachable through ?target= — a mutation swapping that literal from -// SlotOnAir to SlotPreview would leak the preview await's exact name into -// the antenna contract, and an ambiguous mutation (empty-list-only -// assertions elsewhere) would not have caught it. This test re-proves that -// isolation against the now-unified resolveTargetKind/targetKind -// vocabulary — the antenna/preview split for THIS route is still that same -// SlotOnAir literal (the preview leg stays on Engine A, deliberately out of -// scope — see getCockpitContracts's doc), reached through the shared -// decision point rather than a private re-parse of the query string. +// TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot proves that the +// Program facet contains only its own live await when both native slots +// have differently named armed awaits. The Preview facet has the symmetric +// proof in cockpit_source_test.go. func TestCockpit_AntennaContractIsolatesArmedAwaitsPerSlot(t *testing.T) { onAirProgram := buildEngineBOperatorProgram(t, "call-onair", "called-onair", "pick-onair", "core.primitive.integer", "picked-onair") diff --git a/internal/api/editable_idle_native_test.go b/internal/api/editable_idle_native_test.go new file mode 100644 index 00000000..2f4e5d2c --- /dev/null +++ b/internal/api/editable_idle_native_test.go @@ -0,0 +1,146 @@ +package api + +import ( + "context" + "encoding/json" + "io" + "log/slog" + "net/http" + "net/http/httptest" + "os" + "strconv" + "strings" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/runtime" + "github.com/coder/websocket" +) + +// Opt-in diagnostic on a disposable receiver. Time values are observations, +// never timing assertions: loaded Windows hosts need not meet a wall-clock SLA. +func TestEditableIdleDeltaNative(t *testing.T) { + address := os.Getenv("ORION_TEST_PRIVATE_LANE_ADDRESS") + if address == "" { + t.Skip("requires disposable native receiver") + } + firstPause := 2 * time.Second + if pause := os.Getenv("ORION_TEST_IDLE_PAUSE_MS"); pause != "" { + ms, err := strconv.Atoi(pause) + if err != nil || ms < 1 || ms > 180000 { + t.Fatal("invalid idle probe duration") + } + firstPause = time.Duration(ms) * time.Millisecond + } + ctx, cancel := context.WithTimeout(context.Background(), firstPause+35*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + producer := lsdpreception.NewProducer(ctx, reception) + defer producer.Close() + logger := slog.New(slog.NewTextHandler(io.Discard, nil)) + hub := lsdpreception.NewHub(producer, logger) + hub.EnablePhysicalLanes() + preview := runtime.NewPreviewSlot(ctx, runtime.NewComputeRegistry(), hub.Lane("preview"), logger) + defer preview.Close() + type nativeTiming struct { + start, end time.Time + before, after lsdpreception.DeliveryStatus + } + timings := make(chan nativeTiming, 32) + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: logger, Config: config.Config{Profile: config.ProfileEmbeddedLocal, LocalEditorToken: "idle-test-capability"}, Preview: preview, SceneIntent: &SceneIntentDeps{Host: bluehost.NewHost()}, NativeLSDPFlush: func(ctx context.Context) error { + m := nativeTiming{start: time.Now(), before: producer.Status()} + err := producer.Flush(ctx) + m.end, m.after = time.Now(), producer.Status() + timings <- m + return err + }}) + doc := map[string]any{"lsml": "1.2", "scene_id": "idle-native", "scene_version": "sha256:" + strings.Repeat("0", 64), "layout": map[string]any{"kind": "shape", "bind": map[string]any{"width": "__editable.node.width"}}, "defaults": map[string]any{"__editable.node.width": json.Number("10")}} + version, err := canonical.Digest(doc) + if err != nil { + t.Fatal(err) + } + doc["scene_version"] = version + path := "__editable.node.width" + assets := map[string][]byte{} + if fixture := os.Getenv("ORION_TEST_IDLE_SCENE_PATH"); fixture != "" { + raw, err := os.ReadFile(fixture) + if err != nil { + t.Fatal(err) + } + var nativeDoc struct { + Authoring struct { + Bundle map[string]any `json:"lsml_bundle"` + Assets map[string][]byte `json:"assets"` + } `json:"x-solar-authoring"` + } + decoder := json.NewDecoder(strings.NewReader(string(raw))) + decoder.UseNumber() + if decoder.Decode(&nativeDoc) != nil || nativeDoc.Authoring.Bundle == nil { + t.Fatal("invalid native authoring fixture") + } + doc, assets = nativeDoc.Authoring.Bundle, nativeDoc.Authoring.Assets + path = os.Getenv("ORION_TEST_IDLE_LEAF") + if path == "" { + t.Fatal("fixture needs ORION_TEST_IDLE_LEAF") + } + } + opened := editableAPIRequest(t, mux, http.MethodPost, map[string]any{"scene_id": doc["scene_id"], "scene_version": doc["scene_version"], "render_mode": "source-only", "lsml_bundle": doc, "assets": assets}, "operator") + if opened.Code != http.StatusOK { + t.Fatal(opened.Code, opened.Body.String()) + } + <-timings // activation's native barrier, not a leaf edit + head, _ := preview.EditableTargetHead("preview") + server := httptest.NewServer(mux) + defer server.Close() + conn, response, err := websocket.Dial(ctx, "ws"+strings.TrimPrefix(server.URL, "http")+"/api/v1/show/editable-preview.ws?local_editor_token=idle-test-capability", nil) + if response != nil && response.Body != nil { + defer response.Body.Close() + } + if err != nil { + t.Fatal(err) + } + defer conn.Close(websocket.StatusNormalClosure, "") + for i, pause := range []time.Duration{firstPause, 100 * time.Millisecond, 100 * time.Millisecond, 2 * time.Second, 100 * time.Millisecond, 100 * time.Millisecond, 6 * time.Second, 100 * time.Millisecond} { + time.Sleep(pause) + seq := uint64(i + 1) + value := 0.148 + if i%2 != 0 { + value = 0.74 + } + raw, _ := json.Marshal(map[string]any{"target": "preview", "writer_id": head.WriterID, "scene_id": head.SceneID, "base_edit_seq": seq - 1, "edit_seq": seq, "patches": []map[string]any{{"path": path, "value": value}}}) + start := time.Now() + if err = conn.Write(ctx, websocket.MessageText, raw); err != nil { + t.Fatal(err) + } + _, reply, err := conn.Read(ctx) + end := time.Now() + if err != nil { + t.Fatal(err) + } + var ack struct { + Type string + EditSeq uint64 `json:"edit_seq"` + } + if json.Unmarshal(reply, &ack) != nil || ack.Type != "ack" || ack.EditSeq != seq { + t.Fatal(string(reply)) + } + m := <-timings + state, err := reception.Read(ctx, "solar/lane-b") + if err != nil { + t.Fatal(err) + } + if state.(map[string]any)["defaults"].(map[string]any)[path] != value { + t.Fatal("WS ACK did not follow actual native application") + } + proof, _ := json.Marshal(map[string]any{"seq": seq, "idle_ms": pause.Milliseconds(), "ws_ack_ms": float64(end.Sub(start).Microseconds()) / 1000, "ws_to_native_barrier_ms": float64(m.start.Sub(start).Microseconds()) / 1000, "native_barrier_ms": float64(m.end.Sub(m.start).Microseconds()) / 1000, "native_to_ws_ack_ms": float64(end.Sub(m.end).Microseconds()) / 1000, "before": m.before, "after": m.after, "native_value_verified": true}) + t.Log("IDLE_NATIVE_TIMING " + string(proof)) + } +} diff --git a/internal/api/editable_native_delivery_test.go b/internal/api/editable_native_delivery_test.go new file mode 100644 index 00000000..f70f47de --- /dev/null +++ b/internal/api/editable_native_delivery_test.go @@ -0,0 +1,92 @@ +package api + +import ( + "context" + "encoding/json" + "io" + "log/slog" + "net/http" + "os" + "strings" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +// The opt-in harness owns a disposable Rust receiver; no active installation is touched. +func TestRealEditableAuthoringNative(t *testing.T) { + address := os.Getenv("ORION_TEST_EDITABLE_NATIVE_ADDRESS") + if address == "" { + t.Skip("requires disposable native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + producer := lsdpreception.NewProducer(ctx, reception) + defer producer.Close() + logger := slog.New(slog.NewTextHandler(io.Discard, nil)) + hub := lsdpreception.NewHub(producer, logger) + preview := runtime.NewPreviewSlot(ctx, runtime.NewComputeRegistry(), hub.Lane("preview"), logger) + preview.SetEditableAirWire(hub) + defer preview.Close() + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: logger, Config: config.Config{Profile: config.ProfileEmbeddedLocal}, Preview: preview, SceneIntent: &SceneIntentDeps{}, NativeLSDPFlush: producer.Flush}) + base := map[string]any{"lsml": "1.2", "scene_id": "native-editable-proof", "scene_version": "sha256:" + strings.Repeat("0", 64), "layout": map[string]any{"kind": "shape", "bind": map[string]any{"width": "__editable.node.width"}}, "defaults": map[string]any{"__editable.node.width": json.Number("10")}} + version, err := canonical.Digest(base) + if err != nil { + t.Fatal(err) + } + base["scene_version"] = version + opened := editableAPIRequest(t, mux, http.MethodPost, map[string]any{"scene_id": base["scene_id"], "scene_version": version, "render_mode": "source-only", "lsml_bundle": base}, "operator") + if opened.Code != http.StatusOK { + t.Fatalf("open: %d %s", opened.Code, opened.Body.String()) + } + read := func() map[string]any { + t.Helper() + value, err := reception.Read(ctx, "solar/preview") + if err != nil { + t.Fatal(err) + } + document, ok := value.(map[string]any) + if !ok { + t.Fatalf("native document missing: %T", value) + } + return document + } + before := read() + immutable := before["x-solar-authoring"].(map[string]any)["lsml_bundle"] + patched := editableAPIRequest(t, mux, http.MethodPut, map[string]any{"scene_id": base["scene_id"], "base_edit_seq": 0, "edit_seq": 1, "patches": []map[string]any{{"path": "__editable.node.width", "value": 42}}}, "operator") + if patched.Code != http.StatusAccepted { + t.Fatalf("patch: %d %s", patched.Code, patched.Body.String()) + } + after := read() + if after["defaults"].(map[string]any)["__editable.node.width"] != float64(42) { + t.Fatal("editable mutation did not cross native LSDP") + } + a, _ := json.Marshal(immutable) + b, _ := json.Marshal(after["x-solar-authoring"].(map[string]any)["lsml_bundle"]) + if string(a) != string(b) { + t.Fatal("live mutation altered immutable base") + } + if _, err = preview.PromoteEditable(base["scene_id"].(string), "preview"); err != nil { + t.Fatal(err) + } + if err = producer.Flush(ctx); err != nil { + t.Fatal(err) + } + generations, err := reception.Read(ctx, "solar/generations") + if err != nil { + t.Fatal(err) + } + generation := generations.(map[string]any)[lsdpreception.GenerationKey(base["scene_id"].(string), version)].(map[string]any) + if generation["x-solar-authoring"] == nil || generation["defaults"].(map[string]any)["__editable.node.width"] != float64(42) { + t.Fatal("promoted generation lost native authoring delivery or mutation") + } +} diff --git a/internal/api/editable_preview.go b/internal/api/editable_preview.go index 1f26f9b4..8a1d00b7 100644 --- a/internal/api/editable_preview.go +++ b/internal/api/editable_preview.go @@ -10,22 +10,32 @@ import ( "sync" "time" + "github.com/ZabLaboratory/Orion/internal/bluehost" "github.com/ZabLaboratory/Orion/internal/compiler" "github.com/ZabLaboratory/Orion/internal/runtime" "github.com/coder/websocket" ) -const maxEditablePreviewBody = 4 << 20 +// Includes base64 font/media assets; four standard Cambria faces alone exceed +// 4 MiB. Keep a bounded envelope compatible with Prism's 8 MiB font budget. +const maxEditablePreviewBody = 16 << 20 const maxEditablePreviewPatches = 256 type editablePreviewOpenRequest struct { - SceneID string `json:"scene_id"` - SceneVersion string `json:"scene_version"` - EditSeq uint64 `json:"edit_seq"` - LSMLBundle json.RawMessage `json:"lsml_bundle"` + Target string `json:"target,omitempty"` + WriterID string `json:"writer_id,omitempty"` + BaseEditSeq *uint64 `json:"base_edit_seq,omitempty"` + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + EditSeq uint64 `json:"edit_seq"` + LSMLBundle json.RawMessage `json:"lsml_bundle"` + Assets map[string][]byte `json:"assets,omitempty"` + RenderMode string `json:"render_mode,omitempty"` } type editablePreviewPatchRequest struct { + Target string `json:"target,omitempty"` + WriterID string `json:"writer_id,omitempty"` SceneID string `json:"scene_id"` BaseEditSeq uint64 `json:"base_edit_seq"` EditSeq uint64 `json:"edit_seq"` @@ -36,10 +46,13 @@ type editablePreviewPatchRequest struct { } type editablePreviewInputRequest struct { - Type string `json:"type"` - Path string `json:"path"` - Value json.RawMessage `json:"value"` - Source string `json:"source"` + Target string `json:"target,omitempty"` + SceneID string `json:"scene_id,omitempty"` + WriterID string `json:"writer_id,omitempty"` + Type string `json:"type"` + Path string `json:"path"` + Value json.RawMessage `json:"value"` + Source string `json:"source"` } type editablePreviewActivateRequest struct { @@ -47,7 +60,11 @@ type editablePreviewActivateRequest struct { EditSeq uint64 `json:"edit_seq"` } -func applyEditablePreviewPatch(deps PublicDeps, body editablePreviewPatchRequest) (int, string, error) { +func applyEditablePreviewPatch(ctx context.Context, deps PublicDeps, body editablePreviewPatchRequest) (int, string, error) { + target, valid := editableTarget(body.Target) + if !valid { + return http.StatusBadRequest, "INVALID_TARGET", errors.New("invalid editable target") + } if body.SceneID == "" || len(body.Patches) == 0 || len(body.Patches) > maxEditablePreviewPatches { return http.StatusBadRequest, "INVALID_BODY", errors.New("invalid editable preview patch body") } @@ -58,7 +75,12 @@ func applyEditablePreviewPatch(deps PublicDeps, body editablePreviewPatchRequest } patches = append(patches, runtime.EditablePatch{Path: patch.Path, Value: patch.Value}) } - if err := deps.Preview.ApplyEditablePatches(body.SceneID, body.BaseEditSeq, body.EditSeq, patches); err != nil { + release, err := acquireEditableCommit(ctx, deps, target) + if err != nil { + return http.StatusConflict, "SCENE_CHANGING", err + } + defer release() + if err := deps.Preview.ApplyEditableTargetPatches(target, body.SceneID, body.WriterID, body.BaseEditSeq, body.EditSeq, patches); err != nil { status, code := http.StatusConflict, "EDITABLE_PREVIEW_CONFLICT" if errors.Is(err, runtime.ErrPreviewEditPath) { status, code = http.StatusUnprocessableEntity, "EDITABLE_PATH_UNKNOWN" @@ -67,12 +89,15 @@ func applyEditablePreviewPatch(deps PublicDeps, body editablePreviewPatchRequest } return status, code, err } + if err := flushEditableTarget(ctx, deps, target); err != nil { + return http.StatusServiceUnavailable, "NATIVE_LSDP_DELIVERY_FAILED", err + } return http.StatusAccepted, "", nil } func postEditablePreview(deps PublicDeps) http.HandlerFunc { return requireOperator(func(w http.ResponseWriter, r *http.Request) { - if !deps.Config.Profile.IsEmbeddedLocal() || deps.Preview == nil || deps.SceneIntent == nil || (deps.SceneIntent.StaticBundleCompiler == nil && deps.SceneIntent.StaticRenderBundleCompiler == nil) { + if !deps.Config.Profile.IsEmbeddedLocal() || deps.Preview == nil || deps.SceneIntent == nil { writeJSON(w, http.StatusNotFound, map[string]string{"code": "NOT_FOUND"}) return } @@ -86,6 +111,16 @@ func postEditablePreview(deps PublicDeps) http.HandlerFunc { writeJSON(w, http.StatusBadRequest, map[string]string{"code": "INVALID_BODY"}) return } + target, valid := editableTarget(body.Target) + if !valid { + writeJSON(w, http.StatusBadRequest, map[string]string{"code": "INVALID_TARGET"}) + return + } + expected, editable := deps.Preview.EditableTargetSnapshot(target) + if target == "program" && (!editable || expected.Head.SceneID != body.SceneID) { + writeJSON(w, http.StatusConflict, map[string]string{"code": "EDITABLE_PREVIEW_CONFLICT"}) + return + } bundle, defaults, err := compileEditablePreview(deps.SceneIntent, body) if errors.Is(err, compiler.ErrInvalidStaticRenderBundle) { writeJSON(w, http.StatusInternalServerError, map[string]string{"code": "STATIC_BUNDLE_INVALID"}) @@ -100,17 +135,75 @@ func postEditablePreview(deps PublicDeps) http.HandlerFunc { SceneVersion: body.SceneVersion, Defaults: defaults, } - deps.Preview.ActivateEditableWithBundle(body.SceneID, graph, bundle, body.EditSeq, rawBundleCopy(body.LSMLBundle)) + nativeSource, err := editableNativeSource(body) + if err != nil { + writeJSON(w, http.StatusUnprocessableEntity, map[string]string{"code": "EDITABLE_SOURCE_INVALID"}) + return + } + slot := bluehost.SlotPreview + if target == "program" { + slot = bluehost.SlotOnAir + } + host := deps.SceneIntent.Host + if host != nil { + release, err := host.AcquireSceneCommit(r.Context(), slot) + if err != nil { + writeJSON(w, http.StatusConflict, map[string]string{"code": "SCENE_CHANGING"}) + return + } + defer release() + } + err = deps.Preview.ReplaceEditableTarget(target, body.SceneID, body.WriterID, body.BaseEditSeq, expected, graph, bundle, body.EditSeq, nativeSource, func() error { + if host == nil { + return nil + } + if deps.SceneIntent.Bridges != nil { + deps.SceneIntent.Bridges.Stop(slot) + } + if target == "program" { + err = host.TakeStatic(body.SceneID, body.SceneVersion) + } else { + err = host.PreparePreviewStatic(body.SceneID, body.SceneVersion) + } + if err != nil && !errors.Is(err, bluehost.ErrAlreadyLoaded) { + return err + } + bytes, _ := json.Marshal(bundle) + host.SetBundle(slot, bytes) + host.SetSceneInterface(slot, nativeSource) + host.SetArtifactSetDigest(slot, body.SceneVersion) + return nil + }) + if err != nil { + writeJSON(w, http.StatusConflict, map[string]string{"code": "EDITABLE_PREVIEW_CONFLICT", "message": err.Error()}) + return + } + if deps.SceneIntent.Bridges != nil { + deps.SceneIntent.Bridges.SetSceneMirror(slot, deps.Preview.EditableTargetMirror(target)) + } + if err := flushEditableTarget(r.Context(), deps, target); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"code": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } + head, _ := deps.Preview.EditableTargetHead(target) writeJSON(w, http.StatusOK, map[string]any{ "scene_id": body.SceneID, "scene_version": body.SceneVersion, "edit_seq": body.EditSeq, "paths": len(defaults), + "target": target, + "writer_id": head.WriterID, }) }) } func compileEditablePreview(deps *SceneIntentDeps, body editablePreviewOpenRequest) (*compiler.RenderBundle, map[string]json.RawMessage, error) { + if body.RenderMode == "source-only" { + return editableSourceBundle(body) + } + if body.RenderMode != "" { + return nil, nil, errors.New("unsupported editable render mode") + } if deps.StaticRenderBundleCompiler != nil { bundle, defaults, err := deps.StaticRenderBundleCompiler(body.LSMLBundle, body.SceneID, body.SceneVersion) if err == nil && bundle == nil { @@ -118,6 +211,9 @@ func compileEditablePreview(deps *SceneIntentDeps, body editablePreviewOpenReque } return bundle, defaults, err } + if deps.StaticBundleCompiler == nil { + return nil, nil, errors.New("editable compatibility compiler unavailable") + } compiled, defaults, err := deps.StaticBundleCompiler(body.LSMLBundle, body.SceneID, body.SceneVersion) if err != nil { return nil, nil, err @@ -168,6 +264,10 @@ func postEditablePreviewAir(deps PublicDeps) http.HandlerFunc { writeJSON(w, status, map[string]string{"code": code, "message": err.Error()}) return } + if err := flushNativeDelivery(r.Context(), deps, true); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"code": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } writeJSON(w, http.StatusOK, map[string]any{ "scene_id": body.SceneID, "scene_version": version, @@ -199,6 +299,10 @@ func postEditablePreviewActivate(deps PublicDeps) http.HandlerFunc { writeJSON(w, http.StatusConflict, map[string]string{"code": code, "message": err.Error()}) return } + if err := flushNativeDelivery(r.Context(), deps, true); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"code": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } writeJSON(w, http.StatusOK, map[string]any{"scene_id": body.SceneID, "edit_seq": body.EditSeq, "reused": true}) }) } @@ -214,7 +318,7 @@ func putEditablePreviewPatch(deps PublicDeps) http.HandlerFunc { writeJSON(w, http.StatusBadRequest, map[string]string{"code": "INVALID_BODY"}) return } - status, code, err := applyEditablePreviewPatch(deps, body) + status, code, err := applyEditablePreviewPatch(r.Context(), deps, body) if err != nil { writeJSON(w, status, map[string]string{"code": code, "message": err.Error()}) return @@ -226,10 +330,11 @@ func putEditablePreviewPatch(deps PublicDeps) http.HandlerFunc { // editablePreviewSocket is Prism's prewarmed hot-edit lane. Its random // capability is separate from both the operator handshake and Solar's viewer // token, and the handler exists only in embedded-local. Every accepted frame -// still enters PreviewSlot.ApplyEditablePatches, preserving sequence checks, -// bounded paths and the Preview/Program isolation invariant. +// still enters PreviewSlot.ApplyEditableTargetPatches, preserving author/sequence +// checks, bounded paths and explicit active Preview/Program isolation. func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { type editableObserver struct { + target string conn *websocket.Conn writeMu sync.Mutex done chan struct{} @@ -258,6 +363,10 @@ func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { observers.mu.Lock() connections := make([]*editableObserver, 0, len(observers.conns)) for observer := range observers.conns { + target, _ := editableTarget(body.Target) + if observer.target != target { + continue + } connections = append(connections, observer) } observers.mu.Unlock() @@ -266,7 +375,7 @@ func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { } payload, err := json.Marshal(map[string]any{ "type": "accepted_patch", "scene_id": body.SceneID, - "edit_seq": body.EditSeq, "patches": body.Patches, + "edit_seq": body.EditSeq, "patches": body.Patches, "target": body.Target, }) if err != nil { return @@ -310,9 +419,14 @@ func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { defer conn.Close(websocket.StatusNormalClosure, "") conn.SetReadLimit(maxEditablePreviewBody) if r.URL.Query().Get("role") == "solar" { + target, valid := editableTarget(r.URL.Query().Get("target")) + if !valid { + return + } observer := &editableObserver{ - conn: conn, - done: make(chan struct{}), + target: target, + conn: conn, + done: make(chan struct{}), } observers.mu.Lock() observers.conns[observer] = struct{}{} @@ -362,8 +476,28 @@ func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { } continue } - applyErr := deps.Preview.ApplyPreviewInput(input.Path, input.Value, "service:prism-local-quasar") + target, valid := editableTarget(input.Target) + if !valid { + if writeEditableSocketJSON(r.Context(), conn, map[string]any{"type": "input_ack", "accepted": false, "code": "INVALID_TARGET"}) != nil { + return + } + continue + } + release, applyErr := acquireEditableCommit(r.Context(), deps, target) code := "" + if applyErr != nil { + code = "SCENE_CHANGING" + } + if applyErr == nil { + applyErr = deps.Preview.ApplyEditableTargetInput(target, input.SceneID, input.WriterID, input.Path, input.Value, "service:prism-local-quasar") + if applyErr == nil { + applyErr = flushEditableTarget(r.Context(), deps, target) + } + release() + if applyErr != nil { + code = "NATIVE_LSDP_DELIVERY_FAILED" + } + } switch { case errors.Is(applyErr, runtime.ErrPreviewEditPath): code = "PREVIEW_PATH_UNKNOWN" @@ -373,9 +507,12 @@ func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { code = "PREVIEW_SCENE_UNAVAILABLE" case errors.Is(applyErr, runtime.ErrPreviewBusy): code = "PREVIEW_BUSY" + case errors.Is(applyErr, runtime.ErrPreviewEditSequence): + code = "EDITABLE_PREVIEW_CONFLICT" } if writeEditableSocketJSON(r.Context(), conn, map[string]any{ "type": "input_ack", "v": 1, "path": input.Path, + "target": target, "accepted": applyErr == nil, "code": code, }) != nil { return @@ -392,14 +529,14 @@ func editablePreviewSocket(deps PublicDeps) http.HandlerFunc { _ = writeEditableSocketJSON(r.Context(), conn, map[string]any{"type": "error", "code": "INVALID_BODY"}) return } - _, code, applyErr := applyEditablePreviewPatch(deps, body) + _, code, applyErr := applyEditablePreviewPatch(r.Context(), deps, body) if applyErr != nil { _ = writeEditableSocketJSON(r.Context(), conn, map[string]any{"type": "error", "code": code, "message": applyErr.Error()}) return } broadcastAccepted(body) if writeEditableSocketJSON(r.Context(), conn, map[string]any{ - "type": "ack", "scene_id": body.SceneID, "edit_seq": body.EditSeq, + "type": "ack", "scene_id": body.SceneID, "edit_seq": body.EditSeq, "target": body.Target, "observer_count": observerCount(), }) != nil { return diff --git a/internal/api/editable_preview_source.go b/internal/api/editable_preview_source.go new file mode 100644 index 00000000..60b81cd4 --- /dev/null +++ b/internal/api/editable_preview_source.go @@ -0,0 +1,84 @@ +package api + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "regexp" + "sort" + "strings" + + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/compiler" +) + +// Local authoring verifies the immutable LSML address without lowering its tree. +// The private Preview clone still owns sequencing/defaults; no Blue admission is created. +func editableSourceBundle(body editablePreviewOpenRequest) (*compiler.RenderBundle, map[string]json.RawMessage, error) { + var document map[string]any + decoder := json.NewDecoder(bytes.NewReader(body.LSMLBundle)) + decoder.UseNumber() + if decoder.Decode(&document) != nil || document == nil { + return nil, nil, errors.New("invalid editable LSML document") + } + version := document["lsml"] + _, layout := document["layout"].(map[string]any) + if (version != "1.0" && version != "1.1" && version != "1.2") || !layout || document["scene_id"] != body.SceneID || document["scene_version"] != body.SceneVersion { + return nil, nil, errors.New("editable LSML identity or layout mismatch") + } + document["scene_version"] = "sha256:" + strings.Repeat("0", 64) + digest, err := canonical.Digest(document) + if err != nil || digest != body.SceneVersion { + return nil, nil, errors.New("editable LSML content address mismatch") + } + var source struct { + Defaults map[string]json.RawMessage `json:"defaults"` + } + if err := json.Unmarshal(body.LSMLBundle, &source); err != nil { + return nil, nil, err + } + return &compiler.RenderBundle{SceneVersion: body.SceneVersion, Defaults: source.Defaults, SourceLSML: rawBundleCopy(body.LSMLBundle)}, source.Defaults, nil +} + +// Native authoring delivery shares the scene's LSDP resource. The immutable +// base remains addressable while live defaults evolve through native mutations. +func editableNativeSource(body editablePreviewOpenRequest) ([]byte, error) { + var document map[string]json.RawMessage + if err := json.Unmarshal(body.LSMLBundle, &document); err != nil { + return nil, err + } + if document == nil { + return nil, errors.New("editable LSML object required") + } + if _, exists := document["x-solar-authoring"]; exists { + return nil, errors.New("nested editable authoring delivery is forbidden") + } + assets := map[string][]byte{} + fonts := []string{} + fontPath := regexp.MustCompile(`^assets/([a-f0-9]{64})\.(ttf|otf|ttc|woff|woff2)$`) + for path, bytes := range body.Assets { + if match := fontPath.FindStringSubmatch(path); match != nil { + digest := sha256.Sum256(bytes) + if hex.EncodeToString(digest[:]) != match[1] { + return nil, errors.New("editable font content address mismatch") + } + fonts = append(fonts, match[1]) + } else { + assets[path] = bytes + } + } + sort.Strings(fonts) + envelope, err := json.Marshal(map[string]any{ + "format": "solar.authoring/1", + "lsml_bundle": json.RawMessage(body.LSMLBundle), + "assets": assets, + "fonts": fonts, + }) + if err != nil { + return nil, err + } + document["x-solar-authoring"] = envelope + return json.Marshal(document) +} diff --git a/internal/api/editable_preview_source_test.go b/internal/api/editable_preview_source_test.go new file mode 100644 index 00000000..c5f3443d --- /dev/null +++ b/internal/api/editable_preview_source_test.go @@ -0,0 +1,78 @@ +package api + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/config" +) + +func TestEditableSourceOnlyAddressAndImmutableBase(t *testing.T) { + doc := map[string]any{"lsml": "1.2", "scene_id": "draft", "scene_version": "sha256:" + strings.Repeat("0", 64), "layout": map[string]any{"kind": "shape", "width": json.Number("200.5")}, "defaults": map[string]any{"__editable.61.x": json.Number("10")}} + version, err := canonical.Digest(doc) + if err != nil { + t.Fatal(err) + } + doc["scene_version"] = version + raw, err := json.Marshal(doc) + if err != nil { + t.Fatal(err) + } + mux, wire := editableAPIFixture(t, config.ProfileEmbeddedLocal, func(deps *SceneIntentDeps) { deps.StaticBundleCompiler = nil; deps.StaticRenderBundleCompiler = nil }) + fontBytes := []byte{1, 2, 3} + fontHash := sha256.Sum256(fontBytes) + fontDigest := hex.EncodeToString(fontHash[:]) + fontPath := "assets/" + fontDigest + ".ttf" + request := map[string]any{"scene_id": "draft", "scene_version": version, "render_mode": "source-only", "lsml_bundle": json.RawMessage(raw), "assets": map[string][]byte{fontPath: fontBytes}} + opened := editableAPIRequest(t, mux, http.MethodPost, request, "operator") + if opened.Code != http.StatusOK { + t.Fatalf("open: %d %s", opened.Code, opened.Body.String()) + } + patched := editableAPIRequest(t, mux, http.MethodPut, map[string]any{"scene_id": "draft", "base_edit_seq": 0, "edit_seq": 1, "patches": []map[string]any{{"path": "__editable.61.x", "value": 42}}}, "operator") + if patched.Code != http.StatusAccepted { + t.Fatalf("patch: %d %s", patched.Code, patched.Body.String()) + } + native := wire.source + if err != nil { + t.Fatal(err) + } + var decoded struct { + Version string `json:"scene_version"` + Authoring struct { + Format string `json:"format"` + Base json.RawMessage `json:"lsml_bundle"` + Assets map[string][]byte `json:"assets"` + Fonts []string `json:"fonts"` + } `json:"x-solar-authoring"` + } + if json.Unmarshal(native, &decoded) != nil || decoded.Version != version || decoded.Authoring.Format != "solar.authoring/1" || string(decoded.Authoring.Base) != string(raw) { + t.Fatal("native authoring must preserve the immutable base and asset bytes") + } + if len(decoded.Authoring.Fonts) != 1 || decoded.Authoring.Fonts[0] != fontDigest || len(decoded.Authoring.Assets) != 0 { + t.Fatal("native scene must reference preloaded fonts without their bytes") + } + invalidFont := editablePreviewOpenRequest{LSMLBundle: raw, Assets: map[string][]byte{fontPath: {9}}} + if _, err := editableNativeSource(invalidFont); err == nil { + t.Fatal("mismatched font content address accepted") + } + req := httptest.NewRequest(http.MethodGet, "/api/v1/show/editable-preview/source?scene_id=draft", nil) + req.Header.Set("X-Authenticated-User", "operator-1") + req.Header.Set("X-Authenticated-Role", "operator") + res := httptest.NewRecorder() + mux.ServeHTTP(res, req) + if res.Code != http.StatusNotFound { + t.Fatalf("HTTP source route still available: %d", res.Code) + } + doc["layout"] = map[string]any{"kind": "shape", "width": json.Number("201")} + request["lsml_bundle"] = doc + rejected := editableAPIRequest(t, mux, http.MethodPost, request, "operator") + if rejected.Code != 422 { + t.Fatalf("tampered address admitted: %d %s", rejected.Code, rejected.Body.String()) + } +} diff --git a/internal/api/editable_preview_test.go b/internal/api/editable_preview_test.go index 479b4cdf..8929bd8c 100644 --- a/internal/api/editable_preview_test.go +++ b/internal/api/editable_preview_test.go @@ -13,6 +13,8 @@ import ( "testing" "time" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" "github.com/ZabLaboratory/Orion/internal/compiler" "github.com/ZabLaboratory/Orion/internal/config" "github.com/ZabLaboratory/Orion/internal/runtime" @@ -23,9 +25,29 @@ type editableAPIMirror struct{} func (editableAPIMirror) Forward(runtime.SubscriberMsg) {} -type editableAPIWire struct{ active string } +type editableAPIWire struct { + active string + source []byte +} + +func TestEditablePreviewReplacesOldBlueAuthorityButKeepsProgram(t *testing.T) { + host := bluehost.NewHost() + _ = host.PreparePreviewStatic("old-blue", "old-v") + _ = host.TakeStatic("live", "live-v") + bridges := bluewire.NewRegistry() + defer bridges.StopAll() + mux, _ := editableAPIFixture(t, config.ProfileEmbeddedLocal, func(deps *SceneIntentDeps) { deps.Host = host; deps.Bridges = bridges }) + opened := editableAPIRequest(t, mux, http.MethodPost, map[string]any{"scene_id": "editable-chat", "scene_version": "sha256:chat", "edit_seq": 0, "lsml_bundle": map[string]any{"lsml": "1.1"}}, "operator") + if opened.Code != http.StatusOK || !host.Serving(bluehost.SlotPreview, "editable-chat", "sha256:chat") || !host.Serving(bluehost.SlotOnAir, "live", "live-v") { + t.Fatal("editable authority did not replace only Preview", opened.Code, opened.Body.String()) + } + if err := host.SwapAuthority(); err != nil || !host.Serving(bluehost.SlotOnAir, "editable-chat", "sha256:chat") { + t.Fatal("stale Blue actor promoted", err) + } +} -func (w *editableAPIWire) MirrorFor(string, string, *compiler.RenderBundle) runtime.SceneMirror { +func (w *editableAPIWire) MirrorFor(_ string, _ string, bundle *compiler.RenderBundle) runtime.SceneMirror { + w.source = append([]byte(nil), bundle.SourceLSML...) return editableAPIMirror{} } func (w *editableAPIWire) SetActive(sceneID string) { w.active = sceneID } diff --git a/internal/api/editable_targets.go b/internal/api/editable_targets.go new file mode 100644 index 00000000..5d517eeb --- /dev/null +++ b/internal/api/editable_targets.go @@ -0,0 +1,68 @@ +package api + +import ( + "context" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "net/http" + "time" +) + +func acquireEditableCommit(ctx context.Context, deps PublicDeps, target string) (func(), error) { + if deps.SceneIntent == nil || deps.SceneIntent.Host == nil { + return func() {}, nil + } + slot := bluehost.SlotPreview + if target == "program" { + slot = bluehost.SlotOnAir + } + return deps.SceneIntent.Host.AcquireSceneCommit(ctx, slot) +} + +func editableTarget(target string) (string, bool) { + if target == "" { + target = "preview" + } + return target, target == "preview" || target == "program" +} + +func flushEditableTarget(ctx context.Context, deps PublicDeps, target string) error { + ctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + if err := deps.Preview.FlushEditableTarget(ctx, target); err != nil { + return err + } + if deps.NativeLSDPFlush != nil { + return deps.NativeLSDPFlush(ctx) + } + return nil +} + +func getEditableTargetState(deps PublicDeps) http.HandlerFunc { + return requireOperator(func(w http.ResponseWriter, r *http.Request) { + if !deps.Config.Profile.IsEmbeddedLocal() || deps.Preview == nil { + writeJSON(w, http.StatusNotFound, map[string]string{"code": "NOT_FOUND"}) + return + } + target, valid := editableTarget(r.URL.Query().Get("target")) + if !valid { + writeJSON(w, http.StatusBadRequest, map[string]string{"code": "INVALID_TARGET"}) + return + } + id := r.URL.Query().Get("scene_id") + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + release, err := acquireEditableCommit(ctx, deps, target) + if err != nil { + writeJSON(w, http.StatusConflict, map[string]string{"code": "SCENE_CHANGING"}) + return + } + defer release() + head, defaults, err := deps.Preview.EditableTargetState(ctx, target, id) + if err != nil { + writeJSON(w, http.StatusConflict, map[string]string{"code": "EDITABLE_PREVIEW_CONFLICT"}) + return + } + w.Header().Set("Cache-Control", "no-store") + writeJSON(w, http.StatusOK, map[string]any{"target": target, "scene_id": head.SceneID, "scene_version": head.SceneVersion, "edit_seq": head.EditSeq, "writer_id": head.WriterID, "defaults": defaults}) + }) +} diff --git a/internal/api/editable_targets_test.go b/internal/api/editable_targets_test.go new file mode 100644 index 00000000..94fc9414 --- /dev/null +++ b/internal/api/editable_targets_test.go @@ -0,0 +1,153 @@ +package api + +import ( + "context" + "encoding/json" + "io" + "log/slog" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/compiler" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/runtime" + "github.com/coder/websocket" +) + +func TestEditableSocketContinuesSameWriterOnProgramAfterTake(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second) + defer cancel() + p := runtime.NewPreviewSlot(ctx, runtime.NewComputeRegistry(), &editableAPIWire{}, slog.New(slog.NewTextHandler(io.Discard, nil))) + p.SetEditableProgramWire(&editableAPIWire{}) + defer p.Close() + host := bluehost.NewHost() + intent := &SceneIntentDeps{Host: host, StaticRenderBundleCompiler: func(_ []byte, _ string, version string) (*compiler.RenderBundle, map[string]json.RawMessage, error) { + return &compiler.RenderBundle{SceneVersion: version}, map[string]json.RawMessage{"__editable.x": json.RawMessage(`10`)}, nil + }} + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: slog.Default(), Config: config.Config{Profile: config.ProfileEmbeddedLocal, LocalEditorToken: "editor-capability"}, Preview: p, SceneIntent: intent}) + opened := editableAPIRequest(t, mux, http.MethodPost, map[string]any{"scene_id": "a", "scene_version": "v1", "edit_seq": 4, "lsml_bundle": map[string]any{"lsml": "1.1"}}, "operator") + if opened.Code != http.StatusOK { + t.Fatal(opened.Code, opened.Body.String()) + } + head, _ := p.EditableTargetHead("preview") + actor := p.Current() + server := httptest.NewServer(mux) + defer server.Close() + conn, response, err := websocket.Dial(ctx, "ws"+strings.TrimPrefix(server.URL, "http")+"/api/v1/show/editable-preview.ws?local_editor_token=editor-capability", nil) + if response != nil && response.Body != nil { + defer response.Body.Close() + } + if err != nil { + t.Fatal(err) + } + defer conn.Close(websocket.StatusNormalClosure, "") + send := func(target, writer string, base, seq uint64) map[string]any { + t.Helper() + raw, _ := json.Marshal(map[string]any{"target": target, "writer_id": writer, "scene_id": "a", "base_edit_seq": base, "edit_seq": seq, "patches": []map[string]any{{"path": "__editable.x", "value": seq}}}) + if err := conn.Write(ctx, websocket.MessageText, raw); err != nil { + t.Fatal(err) + } + _, reply, err := conn.Read(ctx) + if err != nil { + t.Fatal(err) + } + var ack map[string]any + if err = json.Unmarshal(reply, &ack); err != nil { + t.Fatal(err) + } + return ack + } + if ack := send("preview", head.WriterID, 4, 5); ack["type"] != "ack" { + t.Fatal(ack) + } + if err = host.TakeStatic("old-program", "old-v"); err != nil { + t.Fatal(err) + } + finish, err := p.StageRoleSwap("a") + if err != nil { + t.Fatal(err) + } + if err = host.SwapAuthority(); err != nil { + finish(false) + t.Fatal(err) + } + finish(true) + for _, tc := range []struct { + query, role string + want int + }{{"target=program&scene_id=a", "operator", http.StatusOK}, {"target=preview&scene_id=a", "operator", http.StatusConflict}, {"target=program&scene_id=retired", "operator", http.StatusConflict}, {"target=invalid&scene_id=a", "operator", http.StatusBadRequest}, {"target=program&scene_id=a", "", http.StatusForbidden}} { + r := httptest.NewRequest(http.MethodGet, "/api/v1/show/editable-preview/state?"+tc.query, nil) + if tc.role != "" { + r.Header.Set("X-Authenticated-User", "operator-1") + r.Header.Set("X-Authenticated-Role", tc.role) + } + out := httptest.NewRecorder() + mux.ServeHTTP(out, r) + if out.Code != tc.want { + t.Fatal("active read-back guard", tc, out.Code, out.Body.String()) + } + } + if ack := send("program", head.WriterID, 5, 6); ack["type"] != "ack" || ack["target"] != "program" || ack["observer_count"] != float64(0) { + t.Fatal(ack) + } + _, _, state := actor.SnapshotState() + if string(state["__editable.x"]) != "6" { + t.Fatal("Program inbox not flushed before ack", state) + } + if ack := send("program", "retired", 6, 7); ack["type"] != "error" || ack["code"] != "EDITABLE_PREVIEW_CONFLICT" { + t.Fatal(ack) + } + structure := map[string]any{"target": "program", "scene_id": "a", "scene_version": "v2", "base_edit_seq": 6, "edit_seq": 7, "writer_id": head.WriterID, "lsml_bundle": map[string]any{"lsml": "1.1"}} + if replaced := editableAPIRequest(t, mux, http.MethodPost, structure, "operator"); replaced.Code != http.StatusOK { + t.Fatal(replaced.Code, replaced.Body.String()) + } + newHead, _ := p.EditableTargetHead("program") + if newHead.WriterID == head.WriterID || !host.Serving(bluehost.SlotOnAir, "a", "v2") || !host.Serving(bluehost.SlotPreview, "old-program", "old-v") { + t.Fatal(newHead) + } + if stale := editableAPIRequest(t, mux, http.MethodPost, structure, "operator"); stale.Code != http.StatusConflict { + t.Fatal("stale snapshot accepted", stale.Body.String()) + } +} + +func TestEditableCompilationCannotOverwriteConcurrentHotEdit(t *testing.T) { + p := runtime.NewPreviewSlot(context.Background(), runtime.NewComputeRegistry(), &editableAPIWire{}, slog.New(slog.NewTextHandler(io.Discard, nil))) + defer p.Close() + host := bluehost.NewHost() + calls := 0 + intent := &SceneIntentDeps{Host: host, StaticRenderBundleCompiler: func(_ []byte, _ string, version string) (*compiler.RenderBundle, map[string]json.RawMessage, error) { + calls++ + if calls == 2 { + if err := p.ApplyEditablePatches("a", 0, 1, []runtime.EditablePatch{{Path: "__editable.x", Value: json.RawMessage(`42`)}}); err != nil { + t.Fatal(err) + } + } + return &compiler.RenderBundle{SceneVersion: version}, map[string]json.RawMessage{"__editable.x": json.RawMessage(`10`)}, nil + }} + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: slog.Default(), Config: config.Config{Profile: config.ProfileEmbeddedLocal}, Preview: p, SceneIntent: intent}) + request := map[string]any{"scene_id": "a", "scene_version": "v1", "edit_seq": 0, "lsml_bundle": map[string]any{"lsml": "1.1"}} + if opened := editableAPIRequest(t, mux, http.MethodPost, request, "operator"); opened.Code != http.StatusOK { + t.Fatal(opened.Body.String()) + } + request["scene_version"] = "v2" + request["edit_seq"] = 2 + if stale := editableAPIRequest(t, mux, http.MethodPost, request, "operator"); stale.Code != http.StatusConflict { + t.Fatal("stale compilation accepted", stale.Body.String()) + } + if !host.Serving(bluehost.SlotPreview, "a", "v1") { + t.Fatal("host mutated before fence") + } + if err := p.Flush(context.Background()); err != nil { + t.Fatal(err) + } + _, _, state := p.Current().SnapshotState() + if string(state["__editable.x"]) != "42" { + t.Fatal(state) + } +} diff --git a/internal/api/host_surface.go b/internal/api/host_surface.go new file mode 100644 index 00000000..5c70748d --- /dev/null +++ b/internal/api/host_surface.go @@ -0,0 +1,56 @@ +package api + +import ( + "net/http" + "sort" + + "github.com/ZabLaboratory/Orion/internal/providers" +) + +// Host discovery supplements the portable descriptor with Orion's adapters and +// configured availability. A provider envelope alone is not a readiness claim. +func getHostSurface(deps PublicDeps) http.HandlerFunc { + return func(w http.ResponseWriter, _ *http.Request) { + availability := map[string]bool{} + if d := deps.HostEffects; d != nil { + availability["core.http.request"] = d.Egress != nil && len(deps.Config.HTTPEgressAllowHosts) > 0 + availability["core.db.query"] = d.DB != nil && len(d.DataSources) > 0 + availability["core.service.call"] = d.ServiceCall != nil && d.ResolveServiceRoute != nil + availability["zabcam.slots"] = d.ServiceCall != nil && d.ResolveServiceRoute != nil && d.SlotMirror != nil + availability["core.overlay-app"] = d.OverlayMirror != nil + } + if deps.SceneIntent != nil && deps.SceneIntent.Host != nil { + availability["core.show.emit"], availability["core.lsml"], availability["core.animation"] = deps.SceneIntent.Host.SurfaceAvailability() + } + catalog := providers.Registry() + for _, p := range catalog { + if !availability[p["capability"].(string)] { + p["health"] = "unavailable" + } + } + effects := []map[string]any{ + {"opcode": "core.http.request@1", "capability": "core.http.request", "preview": "noop"}, + {"opcode": "core.http-request@1", "capability": "core.http.request", "preview": "noop"}, + {"opcode": "core.db.query@1", "capability": "core.db.query", "preview": "read-only"}, + {"opcode": "core.service.call@1", "capability": "core.service.call", "preview": "read-only"}, + {"opcode": "zabcam.assign-slot@1", "capability": "zabcam.slots", "preview": "blocked"}, + {"opcode": "core.show.emit@1", "capability": "core.show.emit", "preview": "noop"}, + {"opcode": "core.overlay-app.set@1", "capability": "core.overlay-app", "preview": "emulated"}, + {"opcode": "core.animation.play@1", "capability": "core.animation", "preview": "scene-local"}, + } + for _, effect := range effects { + effect["available"] = availability[effect["capability"].(string)] + } + sort.Slice(effects, func(i, j int) bool { return effects[i]["opcode"].(string) < effects[j]["opcode"].(string) }) + surface := map[string]any{ + "schema_version": "orion.blue-host-surface.v1", "providers": catalog, "effects": effects, + "targets": []string{"program", "preview", "stream-rule"}, + "entrypoints": []string{"start", "tick", "topic", "platform-event", "call"}, + "mutation": map[string]any{"capability": "core.lsml", "operation": "mutate", "paths": []string{"/layout", "/defaults/*", "/animations"}, "operations": []string{"add", "remove", "replace", "test"}, "max_operations": 128, "persistence": "ram"}, + } + if deps.NativeLSDPStatus != nil { + surface["native_delivery"] = deps.NativeLSDPStatus() + } + writeJSON(w, http.StatusOK, surface) + } +} diff --git a/internal/api/host_surface_test.go b/internal/api/host_surface_test.go new file mode 100644 index 00000000..3eedd3a3 --- /dev/null +++ b/internal/api/host_surface_test.go @@ -0,0 +1,47 @@ +package api + +import ( + "encoding/json" + "net/http/httptest" + "testing" + + "github.com/ZabLaboratory/Orion/internal/bluehost" +) + +func TestHostSurfaceReportsUnwiredEffectsAndHostExtensions(t *testing.T) { + host := bluehost.NewHost() + host.SetShowEmitSink(func(string, any) {}) + host.SetSceneMutationSink(func(bluehost.Slot, []map[string]any) error { return nil }) + r := httptest.NewRecorder() + getHostSurface(PublicDeps{SceneIntent: &SceneIntentDeps{Host: host}})(r, httptest.NewRequest("GET", "/api/v1/runtime/host-surface", nil)) + var body struct { + Providers []struct{ Capability, Health string } + Effects []struct { + Opcode string + Available bool + } + } + if err := json.Unmarshal(r.Body.Bytes(), &body); err != nil { + t.Fatal(err) + } + if len(body.Providers) != 8 || len(body.Effects) != 8 { + t.Fatalf("incomplete surface: %s", r.Body.String()) + } + for _, provider := range body.Providers { + if provider.Capability == "core.db.query" && provider.Health != "unavailable" { + t.Fatal("DB falsely advertised as configured") + } + } + found := false + for _, effect := range body.Effects { + if effect.Opcode == "zabcam.assign-slot@1" { + found = true + } + if effect.Opcode == "core.animation.play@1" && !effect.Available { + t.Fatal("animation missing") + } + } + if !found { + t.Fatal("host extension omitted") + } +} diff --git a/internal/api/lane_commit.go b/internal/api/lane_commit.go new file mode 100644 index 00000000..57548cdb --- /dev/null +++ b/internal/api/lane_commit.go @@ -0,0 +1,117 @@ +package api + +import ( + "context" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/runtime" + "time" +) + +func NativeLaneCommitter(hub *lsdpreception.Hub, host *bluehost.Host, bridges *bluewire.Registry, preview *runtime.PreviewSlot) func(context.Context, lsdpreception.LaneCommit) lsdpreception.LaneCommitReceipt { + return func(parent context.Context, c lsdpreception.LaneCommit) lsdpreception.LaneCommitReceipt { + refuse := func(reason string) lsdpreception.LaneCommitReceipt { + return lsdpreception.LaneCommitReceipt{LaneCommit: c, Status: "refused", Reason: reason} + } + if !c.Valid() { + return refuse("LANE_COMMIT_INVALID") + } + if receipt, ok := hub.ReplayCommit(c); ok { + return receipt + } + ctx, cancel := context.WithTimeout(parent, 250*time.Millisecond) + defer cancel() + releaseP, err := host.AcquireSceneCommit(ctx, bluehost.SlotOnAir) + if err != nil { + return refuse("LANE_COMMIT_BUSY") + } + defer releaseP() + releaseV, err := host.AcquireSceneCommit(ctx, bluehost.SlotPreview) + if err != nil { + return refuse("LANE_COMMIT_BUSY") + } + defer releaseV() + finishBridge := bridges.PauseRoleSwap() + committed := false + defer func() { finishBridge(committed) }() + finishPreview, err := preview.StageRoleSwap(c.SceneID) + if err != nil { + return refuse(err.Error()) + } + defer func() { finishPreview(committed) }() + // A Hub replay must not swap the actors twice. Hub invokes its callback + // only for a new validated physical permutation. + receipt := hub.CommitRoles(c, func() error { + if err := host.SwapAuthority(); err != nil { + return err + } + committed = true + return nil + }) + return receipt + } +} + +func (c *SceneControl) commitLaneRoles(ctx context.Context, commit lsdpreception.LaneCommit, desired map[string]SceneSelection, observed map[string]any) (map[string]SceneSelection, bool) { + receipt := lsdpreception.LaneCommitReceipt{LaneCommit: commit, Status: "refused", Reason: "LANE_COMMIT_UNAVAILABLE"} + if c.opMu.TryLock() { + defer c.opMu.Unlock() + if c.deps.CommitLaneRoles != nil { + receipt = c.deps.CommitLaneRoles(ctx, commit) + } + } else { + receipt.Reason = "LANE_COMMIT_BUSY" + } + operations := []any{} + if receipt.Status == "committed" && !receipt.Replayed { + // Reconcile the logical selection, not a fresh admission. Both native + // observed slots move together with the receipt in one transaction. + desired = swapSelections(desired) + for role, source := range receipt.Sources { + stream := desired[role].StreamID + if stream == "" { + stream = "live" + } + desired[role] = SceneSelection{SceneID: source.SceneID, Version: source.ArtifactSet, StreamID: stream} + } + c.mu.Lock() + c.desired = desired + c.current = map[string]string{} + for role, selection := range desired { + c.current[role] = selectionKey(selection) + } + c.mu.Unlock() + operations = append(operations, map[string]any{"op": "add", "path": "/scene_control/defaults/desired", "value": desired}) + for _, pair := range []struct{ dst, src string }{{"program", "preview"}, {"preview", "program"}} { + value := observed[pair.src] + if source, ok := receipt.Sources[pair.dst]; ok { + value = map[string]any{"scene_id": source.SceneID, "scene_version": source.ArtifactSet, "source_version": source.SceneVersion, "status": "active", "take_command_id": commit.TakeCommandID} + } + operations = append(operations, map[string]any{"op": "add", "path": "/scene_control/defaults/observed/" + pair.dst, "value": value}) + } + } + operations = append(operations, map[string]any{"op": "add", "path": "/scene_control/defaults/observed/lane_commit", "value": receipt}) + ackCtx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + if err := c.reception.WriteLeaves(ackCtx, "orion/state", operations); err != nil { + c.log("lane commit observation unavailable", err) + } + if receipt.Status == "committed" { + if err := c.persist(); err != nil { + c.log("lane role selection persistence failed", err) + } + return desired, true + } + return desired, false +} +func swapSelections(desired map[string]SceneSelection) map[string]SceneSelection { + result := map[string]SceneSelection{} + if v, ok := desired["preview"]; ok { + result["program"] = v + } + if p, ok := desired["program"]; ok { + result["preview"] = p + } + return result +} diff --git a/internal/api/lane_commit_native_test.go b/internal/api/lane_commit_native_test.go new file mode 100644 index 00000000..3b6528d8 --- /dev/null +++ b/internal/api/lane_commit_native_test.go @@ -0,0 +1,266 @@ +package api + +import ( + "context" + "encoding/json" + "errors" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/protocol" + "github.com/ZabLaboratory/Orion/internal/runtime" + "log/slog" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "strings" + "testing" + "time" +) + +// The launcher owns a disposable native Rust receiver. Never point this test at +// the shared Prism node: all resources are explicitly synthetic fixtures. +func TestLaneCommitNative(t *testing.T) { + address := os.Getenv("ORION_TEST_PRIVATE_LANE_ADDRESS") + if address == "" { + t.Skip("requires private native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + r, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + if err = r.Check(ctx); err != nil || !r.PhysicalLanes.Load() { + t.Fatal("physical resources unavailable", err) + } + p := lsdpreception.NewProducer(ctx, r) + defer p.Close() + h := lsdpreception.NewHub(p, slog.Default()) + h.EnablePhysicalLanes() + source := func(id string) []byte { + return []byte(`{"lsml":"1.2","scene_id":"` + id + `","scene_version":"source-v1","layout":{"type":"text","text":{"$bind":"score"}},"defaults":{"score":0}}`) + } + program, preview := h.Lane("program"), h.Lane("preview") + program.MirrorForLSML("scene-a", "artifact-a", source("scene-a")) + b := preview.MirrorForLSML("scene-b", "artifact-b", source("scene-b")) + program.SetActive("scene-a") + preview.SetActive("scene-b") + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + aBefore, _ := r.Read(ctx, "solar/lane-a") + bBefore, _ := r.Read(ctx, "solar/lane-b") + host := bluehost.NewHost() + fixture, err := os.ReadFile("../bluespike/testdata/01-minimal.program.json") + if err != nil { + t.Fatal(err) + } + if err = host.Prepare(bluehost.SlotPreview, "actor-b", "scene-b", "digest-b", fixture, nil, nil, nil); err != nil { + t.Fatal(err) + } + if err = host.Take("actor-a", "scene-a", "digest-a", fixture, nil, nil, nil); err != nil { + t.Fatal(err) + } + _, _ = host.Step(bluehost.SlotPreview) + _, _ = host.Step(bluehost.SlotOnAir) + bridges := bluewire.NewRegistry() + defer bridges.StopAll() + previewSlot := runtime.NewPreviewSlot(ctx, runtime.NewComputeRegistry(), preview, slog.Default()) + previewSlot.SetEditableProgramWire(program) + defer previewSlot.Close() + d := NewSceneControlDocument() + aSel := SceneSelection{"scene-a", "artifact-a", "live"} + bSel := SceneSelection{"scene-b", "artifact-b", "live"} + d.Defaults.Desired = map[string]SceneSelection{"program": aSel, "preview": bSel} + d.Defaults.Observed = map[string]any{"program": map[string]any{"scene_id": "scene-a", "status": "active"}, "preview": map[string]any{"scene_id": "scene-b", "status": "active"}} + if err = r.WriteLeaf(ctx, "orion/state", "/scene_control", d); err != nil { + t.Fatal(err) + } + c := &SceneControl{deps: SceneIntentDeps{CommitLaneRoles: NativeLaneCommitter(h, host, bridges, previewSlot)}, reception: r, path: filepath.Join(t.TempDir(), "selection.lsml"), desired: d.Defaults.Desired, current: map[string]string{"program": selectionKey(aSel), "preview": selectionKey(bSel)}} + done := make(chan struct{}) + go func() { defer close(done); _ = c.Run(ctx) }() + defer func() { cancel(); <-done }() + commit := lsdpreception.LaneCommit{Schema: "orion.lane-commit.v1", RuntimeInstanceID: "private-native", PrepareCommandID: "prepare-1", TakeCommandID: "take-1", IntentID: "intent-1", FrameID: 12, PtsNs: 1234, ServerSeq: 4, PreviousRoleMap: lsdpreception.RoleMap{OnAir: "A", Preview: "B"}, RoleMap: lsdpreception.RoleMap{OnAir: "B", Preview: "A"}, PreviousRevisions: lsdpreception.LaneRevisions{Program: 0, Preview: 1, RoleMap: 0}, Revisions: lsdpreception.LaneRevisions{Program: 1, Preview: 1, RoleMap: 1}, SceneID: "scene-b", SceneVersion: "source-v1"} + if err = r.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/lane_commit", commit); err != nil { + t.Fatal(err) + } + await := func(take, status string) lsdpreception.LaneCommitReceipt { + for ctx.Err() == nil { + state, _ := r.Read(ctx, "orion/state") + root, _ := state.(map[string]any) + raw, _ := json.Marshal(root["scene_control"]) + var control SceneControlDocument + _ = json.Unmarshal(raw, &control) + raw, _ = json.Marshal(control.Defaults.Observed["lane_commit"]) + var receipt lsdpreception.LaneCommitReceipt + _ = json.Unmarshal(raw, &receipt) + if receipt.TakeCommandID == take && receipt.Status == status { + return receipt + } + time.Sleep(10 * time.Millisecond) + } + t.Fatal("receipt missing") + return lsdpreception.LaneCommitReceipt{} + } + firstReceipt := await("take-1", "committed") + if receipt := firstReceipt; receipt.Targets["program"] != "solar/lane-b" { + t.Fatal(receipt) + } + aAfter, _ := r.Read(ctx, "solar/lane-a") + bAfter, _ := r.Read(ctx, "solar/lane-b") + x, _ := json.Marshal(aBefore) + y, _ := json.Marshal(aAfter) + u, _ := json.Marshal(bBefore) + v, _ := json.Marshal(bAfter) + if string(x) != string(y) || string(u) != string(v) { + t.Fatal("native document changed at role commit") + } + if !host.Serving(bluehost.SlotOnAir, "scene-b", "digest-b") || !host.Serving(bluehost.SlotPreview, "scene-a", "digest-a") { + t.Fatal("Blue authority did not follow native roles") + } + c.mu.Lock() + if c.desired["program"] != bSel || c.current["program"] != selectionKey(bSel) { + t.Fatal("logical selections not reconciled") + } + c.mu.Unlock() + // A new Preview document and late output from the retained B actor remain on + // their respective physical resources after the permutation. + // The real editable API replaces the former Program Blue actor on Preview. + editable := map[string]any{"lsml": "1.2", "scene_id": "scene-c", "scene_version": "sha256:" + strings.Repeat("0", 64), "layout": map[string]any{"kind": "shape", "bind": map[string]any{"width": "__editable.width"}}, "defaults": map[string]any{"__editable.width": json.Number("10")}} + editableVersion, err := canonical.Digest(editable) + if err != nil { + t.Fatal(err) + } + editable["scene_version"] = editableVersion + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: slog.Default(), Config: config.Config{Profile: config.ProfileEmbeddedLocal}, Preview: previewSlot, SceneIntent: &SceneIntentDeps{Host: host, Bridges: bridges}, NativeLSDPFlush: p.Flush}) + opened := editableAPIRequest(t, mux, http.MethodPost, map[string]any{"scene_id": "scene-c", "scene_version": editableVersion, "render_mode": "source-only", "lsml_bundle": editable}, "operator") + if opened.Code != http.StatusOK || !host.Serving(bluehost.SlotPreview, "scene-c", editableVersion) { + t.Fatal("real editable admission failed", opened.Code, opened.Body.String()) + } + b.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: "score", Value: json.RawMessage(`42`)}}}) + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + state, _ := r.Read(ctx, "solar/lane-b") + doc := state.(map[string]any) + if doc["scene_id"] != "scene-b" || doc["defaults"].(map[string]any)["score"] != float64(42) { + t.Fatal("new Preview touched Program", doc) + } + cBefore, _ := r.Read(ctx, "solar/lane-a") + second := commit + second.PrepareCommandID = "prepare-2" + second.TakeCommandID = "take-2" + second.IntentID = "intent-2" + second.FrameID = 13 + second.PtsNs = 1235 + second.ServerSeq = 8 + second.PreviousRoleMap = commit.RoleMap + second.RoleMap = commit.PreviousRoleMap + second.PreviousRevisions = lsdpreception.LaneRevisions{Program: 1, Preview: 2, RoleMap: 1} + second.Revisions = lsdpreception.LaneRevisions{Program: 2, Preview: 2, RoleMap: 2} + second.SceneID = "scene-c" + second.SceneVersion = editableVersion + if err = r.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/lane_commit", second); err != nil { + t.Fatal(err) + } + receipt := await("take-2", "committed") + if receipt.Sources["program"].SceneID != "scene-c" || receipt.Sources["program"].SceneVersion != editableVersion || !host.Serving(bluehost.SlotOnAir, "scene-c", editableVersion) || !host.Serving(bluehost.SlotPreview, "scene-b", "digest-b") { + t.Fatal("Blue to editable role authority mismatch", receipt) + } + cAfter, _ := r.Read(ctx, "solar/lane-a") + x, _ = json.Marshal(cBefore) + y, _ = json.Marshal(cAfter) + if string(x) != string(y) { + t.Fatal("editable source changed at Take") + } + if _, err = host.Step(bluehost.SlotOnAir); !errors.Is(err, bluehost.ErrNotLoaded) { + t.Fatal("old Blue actor still executes on static Program", err) + } + // Continue the same author after Take on A, without a Solar feedback callback + // or sideband observer. Only the real Rust receiver's application ACK is used. + head, ok := previewSlot.EditableTargetHead("program") + if !ok || head.SceneID != "scene-c" { + t.Fatal("active author unavailable", head) + } + readRequest := httptest.NewRequest(http.MethodGet, "/api/v1/show/editable-preview/state?target=program&scene_id=scene-c", nil) + readRequest.Header.Set("X-Authenticated-User", "operator-1") + readRequest.Header.Set("X-Authenticated-Role", "operator") + readResponse := httptest.NewRecorder() + mux.ServeHTTP(readResponse, readRequest) + var readHead runtime.EditableHead + if readResponse.Code != http.StatusOK || json.Unmarshal(readResponse.Body.Bytes(), &readHead) != nil || readHead != head || readResponse.Header().Get("Cache-Control") != "no-store" { + t.Fatal("active read-back failed", readResponse.Body.String()) + } + patch := map[string]any{"target": "program", "scene_id": "scene-c", "writer_id": head.WriterID, "base_edit_seq": 0, "edit_seq": 1, "patches": []map[string]any{{"path": "__editable.width", "value": 32}}} + patched := editableAPIRequest(t, mux, http.MethodPut, patch, "operator") + if patched.Code != http.StatusAccepted { + t.Fatal("Program hot edit failed", patched.Code, patched.Body.String()) + } + aNow, _ := r.Read(ctx, "solar/lane-a") + bNow, _ := r.Read(ctx, "solar/lane-b") + if aNow.(map[string]any)["defaults"].(map[string]any)["__editable.width"] != float64(32) { + t.Fatal("Program patch did not reach native A", aNow) + } + readResponse = httptest.NewRecorder() + mux.ServeHTTP(readResponse, readRequest) + var readState struct { + EditSeq uint64 `json:"edit_seq"` + Defaults map[string]json.RawMessage `json:"defaults"` + } + if readResponse.Code != http.StatusOK || json.Unmarshal(readResponse.Body.Bytes(), &readState) != nil || readState.EditSeq != 1 || string(readState.Defaults["__editable.width"]) != "32" { + t.Fatal("active defaults do not match applied Program", readResponse.Body.String()) + } + bBaseline, _ := json.Marshal(bNow) + patch["target"] = "preview" + patch["base_edit_seq"] = 1 + patch["edit_seq"] = 2 + if refused := editableAPIRequest(t, mux, http.MethodPut, patch, "operator"); refused.Code != http.StatusConflict { + t.Fatal("old Preview writer accepted", refused.Body.String()) + } + patch["target"] = "program" + patch["writer_id"] = "retired-writer" + if refused := editableAPIRequest(t, mux, http.MethodPut, patch, "operator"); refused.Code != http.StatusConflict { + t.Fatal("retired writer accepted", refused.Body.String()) + } + // Structural replacement stays on current Program A and rotates the writer. + editable["defaults"].(map[string]any)["__editable.width"] = json.Number("64") + editable["scene_version"] = "sha256:" + strings.Repeat("0", 64) + newVersion, err := canonical.Digest(editable) + if err != nil { + t.Fatal(err) + } + editable["scene_version"] = newVersion + structure := map[string]any{"target": "program", "scene_id": "scene-c", "scene_version": newVersion, "writer_id": head.WriterID, "base_edit_seq": 1, "edit_seq": 2, "render_mode": "source-only", "lsml_bundle": editable} + if replaced := editableAPIRequest(t, mux, http.MethodPost, structure, "operator"); replaced.Code != http.StatusOK { + t.Fatal("Program structural edit failed", replaced.Code, replaced.Body.String()) + } + newHead, _ := previewSlot.EditableTargetHead("program") + if newHead.WriterID == head.WriterID || !host.Serving(bluehost.SlotOnAir, "scene-c", newVersion) || !host.Serving(bluehost.SlotPreview, "scene-b", "digest-b") { + t.Fatal("structural authority drift", newHead) + } + if refused := editableAPIRequest(t, mux, http.MethodPost, structure, "operator"); refused.Code != http.StatusConflict { + t.Fatal("old structural snapshot accepted", refused.Body.String()) + } + aNow, _ = r.Read(ctx, "solar/lane-a") + bNow, _ = r.Read(ctx, "solar/lane-b") + bFinal, _ := json.Marshal(bNow) + if aNow.(map[string]any)["defaults"].(map[string]any)["__editable.width"] != float64(64) || string(bFinal) != string(bBaseline) { + t.Fatal("structural Program modified Preview", aNow, bNow) + } + commit.TakeCommandID = "take-foreign" + commit.RuntimeInstanceID = "foreign" + if err = r.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/lane_commit", commit); err != nil { + t.Fatal(err) + } + if receipt := await("take-foreign", "refused"); receipt.Reason != "LANE_COMMIT_FOREIGN_RUNTIME" { + t.Fatal(receipt) + } + proof, _ := json.Marshal(map[string]any{"first_receipt": firstReceipt, "mixed_receipt": receipt, "documents_identical_at_both_commits": true, "program_delta_isolated": true, "static_program_old_blue_stopped": true, "active_author_readback": true, "program_hot_edit_native": true, "program_structural_edit_native": true, "stale_writers_refused": true, "preview_unchanged": true, "solar_feedback_or_sideband_required": false}) + t.Log(string(proof)) + t.Log("private native receipt, desired/current reconciliation, unchanged documents, retained Program deltas, real Blue-to-editable API/source receipt and foreign-runtime refusal passed") +} diff --git a/internal/api/native_delivery.go b/internal/api/native_delivery.go new file mode 100644 index 00000000..6aab5cb4 --- /dev/null +++ b/internal/api/native_delivery.go @@ -0,0 +1,23 @@ +package api + +import ( + "context" + "time" +) + +// Success on a native-backed operator route means application by the receiver. +// Editable inputs first cross the scene inbox; flushing only the producer +// would otherwise overtake the scene goroutine and acknowledge stale state. +func flushNativeDelivery(ctx context.Context, deps PublicDeps, preview bool) error { + if deps.NativeLSDPFlush == nil { + return nil + } + ctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + if preview && deps.Preview != nil { + if err := deps.Preview.Flush(ctx); err != nil { + return err + } + } + return deps.NativeLSDPFlush(ctx) +} diff --git a/internal/api/native_delivery_test.go b/internal/api/native_delivery_test.go new file mode 100644 index 00000000..93a5d915 --- /dev/null +++ b/internal/api/native_delivery_test.go @@ -0,0 +1,91 @@ +package api + +import ( + "context" + "encoding/json" + "errors" + "io" + "log/slog" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/blueproject" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/compiler" + "github.com/ZabLaboratory/Orion/internal/obs" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +func TestNativeOperatorCallWaitsForPublicationAndRejectsACKFailure(t *testing.T) { + host := bluehost.NewHost() + if err := loadEngineBSlot(host, bluehost.SlotOnAir, buildEngineBOperatorProgram(t, "LEC", "called", "", "", "")); err != nil { + t.Fatal(err) + } + defer func() { + if err := host.Release(bluehost.SlotOnAir, "test-end"); err != nil { + t.Error(err) + } + }() + mirror := &recordingMirror{} + bridges := bluewire.NewRegistry() + bridges.Start(bluehost.SlotOnAir, bluewire.NewBridge(host, bluehost.SlotOnAir, mirror, "scene-1", "sha256:scene", "instance-1", blueproject.TargetProgram, "revision-1", "intent-1"), time.Hour, nil) + defer bridges.StopAll() + show := runtime.NewShow(runtime.NewComputeRegistry(), testLogger()) + defer show.Stop() + flushed := false + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: testLogger(), Metrics: obs.NewMetrics(), Show: show, + SceneIntent: &SceneIntentDeps{Host: host, Bridges: bridges}, + NativeLSDPFlush: func(context.Context) error { + flushed = true + if mirror.count() != 1 { + t.Fatal("receiver barrier overtook the operator result") + } + return errors.New("receiver unavailable") + }, + }) + response := opRequest(t, mux, "POST", "/api/v1/operator/call/_/LEC", "operator", map[string]any{"payload": "native-lec"}) + if !flushed || response.Code != http.StatusServiceUnavailable { + t.Fatalf("false operator acknowledgement: %d %s; flushed=%v", response.Code, response.Body.String(), flushed) + } +} + +func TestNativeEditableACKWaitsForScenePublication(t *testing.T) { + preview := runtime.NewPreviewSlot(context.Background(), runtime.NewComputeRegistry(), &editableAPIWire{}, slog.New(slog.NewTextHandler(io.Discard, nil))) + defer preview.Close() + preview.ActivateEditableWithBundle("editable", &compiler.Graph{SceneID: "editable", SceneVersion: "v1", Defaults: map[string]json.RawMessage{"__editable.node.x": json.RawMessage(`10`)}}, &compiler.RenderBundle{}, 0, []byte(`{}`)) + called := false + deps := PublicDeps{Preview: preview, NativeLSDPFlush: func(context.Context) error { + _, _, state, ok := preview.SnapshotState() + if !ok || string(state["__editable.node.x"]) != "42" { + t.Fatal("native producer flushed before the scene applied the input") + } + called = true + return errors.New("receiver unavailable") + }} + var body editablePreviewPatchRequest + if err := json.Unmarshal([]byte(`{"scene_id":"editable","base_edit_seq":0,"edit_seq":1,"patches":[{"path":"__editable.node.x","value":42}]}`), &body); err != nil { + t.Fatal(err) + } + status, code, err := applyEditablePreviewPatch(context.Background(), deps, body) + if !called || err == nil || status != http.StatusServiceUnavailable || code != "NATIVE_LSDP_DELIVERY_FAILED" { + t.Fatalf("false acknowledgement: %d %s %v; flushed=%v", status, code, err, called) + } +} + +func TestNativeCameraACKFailureIsVisible(t *testing.T) { + probe := &cameraSlotAssignerProbe{} + rec := httptest.NewRecorder() + postCameraSlots(probe, func(context.Context) error { + if probe.assignments["slot"] != "peer" { + t.Fatal("native flush overtook durable camera assignment") + } + return errors.New("receiver unavailable") + })(rec, cameraSlotRequest(`{"assignments":[{"slot_ref":"slot","peer_label":"peer"}]}`, "operator")) + if rec.Code != http.StatusServiceUnavailable { + t.Fatalf("camera delivery failure acknowledged: %d %s", rec.Code, rec.Body.String()) + } +} diff --git a/internal/api/native_operator_visual_test.go b/internal/api/native_operator_visual_test.go new file mode 100644 index 00000000..172fb64b --- /dev/null +++ b/internal/api/native_operator_visual_test.go @@ -0,0 +1,150 @@ +package api + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "os" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/blueproject" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/effects" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/obs" + "github.com/ZabLaboratory/Orion/internal/runtime" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +// Driven by the offline CEF observer. Published program bytes stay unchanged; +// its actual read-only database effects use an authenticated test gateway. +func TestRealNativeOperatorVisual(t *testing.T) { + phase := os.Getenv("ORION_TEST_OPERATOR_PHASE") + if phase == "" { + t.Skip("requires the native CEF operator proof") + } + if phase != "LEC" && phase != "LCK" { + t.Fatal("unknown operator phase") + } + address, sourcePath, gateway := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), os.Getenv("ORION_TEST_LSML_PATH"), os.Getenv("ORION_TEST_QUERY_GATEWAY") + if gateway == "" { + t.Fatal("authenticated read gateway required") + } + source, err := os.ReadFile(sourcePath) + if err != nil { + t.Fatal(err) + } + var original map[string]any + if err = json.Unmarshal(source, &original); err != nil { + t.Fatal(err) + } + id, version := original["scene_id"].(string), original["scene_version"].(string) + key := lsdpreception.GenerationKey(id, version) + program, err := os.ReadFile("testdata/scene-lec-lck.program.json") + if err != nil { + t.Fatal(err) + } + checksum := sha256.Sum256(program) + if hex.EncodeToString(checksum[:]) != "9754a0b16acbaa5f061e9b45189b9a21443deb97ed37449d277b339f77a2b7b3" { + t.Fatal("published Blue program bytes changed") + } + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + producer := lsdpreception.NewProducer(ctx, reception) + defer producer.Close() + hub := lsdpreception.NewHub(producer, testLogger()) + mirror := hub.MirrorForLSML(id, version, "on-air", source) + digest := "sha256:ca2f21db4459f616c0f996fb7c03b3cf61e2a81d48bbc870d671f8fbda327bfc" + instance := "cef-operator-" + phase + host := bluehost.NewHost() + handlers := bluehost.NewEffectHandlers(bluehost.EffectDeps{ + DB: effects.NewDBQueryClient(gateway, "", &http.Client{Timeout: 12 * time.Second}), + DataSources: map[string]effects.DataSource{"truth": {Name: "truth", Svc: "truth"}, "ranking": {Name: "ranking", Svc: "ranking"}}, + }, "execute") + if err = host.Take(instance, id, digest, program, nil, nil, handlers); err != nil { + t.Fatal(err) + } + defer func() { + if err := host.Release(bluehost.SlotOnAir, "visual-test-end"); err != nil { + t.Error(err) + } + }() + bridges := bluewire.NewRegistry() + bridge := bluewire.NewBridge(host, bluehost.SlotOnAir, mirror, id, digest, instance, blueproject.TargetProgram, "local-source-only", "cef-operator-native") + bridge.SetLogger(testLogger()) + bridges.Start(bluehost.SlotOnAir, bridge, time.Hour, nil) + defer bridges.StopAll() + show := runtime.NewShow(runtime.NewComputeRegistry(), testLogger()) + defer show.Stop() + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: testLogger(), Metrics: obs.NewMetrics(), Show: show, NativeLSDPFlush: producer.Flush, SceneIntent: &SceneIntentDeps{Host: host, Bridges: bridges}}) + server := httptest.NewServer(mux) + defer server.Close() + path := "/api/v1/operator/call/20d8ceaa-5766-4492-be94-8c58099519dc/" + phase + request, _ := http.NewRequestWithContext(ctx, "POST", server.URL+path, bytes.NewBufferString(`{"payload":null}`)) + request.Header.Set("Content-Type", "application/json") + request.Header.Set("X-Authenticated-Role", "operator") + request.Header.Set("X-Authenticated-User", "native-visual-operator") + response, err := server.Client().Do(request) + if err != nil { + t.Fatal(err) + } + body, _ := io.ReadAll(response.Body) + response.Body.Close() + if response.StatusCode != http.StatusAccepted { + t.Fatalf("operator %s: %d %s", phase, response.StatusCode, body) + } + client, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer client.Close() + raw, err := client.Exchange(ctx, map[string]any{"kind": "state.read", "target": "solar/generations"}) + if err != nil { + t.Fatal(err) + } + var snapshot struct { + State map[string]map[string]any + StateHash string + } + if err = json.Unmarshal(raw, &snapshot); err != nil { + t.Fatal(err) + } + doc := snapshot.State[key] + if doc == nil { + t.Fatal("operator generation missing") + } + defaults := doc["defaults"].(map[string]any) + names := map[string]any{} + for _, side := range []string{"L", "R"} { + for index := 0; index < 5; index++ { + prefix := "pl." + side + string(rune('0'+index)) + name, _ := defaults[prefix+".name"].(string) + champion, _ := defaults[prefix+".champ"].(string) + if name == "" || name == "�" || champion == "" { + t.Fatalf("actual match output missing at %s: name=%q champion=%q", prefix, name, champion) + } + names[prefix+".name"] = name + } + } + if doc["x-orion"].(map[string]any)["runtime_instance_id"] != instance { + t.Fatal("operator native provenance missing") + } + unchanged, err := os.ReadFile(sourcePath) + if err != nil || !bytes.Equal(source, unchanged) { + t.Fatal("original LSML was modified") + } + report, _ := json.Marshal(map[string]any{"entrypoint": phase, "path": path, "status": response.StatusCode, "nativeApplicationACK": true, "programDigest": digest, "programBytesSHA256": hex.EncodeToString(checksum[:]), "generation": key, "names": names, "originalLSMLUnchanged": true}) + t.Log("REAL_OPERATOR_NATIVE_PROOF " + string(report)) +} diff --git a/internal/api/native_reception_proof_test.go b/internal/api/native_reception_proof_test.go new file mode 100644 index 00000000..43f558a3 --- /dev/null +++ b/internal/api/native_reception_proof_test.go @@ -0,0 +1,32 @@ +package api + +import ( + "context" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/runtime" + "log/slog" + "net/http" + "net/http/httptest" + "testing" +) + +func TestReadyReportsExactSharedNative(t *testing.T) { + show := runtime.NewShow(runtime.NewComputeRegistry(), slog.Default()) + defer show.Stop() + response := httptest.NewRecorder() + deps := PublicDeps{Show: show, Config: config.Config{NativeLSDPAddress: "127.0.0.1:4520", NativeLSDPResource: "orion/state"}, NativeLSDPCheck: func(context.Context) error { return nil }} + ready(deps)(response, httptest.NewRequest(http.MethodGet, "/ready", nil)) + var result struct { + Native struct { + Ready bool + Wire, Address, Resource string + } `json:"native_lsdp"` + } + if err := json.Unmarshal(response.Body.Bytes(), &result); err != nil { + t.Fatal(err) + } + if response.Code != http.StatusOK || !result.Native.Ready || result.Native.Address != "127.0.0.1:4520" || result.Native.Resource != "orion/state" || result.Native.Wire != "LSDP-TCP/2.0-draft2" { + t.Fatalf("native proof missing: %s", response.Body.String()) + } +} diff --git a/internal/api/native_reception_ready_test.go b/internal/api/native_reception_ready_test.go new file mode 100644 index 00000000..9debb5f5 --- /dev/null +++ b/internal/api/native_reception_ready_test.go @@ -0,0 +1,18 @@ +package api + +import ( + "context" + "errors" + "net/http" + "net/http/httptest" + "testing" +) + +func TestReadyRejectsLostNativeReception(t *testing.T) { + called := false + response := httptest.NewRecorder() + ready(PublicDeps{NativeLSDPCheck: func(context.Context) error { called = true; return errors.New("connection refused") }})(response, httptest.NewRequest(http.MethodGet, "/ready", nil)) + if !called || response.Code != http.StatusServiceUnavailable { + t.Fatalf("called=%v code=%d", called, response.Code) + } +} diff --git a/internal/api/native_scene_presentation.go b/internal/api/native_scene_presentation.go new file mode 100644 index 00000000..1cf379bf --- /dev/null +++ b/internal/api/native_scene_presentation.go @@ -0,0 +1,152 @@ +package api + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "strings" + "time" +) + +type nativeScenePresentation struct { + reception *lsdpreception.Reception + lane, target, id, sceneID, version string + previous any + source map[string]any + timings map[string]time.Duration +} + +func (p *nativeScenePresentation) PresentationTimings() map[string]time.Duration { + return p.timings +} + +func NativeScenePresenter(reception *lsdpreception.Reception, sourceFor func(bluehost.Slot, string, string, []byte) (map[string]any, error), targetFor ...func(bluehost.Slot) string) ScenePresenter { + return func(ctx context.Context, slot bluehost.Slot, id, sceneID, version string, source []byte) (ScenePresentation, error) { + lane := "preview" + if slot == bluehost.SlotOnAir { + lane = "program" + } + if id == "" || len(id) > 128 || strings.ContainsAny(id, "/\\ .") { + return nil, errors.New("SOLAR_REQUEST_ID_INVALID") + } + document, err := sourceFor(slot, sceneID, version, source) + if err != nil { + return nil, err + } + sourceVersion, ok := document["scene_version"].(string) + if !ok || sourceVersion == "" || document["scene_id"] != sceneID { + return nil, errors.New("SOLAR_SOURCE_IDENTITY_INVALID") + } + started := time.Now() + target := "solar/" + lane + if len(targetFor) > 0 { + target = targetFor[0](slot) + } + previous, err := reception.Read(ctx, target) + if err != nil { + return nil, err + } + presentation := &nativeScenePresentation{reception: reception, lane: lane, target: target, id: id, sceneID: sceneID, version: sourceVersion, previous: previous, source: document, + timings: map[string]time.Duration{"solarread": time.Since(started)}} + return presentation, presentation.phase(ctx, "prepare", "prepared") + } +} +func (p *nativeScenePresentation) phase(parent context.Context, phase, expected string) error { + ctx, cancel := context.WithTimeout(parent, 15*time.Second) + defer cancel() + base := p.previous + if base == nil || phase == "commit" || phase == "finalize" { + base = p.source + } + raw, err := json.Marshal(base) + if err != nil { + return err + } + var document map[string]any + if err = json.Unmarshal(raw, &document); err != nil { + return err + } + transition := map[string]any{"request_id": p.id, "phase": phase, "lane": p.lane} + // Only prepare needs two sources: the accepted frame and its hidden candidate. + // Commit/finalize carry the candidate once at the resource root, which also + // permits a fresh renderer to reconstruct that authoritative stage. + if phase == "prepare" { + transition["source"] = p.source + } + document["x-solar-transition"] = transition + // Watch accepted state before publishing: no interval quantization, polling + // connections or lost fast feedback. Reception owns integrity and resync. + outcome := make(chan error, 1) + done := make(chan struct{}) + go func() { + defer close(done) + p.reception.Watch(ctx, "orion/state", func(state any) { + matched, err := presentationAcknowledgment(state, p.lane, p.id, phase, expected, p.sceneID, p.version) + if matched { + select { + case outcome <- err: + default: + } + } + }, func(error) { /* Watch rereads and reconnects within the phase deadline. */ }) + }() + defer func() { cancel(); <-done }() + started := time.Now() + if err = p.reception.Replace(ctx, p.target, document); err != nil { + return err + } + p.timings["solar"+phase+"replace"] += time.Since(started) + started = time.Now() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for { + select { + case err := <-outcome: + p.timings["solar"+phase+"wait"] += time.Since(started) + return err + case <-ctx.Done(): + return fmt.Errorf("SOLAR_ACK_%s: %w", expected, ctx.Err()) + case <-ticker.C: + // Reassert only the absolute phase after a receiver restart. Blue + // execution and relative mutations are never replayed here. + if err := p.reception.Replace(ctx, p.target, document); err != nil { + return err + } + } + } +} + +func presentationAcknowledgment(state any, lane, id, phase, expected, sceneID, version string) (bool, error) { + root, _ := state.(map[string]any) + ack, _ := root["solar_presentation_"+lane].(map[string]any) + if ack["request_id"] != id { + return false, nil + } + if ack["phase"] == "failed" && ack["transition_phase"] == phase { + return true, fmt.Errorf("SOLAR_PRESENTATION_REJECTED: %v", ack["error"]) + } + return ack["phase"] == expected && (expected == "aborted" || ack["scene_id"] == sceneID && ack["scene_version"] == version), nil +} +func (p *nativeScenePresentation) Commit(ctx context.Context) error { + return p.phase(ctx, "commit", "committed") +} +func (p *nativeScenePresentation) Finalize(ctx context.Context) error { + if err := p.phase(ctx, "finalize", "active"); err != nil { + return err + } + // Removing metadata releases Solar's retained compensation frame. Do not + // open the Blue gate until that absolute assignment has been accepted. + started := time.Now() + err := p.reception.Replace(ctx, p.target, p.source) + p.timings["solarcleanup"] += time.Since(started) + return err +} +func (p *nativeScenePresentation) Abort(ctx context.Context) error { + if err := p.phase(ctx, "abort", "aborted"); err != nil { + return err + } + return p.reception.Replace(ctx, p.target, p.previous) +} diff --git a/internal/api/native_scene_presentation_test.go b/internal/api/native_scene_presentation_test.go new file mode 100644 index 00000000..2b98dfa4 --- /dev/null +++ b/internal/api/native_scene_presentation_test.go @@ -0,0 +1,41 @@ +package api + +import "testing" + +func TestNativePresentationAcknowledgment(t *testing.T) { + accepted := map[string]any{"request_id": "request", "phase": "committed", "scene_id": "scene", "scene_version": "version"} + for _, tc := range []struct { + name, lane, field string + value any + matched, failed bool + }{ + {name: "matching", lane: "preview", matched: true}, + {name: "other request", lane: "preview", field: "request_id", value: "other"}, + {name: "other scene", lane: "preview", field: "scene_id", value: "other"}, + {name: "other version", lane: "preview", field: "scene_version", value: "other"}, + {name: "other phase", lane: "preview", field: "phase", value: "prepared"}, + {name: "other lane", lane: "program"}, + } { + t.Run(tc.name, func(t *testing.T) { + ack := map[string]any{} + for key, value := range accepted { + ack[key] = value + } + if tc.field != "" { + ack[tc.field] = tc.value + } + matched, err := presentationAcknowledgment(map[string]any{"solar_presentation_preview": ack}, tc.lane, "request", "commit", "committed", "scene", "version") + if matched != tc.matched || (err != nil) != tc.failed { + t.Fatalf("matched=%v error=%v", matched, err) + } + }) + } + failed := map[string]any{"request_id": "request", "phase": "failed", "transition_phase": "prepare", "error": "rejected"} + state := map[string]any{"solar_presentation_preview": failed} + if matched, err := presentationAcknowledgment(state, "preview", "request", "commit", "committed", "scene", "version"); matched || err != nil { + t.Fatal("stale phase failure was accepted") + } + if matched, err := presentationAcknowledgment(state, "preview", "request", "prepare", "prepared", "scene", "version"); !matched || err == nil { + t.Fatal("matching rejection was ignored") + } +} diff --git a/internal/api/native_session_test.go b/internal/api/native_session_test.go new file mode 100644 index 00000000..11df43f3 --- /dev/null +++ b/internal/api/native_session_test.go @@ -0,0 +1,54 @@ +package api + +import ( + "context" + "io" + "log/slog" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/compiler" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +func TestNativeSessionLeaseAndCloseAreOperatorGated(t *testing.T) { + manager := runtime.NewTestSessionManager(runtime.NewComputeRegistry(), slog.New(slog.NewTextHandler(io.Discard, nil)), time.Minute) + defer manager.Close() + id, _ := manager.Open(context.Background(), "scene", &compiler.Graph{SceneVersion: "v1"}, &compiler.RenderBundle{}) + flushed := false + deps := PublicDeps{Test: manager, NativeLSDPFlush: func(context.Context) error { flushed = true; return nil }} + request := func(role string) *http.Request { + r := httptest.NewRequest(http.MethodPost, "/api/v1/show/test-sessions/"+id+"/lease", nil) + r.SetPathValue("session", id) + r.Header.Set("X-Authenticated-User", "operator") + r.Header.Set("X-Authenticated-Role", role) + return r + } + rec := httptest.NewRecorder() + renewNativeTestSession(deps)(rec, request("viewer")) + if rec.Code != http.StatusForbidden { + t.Fatal("viewer renewed operator test lease", rec.Code) + } + rec = httptest.NewRecorder() + renewNativeTestSession(deps)(rec, request("operator")) + if rec.Code != http.StatusOK { + t.Fatal("lease renewal failed", rec.Code) + } + rec = httptest.NewRecorder() + closeNativeTestSession(deps)(rec, request("viewer")) + if rec.Code != http.StatusForbidden || flushed { + t.Fatal("viewer closed operator test session") + } + rec = httptest.NewRecorder() + closeNativeTestSession(deps)(rec, request("operator")) + if rec.Code != http.StatusNoContent || !flushed { + t.Fatal("close was not acknowledged") + } + rec = httptest.NewRecorder() + renewNativeTestSession(deps)(rec, request("operator")) + if rec.Code != http.StatusGone { + t.Fatal("closed session revived") + } +} diff --git a/internal/api/operator.go b/internal/api/operator.go index c924c02c..1e6e27b6 100644 --- a/internal/api/operator.go +++ b/internal/api/operator.go @@ -3,11 +3,11 @@ package api import ( "encoding/json" "errors" + "fmt" "io" "log/slog" "net/http" - "sort" - "strings" + "time" blueruntime "github.com/ZabLaboratory/Blue/runtime/go" @@ -25,12 +25,9 @@ import ( // a value INTO a running graph at the antenna, never a read-only surface // (the pending listing is operator-only too: it reveals the live UI prompts). // -// ACTIVE-ONLY (ADR 008 invariant): all three operate against the live -// antenna ONLY. A blueprint that is not part of the active scene is -// dormant — its entrypoints cannot be called and its awaits do not exist — -// answered 409 (call) / 410 (resolve) / empty (pending). This matches ADR -// Orion 008: only the active scene executes, so only its operator surface -// is live. +// ACTIVE-ONLY: scene gestures address the selected Preview/Program slot; +// rule gestures address an enabled global rule. Dormant entrypoints fail +// closed (409 call, 410 resolve, empty pending list). // // ENGINE B (ORION-OPERATOR-RAIL-ENGINE-B #335, extended by // ORION-OPERATOR-PREVIEW-ENGINE-B): all three routes now target @@ -45,9 +42,8 @@ import ( // not PreviewSlot. Routing target=preview through Engine A therefore read a // slot nothing filled: every preview operator gesture 409/410'd // (BLUEPRINT_NOT_ACTIVE / AWAIT_GONE) even with a scene genuinely prepared -// in preview. Only ?rule= (a stream-level rule selector) still resolves -// through Show (Engine A) — see isEngineBRouted's doc for why that one -// selector does not move. +// in preview. Rule selectors address the independent Engine B RulePlane +// when configured; legacy Show-backed fixtures retain compatibility. // // PreviewSlot/deps.Preview and POST /show/preview-active-scene are left in // place by this change (not this work unit's call to retire — a possible @@ -169,26 +165,9 @@ func resolveOperatorScene(w http.ResponseWriter, deps PublicDeps, r *http.Reques return scene, true } -// isEngineBRouted reports whether r has no stream-rule selector — the only -// case that decides Engine A vs Engine B for call/resolve/pending. Both the -// antenna (no ?target, or any value but "preview") and the cockpit preview -// (?target=preview) now route through Engine B (bluehost.Host) — see -// engineBSlot for which slot. Only ?rule={rule_id} stays on Engine A -// (runtime.Scene, resolveOperatorScene's Show.StreamRuleScene lookup): -// stream-level rules capacity is paused (#15/#331: HTTP surface + handlers -// removed with internal/store) and its successor — composing a rule INTO -// the program a flow serves — is tracked but not yet built (Orion#332 R6 -// ledger + ZabCanvas durability). Engine B has no rule concept to route to -// today, so leaving ?rule= on Engine A's (structurally empty in prod) -// registry is the coherent choice: it degrades to a deterministic 409 -// RULE_NOT_ACTIVE, exactly the "no caller regression" posture public.go's -// route-registration comment already documents, without inventing a new -// slot/state on the Engine B side. -// -// ?rule and ?target=preview remain mutually exclusive (resolveOperatorScene -// writes 400 SELECTOR_CONFLICT) — unchanged by this function's widened -// scope, since a non-empty ?rule always short-circuits here regardless of -// ?target. +// isEngineBRouted selects the scene Host after the RulePlane branch has +// priority. Program and Preview use independent native slots. A rule selector +// never falls through to a scene; unconfigured legacy callers resolve via Show. func isEngineBRouted(r *http.Request) bool { return r.URL.Query().Get("rule") == "" } @@ -230,10 +209,8 @@ const ( // This function only recognizes the two kinds; it does not decide which // engine or slot serves them — engineBSlot maps a validated kind to the // bluehost.Host slot for the three Engine-B routes (call/resolve/pending); -// getCockpitContracts maps the same kind to its own two engines (its -// ?target=preview leg is still Engine A, deps.Preview — see that function's -// doc for why that is dead code in production today and deliberately out of -// this work unit's scope to re-route). +// getCockpitContracts maps the same kind to the same Host slots. Legacy +// Preview is consulted only when the native Host is absent. func resolveTargetKind(w http.ResponseWriter, r *http.Request) (targetKind, bool) { switch r.URL.Query().Get("target") { case "": @@ -347,11 +324,16 @@ func postOperatorCallRule(w http.ResponseWriter, r *http.Request, deps PublicDep if !ok { return } - if _, err := plane.Call(ruleID, entrypointID, payload); err != nil { - writeOperatorError(w, http.StatusInternalServerError, "INTERNAL", "stream rule call failed") + result, err := plane.Call(ruleID, entrypointID, payload) + if err != nil { + writeOperatorExecutionError(w, err, "stream rule call failed") + return + } + if err := flushNativeDelivery(r.Context(), deps, false); err != nil { + writeOperatorError(w, http.StatusServiceUnavailable, "NATIVE_DELIVERY_FAILED", "stream rule effects were not acknowledged by the native receiver") return } - writeJSON(w, http.StatusAccepted, map[string]string{"status": "fired"}) + writeOperatorExecution(w, http.StatusAccepted, "fired", result) } func postOperatorResolveRule(w http.ResponseWriter, deps PublicDeps, r *http.Request, blueprintID, awaitName string, rawValue json.RawMessage) { @@ -367,16 +349,20 @@ func postOperatorResolveRule(w http.ResponseWriter, deps PublicDeps, r *http.Req if !ok { return } - _, err := plane.Resolve(ruleID, awaitName, value) + result, err := plane.Resolve(ruleID, awaitName, value) switch { case err == nil: - writeJSON(w, http.StatusOK, map[string]string{"status": "resolved"}) + if err := flushNativeDelivery(r.Context(), deps, false); err != nil { + writeOperatorError(w, http.StatusServiceUnavailable, "NATIVE_DELIVERY_FAILED", "stream rule effects were not acknowledged by the native receiver") + return + } + writeOperatorExecution(w, http.StatusOK, "resolved", result) case isBlueRuntimeCode(err, "AWAIT_TYPE_MISMATCH"): writeOperatorError(w, http.StatusUnprocessableEntity, "VALUE_TYPE_MISMATCH", "value does not match the await's value_type") case isBlueRuntimeCode(err, "EVENT_MALFORMED"), errors.Is(err, bluehost.ErrRuleNotActive): writeOperatorError(w, http.StatusGone, "AWAIT_GONE", "no live await by that name (already resolved or invalidated)") default: - writeOperatorError(w, http.StatusInternalServerError, "INTERNAL", "resolve failed") + writeOperatorExecutionError(w, err, "resolve failed") } } @@ -483,6 +469,13 @@ func postOperatorCallEngineB(w http.ResponseWriter, r *http.Request, deps Public "blueprint is not part of the active scene") return } + release, err := host.AcquireSceneCommit(r.Context(), slot) + if err != nil { + writeOperatorError(w, http.StatusConflict, "SCENE_CHANGING", "scene role is changing") + return + } + defer release() + if !host.HasTrigger(slot, entrypointID) { writeOperatorError(w, http.StatusConflict, "ENTRYPOINT_UNKNOWN", "no on-call entrypoint by that id on the active blueprint") @@ -497,47 +490,50 @@ func postOperatorCallEngineB(w http.ResponseWriter, r *http.Request, deps Public if !ok { return } + started := time.Now() result, err := host.Call(slot, entrypointID, payload) + w.Header().Add("Server-Timing", fmt.Sprintf("bluecall;dur=%.3f", float64(time.Since(started).Microseconds())/1000)) if err != nil { - writeOperatorError(w, http.StatusInternalServerError, "INTERNAL", "call failed") + writeOperatorExecutionError(w, err, "call failed") return } if deps.Logger != nil { - outputKeys := make([]string, 0, len(result.Outputs)) - outputSample := make(map[string]any) - for key := range result.Outputs { - outputKeys = append(outputKeys, key) - if strings.HasSuffix(key, ".champ") || strings.HasSuffix(key, ".name") { - outputSample[key] = result.Outputs[key] - } - } - sort.Strings(outputKeys) - deps.Logger.Info("engine b operator call completed", + deps.Logger.Info("engine b operator dispatch returned", "slot", slot, "entrypoint_id", entrypointID, "runtime_sequence", result.RuntimeSequence, "output_count", len(result.Outputs), - "output_keys", outputKeys, - "output_sample", outputSample, "variable_count", len(result.Variables), "invocation_count", len(result.Invocations), ) } // The production stateless path owns a bridge for every scene slot. A - // direct forward is required here: the runtime result contains the LSML - // mutations caused by LEC, while the periodic bridge tick may have no + // direct forward is required here: the runtime result contains immediate + // scene outputs, while the periodic bridge tick may have no // output to repeat. Keep old no-wire fixtures compatible, but never report // success when the production bridge exists and cannot project the result. + started = time.Now() + if !forwardOperatorResult(w, r, deps, slot, bluewire.StepResult{RuntimeSequence: result.RuntimeSequence, Outputs: result.Outputs}) { + return + } + w.Header().Add("Server-Timing", fmt.Sprintf("blueforward;dur=%.3f", float64(time.Since(started).Microseconds())/1000)) + writeOperatorExecution(w, http.StatusAccepted, "fired", result) +} + +// Calls and resolved awaits both return immediate outputs that a later tick +// need not repeat. Publish those outputs before acknowledging either action. +func forwardOperatorResult(w http.ResponseWriter, r *http.Request, deps PublicDeps, slot bluehost.Slot, result bluewire.StepResult) bool { if deps.SceneIntent != nil && deps.SceneIntent.Bridges != nil { - if err := deps.SceneIntent.Bridges.Forward(slot, bluewire.StepResult{ - RuntimeSequence: result.RuntimeSequence, - Outputs: result.Outputs, - }); err != nil { + if err := deps.SceneIntent.Bridges.Forward(slot, result); err != nil { writeOperatorError(w, http.StatusServiceUnavailable, "PROJECTION_FAILED", err.Error()) - return + return false } } - writeJSON(w, http.StatusAccepted, map[string]string{"status": "fired"}) + if err := flushNativeDelivery(r.Context(), deps, false); err != nil { + writeOperatorError(w, http.StatusServiceUnavailable, "NATIVE_LSDP_DELIVERY_FAILED", err.Error()) + return false + } + return true } // postOperatorResolveEngineB serves the Engine B leg of POST @@ -550,7 +546,7 @@ func postOperatorCallEngineB(w http.ResponseWriter, r *http.Request, deps Public // (runtime.go: "Resolving an unparked/already-resolved name is reported, // not silently dropped" — EVENT_MALFORMED) — no pre-check equivalent to // HasTrigger is needed here. -func postOperatorResolveEngineB(w http.ResponseWriter, deps PublicDeps, slot bluehost.Slot, awaitName string, rawValue json.RawMessage) { +func postOperatorResolveEngineB(w http.ResponseWriter, r *http.Request, deps PublicDeps, slot bluehost.Slot, awaitName string, rawValue json.RawMessage) { host := engineBHost(deps) live := host != nil && host.Digest(slot) != "" if !live { @@ -558,14 +554,24 @@ func postOperatorResolveEngineB(w http.ResponseWriter, deps PublicDeps, slot blu "no live await for this blueprint (inactive or invalidated)") return } + release, err := host.AcquireSceneCommit(r.Context(), slot) + if err != nil { + writeOperatorError(w, http.StatusConflict, "SCENE_CHANGING", "scene role is changing") + return + } + defer release() + value, ok := decodeOperatorPayload(w, rawValue) if !ok { return } - _, err := host.Resolve(slot, awaitName, value) + result, err := host.Resolve(slot, awaitName, value) switch { case err == nil: - writeJSON(w, http.StatusOK, map[string]string{"status": "resolved"}) + if !forwardOperatorResult(w, r, deps, slot, bluewire.StepResult{RuntimeSequence: result.RuntimeSequence, Outputs: result.Outputs}) { + return + } + writeOperatorExecution(w, http.StatusOK, "resolved", result) case isBlueRuntimeCode(err, "AWAIT_TYPE_MISMATCH"): writeOperatorError(w, http.StatusUnprocessableEntity, "VALUE_TYPE_MISMATCH", "value does not match the await's value_type") @@ -573,7 +579,7 @@ func postOperatorResolveEngineB(w http.ResponseWriter, deps PublicDeps, slot blu writeOperatorError(w, http.StatusGone, "AWAIT_GONE", "no live await by that name (already resolved or invalidated)") default: - writeOperatorError(w, http.StatusInternalServerError, "INTERNAL", "resolve failed") + writeOperatorExecutionError(w, err, "resolve failed") } } @@ -653,8 +659,8 @@ func postOperatorCall(deps PublicDeps) http.HandlerFunc { // unloaded slot. blueprint_id plays no role on this leg, matching // call/resolve's "accepted but not routed on" stance. // -// ?rule={rule_id}: unchanged, resolves through Engine A's promoted-rule -// registry exactly as before this change. +// A rule selector resolves through the global RulePlane when configured, +// otherwise through the retained legacy fixture registry. func getRuntimePending(deps PublicDeps) http.HandlerFunc { return requireOperator(func(w http.ResponseWriter, r *http.Request) { if r.URL.Query().Get("rule") != "" && deps.StreamRules != nil { @@ -730,7 +736,7 @@ func postOperatorResolve(deps PublicDeps) http.HandlerFunc { if !ok { return } - postOperatorResolveEngineB(w, deps, engineBSlot(kind), awaitName, body.Value) + postOperatorResolveEngineB(w, r, deps, engineBSlot(kind), awaitName, body.Value) return } diff --git a/internal/api/operator_execution.go b/internal/api/operator_execution.go new file mode 100644 index 00000000..f53b64c6 --- /dev/null +++ b/internal/api/operator_execution.go @@ -0,0 +1,48 @@ +package api + +import ( + "errors" + "net/http" + + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "github.com/ZabLaboratory/Orion/internal/bluehost" +) + +// Orion reports the portable runtime's dispatch, never a business verdict on +// a Canvas-validated Blue. Invocations may complete after this HTTP response. +func writeOperatorExecution(w http.ResponseWriter, code int, status string, result blueruntime.StepResult) { + invocations := make([]map[string]any, 0, len(result.Invocations)) + for _, invocation := range result.Invocations { + invocations = append(invocations, map[string]any{ + "invocation_id": invocation["invocation_id"], "capability": invocation["capability"], + "operation": invocation["operation"], + }) + } + writeJSON(w, code, map[string]any{ + "status": status, + "execution": map[string]any{ + "phase": "dispatch-returned", "runtime_status": result.Status, + "runtime_sequence": result.RuntimeSequence, "event_id": result.EventID, + "invocation_count": len(result.Invocations), + "invocations": invocations, + }, + }) +} + +// Preserve the runtime's public typed error. Unexpected host errors retain the +// existing generic envelope; no payload or provider response is echoed here. +func writeOperatorExecutionError(w http.ResponseWriter, err error, fallback string) { + if errors.Is(err, bluehost.ErrSceneChanging) { + writeOperatorError(w, http.StatusConflict, "SCENE_CHANGING", "execution is blocked during scene replacement") + return + } + var runtimeErr *blueruntime.Error + if errors.As(err, &runtimeErr) { + writeJSON(w, http.StatusInternalServerError, map[string]any{ + "error": "BLUE_EXECUTION_FAILED", "message": fallback, + "runtime_error": runtimeErr, + }) + return + } + writeOperatorError(w, http.StatusInternalServerError, "INTERNAL", fallback) +} diff --git a/internal/api/operator_execution_test.go b/internal/api/operator_execution_test.go new file mode 100644 index 00000000..5bd46edf --- /dev/null +++ b/internal/api/operator_execution_test.go @@ -0,0 +1,218 @@ +package api + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +func TestOperatorExecutionCorrelatesEffectsWithoutExposingPayloads(t *testing.T) { + response := httptest.NewRecorder() + writeOperatorExecution(response, 202, "fired", blueruntime.StepResult{Status: "runnable", Invocations: []map[string]any{{"invocation_id": "invocation-1", "capability": "arbitrary-provider", "operation": "operation", "request": map[string]any{"secret": "PRIVATE_OPERATOR_PAYLOAD"}}}}) + var body struct { + Execution struct { + Invocations []struct { + InvocationID string `json:"invocation_id"` + } + } + } + if json.Unmarshal(response.Body.Bytes(), &body) != nil || len(body.Execution.Invocations) != 1 || body.Execution.Invocations[0].InvocationID != "invocation-1" || strings.Contains(response.Body.String(), "PRIVATE_OPERATOR_PAYLOAD") { + t.Fatal("execution correlation lost or payload exposed", response.Body.String()) + } +} + +// Transport fixtures exercise arbitrary authored commands. They are not a +// functional validator and have no roster, league or business-output oracle. +func executionTransportProgram(t *testing.T, failing bool) []byte { + t.Helper() + await := "input" + if failing { + await = "" + } + raw := buildEngineBOperatorProgram(t, "first", "called", await, "core.json", "received") + var doc map[string]any + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + if err := decoder.Decode(&doc); err != nil { + t.Fatal(err) + } + for index, name := range []string{"custom_action_2026", "another-command", "new.command"} { + node := fmt.Sprintf("extra-%d", index) + doc["nodes"] = append(doc["nodes"].([]any), map[string]any{"id": node, "opcode": "core.operator.on-call@1", "config": map[string]any{}}) + doc["entrypoints"] = append(doc["entrypoints"].([]any), map[string]any{"id": name, "kind": "call", "node_id": node, "port": "then"}) + doc["exec_edges"] = append(doc["exec_edges"].([]any), map[string]any{"from_node": node, "from_port": "then", "to_node": "mark-called", "to_port": "in", "sequence": json.Number("0")}) + } + // An operational runtime failure, without making the program malformed. + if failing { + doc["budgets"].(map[string]any)["max_steps_per_dispatch"] = json.Number("1") + doc["nodes"] = append(doc["nodes"].([]any), map[string]any{"id": "second-mark", "opcode": "core.variable.set@1", "config": map[string]any{"variable": "called"}}) + doc["exec_edges"] = append(doc["exec_edges"].([]any), map[string]any{"from_node": "mark-called", "from_port": "then", "to_node": "second-mark", "to_port": "in", "sequence": json.Number("0")}) + doc["data_edges"] = append(doc["data_edges"].([]any), map[string]any{"from_node": "call-entry", "from_port": "payload", "to_node": "second-mark", "to_port": "value"}) + } + sortByIDForAPITest(doc["nodes"].([]any)) + sortByIDForAPITest(doc["entrypoints"].([]any)) + sortExecEdgesForAPITest(doc["exec_edges"].([]any)) + sortDataEdgesForAPITest(doc["data_edges"].([]any)) + delete(doc, "program_digest") + digest, err := canonical.Digest(doc) + if err != nil { + t.Fatal(err) + } + doc["program_digest"] = digest + raw, err = json.Marshal(doc) + if err != nil { + t.Fatal(err) + } + return raw +} + +func requireDispatchReceipt(t *testing.T, response *httptest.ResponseRecorder, status string) { + t.Helper() + var body struct { + Status string + Execution struct { + Phase string + RuntimeStatus string `json:"runtime_status"` + } + } + if json.Unmarshal(response.Body.Bytes(), &body) != nil || body.Status != status || body.Execution.Phase != "dispatch-returned" || body.Execution.RuntimeStatus == "" { + t.Fatalf("missing runtime receipt: %s", response.Body.String()) + } +} + +func TestOperatorExecutionDiscoversEveryCommandAcrossScopes(t *testing.T) { + for _, target := range []string{"program", "preview", "stream-rule"} { + t.Run(target, func(t *testing.T) { + program := executionTransportProgram(t, false) + host := bluehost.NewHost() + show := runtime.NewShow(runtime.NewComputeRegistry(), testLogger()) + defer show.Stop() + plane := bluehost.NewRulePlane(nil, nil, bluehost.EffectDeps{}, 1, testLogger()) + defer plane.Stop() + slot := bluehost.SlotOnAir + query := "" + if target == "preview" { + slot = bluehost.SlotPreview + query = "?target=preview" + } + if target == "stream-rule" { + var doc struct { + Digest string `json:"program_digest"` + } + if err := json.Unmarshal(program, &doc); err != nil { + t.Fatal(err) + } + if err := plane.Promote("arbitrary-rule", doc.Digest, program); err != nil { + t.Fatal(err) + } + } else { + if err := loadEngineBSlot(host, slot, program); err != nil { + t.Fatal(err) + } + defer func() { + if err := host.Release(slot, "test"); err != nil { + t.Error(err) + } + }() + if _, err := host.Step(slot); err != nil { + t.Fatal(err) + } + } + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: testLogger(), Show: show, SceneIntent: &SceneIntentDeps{Host: host}, StreamRules: &StreamRulesDeps{Plane: plane}}) + contracts := opRequest(t, mux, "GET", "/api/v1/cockpit/contracts?stream_id=test"+func() string { + if target == "preview" { + return "&target=preview" + } + return "" + }(), "operator", nil) + var discovered cockpitContracts + if contracts.Code != 200 || json.Unmarshal(contracts.Body.Bytes(), &discovered) != nil { + t.Fatal(contracts.Body.String()) + } + if len(discovered.Triggers) != 4 || len(discovered.Awaits) != 1 { + t.Fatalf("discovery incomplete: %s", contracts.Body.String()) + } + for _, command := range discovered.Triggers { + selector := query + if command.Scope == scopeStream { + selector = "?rule=" + url.QueryEscape(command.RuleID) + } + response := opRequest(t, mux, "POST", "/api/v1/operator/call/"+url.PathEscape(command.BlueprintKey)+"/"+url.PathEscape(command.EntrypointID)+selector, "operator", map[string]any{"payload": map[string]any{"opaque": "operator-value"}}) + if response.Code != 202 { + t.Fatalf("%s: %d %s", command.EntrypointID, response.Code, response.Body.String()) + } + requireDispatchReceipt(t, response, "fired") + } + for _, await := range discovered.Awaits { + selector := query + if await.Scope == scopeStream { + selector = "?rule=" + url.QueryEscape(await.RuleID) + } + path := "/api/v1/operator/resolve/" + url.PathEscape(await.BlueprintKey) + "/" + url.PathEscape(await.AwaitName) + selector + response := opRequest(t, mux, "POST", path, "operator", map[string]any{"value": []any{"opaque", true, 7}}) + if response.Code != 200 { + t.Fatal(response.Body.String()) + } + requireDispatchReceipt(t, response, "resolved") + if again := opRequest(t, mux, "POST", path, "operator", map[string]any{"value": nil}); again.Code != 410 { + t.Fatal("resolved await executed twice") + } + } + }) + } +} + +func TestOperatorExecutionPreservesRuntimeFailure(t *testing.T) { + for _, slot := range []bluehost.Slot{bluehost.SlotOnAir, bluehost.SlotPreview} { + t.Run(string(slot), func(t *testing.T) { + f := newEngineBOperatorFixtureOnSlot(t, slot, executionTransportProgram(t, true)) + query := "" + if slot == bluehost.SlotPreview { + query = "?target=preview" + } + response := opRequest(t, f.mux, "POST", "/api/v1/operator/call/_/first"+query, "operator", map[string]any{"payload": nil}) + var failure struct { + Error string + RuntimeError blueruntime.Error `json:"runtime_error"` + } + if response.Code != 500 || json.Unmarshal(response.Body.Bytes(), &failure) != nil || failure.Error != "BLUE_EXECUTION_FAILED" || failure.RuntimeError.Code == "" || failure.RuntimeError.Stage == "" { + t.Fatalf("lost execution error: %d %s", response.Code, response.Body.String()) + } + }) + } + t.Run("stream-rule", func(t *testing.T) { + program := executionTransportProgram(t, true) + var identity struct { + Digest string `json:"program_digest"` + } + if err := json.Unmarshal(program, &identity); err != nil { + t.Fatal(err) + } + plane := bluehost.NewRulePlane(nil, nil, bluehost.EffectDeps{}, 1, testLogger()) + defer plane.Stop() + if err := plane.Promote("arbitrary-rule", identity.Digest, program); err != nil { + t.Fatal(err) + } + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: testLogger(), StreamRules: &StreamRulesDeps{Plane: plane}}) + response := opRequest(t, mux, "POST", "/api/v1/operator/call/arbitrary-rule/first?rule=arbitrary-rule", "operator", map[string]any{"payload": nil}) + var failure struct { + Error string + RuntimeError blueruntime.Error `json:"runtime_error"` + } + if response.Code != 500 || json.Unmarshal(response.Body.Bytes(), &failure) != nil || failure.Error != "BLUE_EXECUTION_FAILED" || failure.RuntimeError.Code == "" { + t.Fatalf("stream-rule error lost: %d %s", response.Code, response.Body.String()) + } + }) +} diff --git a/internal/api/program_admission_fence_test.go b/internal/api/program_admission_fence_test.go new file mode 100644 index 00000000..af99e92c --- /dev/null +++ b/internal/api/program_admission_fence_test.go @@ -0,0 +1,70 @@ +package api + +import ( + "bytes" + "context" + "crypto/ed25519" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "net/http" + "net/http/httptest" + "testing" + "time" +) + +type releaseBlockedPortal struct { + fakeWorkload + entered, finish chan struct{} +} + +func (p *releaseBlockedPortal) AdmitInline(ctx context.Context, _ string, _ json.RawMessage) error { + close(p.entered) + select { + case <-ctx.Done(): + return ctx.Err() + case <-p.finish: + return nil + } +} + +func TestProgramAdmissionPreparedBeforeReleaseCannotPublishAfterStop(t *testing.T) { + pub, priv, _ := ed25519.GenerateKey(nil) + program := minimalProgram(t) + raw, digest := canvasEnvelope(program) + var envelope resolvedSceneEnvelope + if err := json.Unmarshal(raw, &envelope); err != nil { + t.Fatal(err) + } + portal := &releaseBlockedPortal{entered: make(chan struct{}), finish: make(chan struct{})} + host := bluehost.NewHost() + deps := SceneIntentDeps{Trust: attestation.TrustSet{"canvas-key-1": pub}, LocatorPrefix: "scenes/", OwnerID: "owner-1", TenantID: "tenant-1", Workload: portal, Host: host} + body, _ := json.Marshal(sceneIntentRequest{IntentID: "delayed-admission", StreamID: "stream-1", Action: "take-on-air", ResolvedSceneRef: signedRef(t, priv, "canvas-key-1", attestation.ActionTakeOnAir, time.Now(), "scene-1", digest), BlueProgram: envelope.BlueProgram, BlueProgramDigest: envelope.BlueProgramDigest}) + req := httptest.NewRequest("POST", "/api/v1/host/scene-intent", bytes.NewReader(body)) + req.Header.Set("X-Authenticated-User", "operator-1") + req.Header.Set("X-Authenticated-Role", "operator") + req.Header.Set(authContextHeader, "local-test-ticket") + done := make(chan *httptest.ResponseRecorder, 1) + go func() { rec := httptest.NewRecorder(); postSceneIntent(deps)(rec, req); done <- rec }() + select { + case <-portal.entered: + case <-time.After(3 * time.Second): + t.Fatal("admission did not reach external gate") + } + host.SuspendProgramAdmissions() + close(portal.finish) + got := <-done + if got.Code != http.StatusConflict || !bytes.Contains(got.Body.Bytes(), []byte("PROGRAM_ADMISSION_SUPERSEDED")) || host.Digest(bluehost.SlotOnAir) != "" { + t.Fatal(got.Code, got.Body.String()) + } + // A new HTTP take cannot bypass the stopped lifecycle either. + req = httptest.NewRequest("POST", "/api/v1/host/scene-intent", bytes.NewReader(body)) + req.Header.Set("X-Authenticated-User", "operator-1") + req.Header.Set("X-Authenticated-Role", "operator") + req.Header.Set(authContextHeader, "local-test-ticket") + got = httptest.NewRecorder() + postSceneIntent(deps)(got, req) + if got.Code != http.StatusConflict || !bytes.Contains(got.Body.Bytes(), []byte("PROGRAM_RELEASED")) { + t.Fatal(got.Code, got.Body.String()) + } +} diff --git a/internal/api/program_identity.go b/internal/api/program_identity.go new file mode 100644 index 00000000..9696c9ec --- /dev/null +++ b/internal/api/program_identity.go @@ -0,0 +1,52 @@ +package api + +import ( + "context" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/runtime" + "time" +) + +func NativeProgramInspector(hub *lsdpreception.Hub, host *bluehost.Host, preview *runtime.PreviewSlot) func(context.Context, lsdpreception.ProgramInspect) lsdpreception.ProgramIdentityReceipt { + return func(parent context.Context, r lsdpreception.ProgramInspect) lsdpreception.ProgramIdentityReceipt { + ctx, cancel := context.WithTimeout(parent, 3*time.Second) + defer cancel() + release, err := host.AcquireSceneCommit(ctx, bluehost.SlotOnAir) + if err != nil { + return lsdpreception.ProgramIdentityReceipt{ProgramInspect: r, Status: "refused", Reason: "PROGRAM_RELEASE_BUSY"} + } + defer release() + result := hub.InspectProgram(r) + if result.Status != "active" { + return result + } + if head, editable := preview.EditableTargetHead("program"); editable { + current, _, err := preview.EditableTargetState(ctx, "program", head.SceneID) + if err != nil || current.SceneID != result.SceneID || current.SceneVersion != result.SceneVersion { + result.Status = "refused" + result.Reason = "PROGRAM_RELEASE_WRITER_MISMATCH" + return result + } + result.WriterID = current.WriterID + seq := current.EditSeq + result.EditSeq = &seq + } + if err = hub.Flush(ctx); err != nil { + result.Status = "refused" + result.Reason = "PROGRAM_RELEASE_NATIVE_UNCONFIRMED" + } + return result + } +} +func (c *SceneControl) inspectProgram(ctx context.Context, r lsdpreception.ProgramInspect) { + result := lsdpreception.ProgramIdentityReceipt{ProgramInspect: r, Status: "refused", Reason: "PROGRAM_RELEASE_UNAVAILABLE"} + if c.deps.InspectProgram != nil { + result = c.deps.InspectProgram(ctx, r) + } + ack, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + if err := c.reception.WriteLeaf(ack, "orion/state", "/scene_control/defaults/observed/inspect_program", result); err != nil { + c.log("program identity observation unavailable", err) + } +} diff --git a/internal/api/program_release.go b/internal/api/program_release.go new file mode 100644 index 00000000..a1bd3ca8 --- /dev/null +++ b/internal/api/program_release.go @@ -0,0 +1,171 @@ +package api + +import ( + "context" + "encoding/json" + "errors" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/providers" + "github.com/ZabLaboratory/Orion/internal/runtime" + "time" +) + +func programReleaseWriterMatches(preview *runtime.PreviewSlot, r lsdpreception.ProgramRelease) (runtime.EditableHead, bool) { + head, editable := preview.EditableTargetHead("program") + return head, (editable && head.SceneID == r.SceneID && head.SceneVersion == r.SceneVersion && r.WriterID == head.WriterID && r.EditSeq != nil && *r.EditSeq == head.EditSeq) || (!editable && r.WriterID == "" && r.EditSeq == nil) +} + +func NativeProgramReleaseChecker(hub *lsdpreception.Hub, preview *runtime.PreviewSlot) func(lsdpreception.ProgramRelease) lsdpreception.ProgramReleaseReceipt { + return func(r lsdpreception.ProgramRelease) lsdpreception.ProgramReleaseReceipt { + result := hub.CheckProgramRelease(r) + if result.Status == "validated" { + if _, ok := programReleaseWriterMatches(preview, r); !ok { + result.Status = "refused" + result.Reason = "PROGRAM_RELEASE_WRITER_MISMATCH" + } + } + return result + } +} + +func NativeProgramReleaser(hub *lsdpreception.Hub, host *bluehost.Host, bridges *bluewire.Registry, preview *runtime.PreviewSlot) func(context.Context, lsdpreception.ProgramRelease) lsdpreception.ProgramReleaseReceipt { + return func(parent context.Context, r lsdpreception.ProgramRelease) lsdpreception.ProgramReleaseReceipt { + refuse := func(reason string) lsdpreception.ProgramReleaseReceipt { + return lsdpreception.ProgramReleaseReceipt{ProgramRelease: r, Status: "refused", Reason: reason} + } + ctx, cancel := context.WithTimeout(parent, 3*time.Second) + defer cancel() + release, err := host.AcquireSceneCommit(ctx, bluehost.SlotOnAir) + if err != nil { + return refuse("PROGRAM_RELEASE_BUSY") + } + defer release() + checked := hub.CheckProgramRelease(r) + if checked.Status == "released" || checked.Status == "failed" { + return checked + } + if checked.Status == "refused" { + return checked + } + cleanupReason := "" + if !checked.Retired { + head, matches := programReleaseWriterMatches(preview, r) + if !matches { + return refuse("PROGRAM_RELEASE_WRITER_MISMATCH") + } + finish, staged := hub.StageProgramRelease(r) + if finish == nil { + return staged + } + defer finish() + host.SuspendProgramAdmissions() + if bridges != nil { + bridges.Stop(bluehost.SlotOnAir) + } + // Mirror publication is frozen before either owner can emit late work. + if err = preview.ReleaseNativeProgram(head); err != nil { + return refuse("PROGRAM_RELEASE_WRITER_MISMATCH") + } + providers.ResetActiveIngress(host) + stopErr := host.Release(bluehost.SlotOnAir, "broadcast-stopped") + checked = hub.RetireProgram(r) + if !checked.Retired { + return checked + } + if stopErr != nil { + cleanupReason = "PROGRAM_RELEASE_OWNER_STOP_FAILED" + } + } + // A retry after lost delivery only waits for the same queued Drop. + if err = hub.Flush(ctx); err != nil { + checked.Status = "failed" + checked.Reason = "PROGRAM_RELEASE_NATIVE_UNCONFIRMED" + return checked + } + result := hub.FinishProgramRelease(r, cleanupReason) + result.Replayed = checked.Replayed + return result + } +} + +func (c *SceneControl) releaseProgram(ctx context.Context, r lsdpreception.ProgramRelease, desired map[string]SceneSelection) (map[string]SceneSelection, bool) { + result := lsdpreception.ProgramReleaseReceipt{ProgramRelease: r, Status: "refused", Reason: "PROGRAM_RELEASE_UNAVAILABLE"} + if c.deps.CheckProgramRelease != nil && c.deps.ReleaseProgram != nil { + result = c.deps.CheckProgramRelease(r) + if result.Status != "refused" { + if !result.Retired { + c.mu.Lock() + if cancel := c.inFlight["program"]; cancel != nil { + cancel() + } + c.mu.Unlock() + } + // Cancel/join a staged admission's compensation before taking authority. + for !c.opMu.TryLock() { + select { + case <-ctx.Done(): + result.Status = "refused" + result.Reason = "PROGRAM_RELEASE_BUSY" + goto observe + case <-time.After(10 * time.Millisecond): + } + } + defer c.opMu.Unlock() + result = c.deps.ReleaseProgram(ctx, r) + } + } +observe: + changed := result.Retired && !result.Replayed + if result.Retired && c.deps.Host != nil { + _, allowed := c.deps.Host.ProgramAdmissionToken() + changed = changed || !allowed // repair observation after a lost release ACK + } + ack, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + err := c.reception.WriteLeavesFromState(ack, "orion/state", func(state any) ([]any, error) { + ops := []any{} + if changed { + root, _ := state.(map[string]any) + raw, _ := json.Marshal(root["scene_control"]) + var latest SceneControlDocument + if json.Unmarshal(raw, &latest) != nil || validateSceneControl(latest) != nil { + return nil, errors.New("SCENE_CONTROL_INVALID") + } + desired = latest.Defaults.Desired + if _, exists := desired["program"]; exists { + delete(desired, "program") + ops = append(ops, map[string]any{"op": "remove", "path": "/scene_control/defaults/desired/program"}) + } + ops = append(ops, map[string]any{"op": "add", "path": "/scene_control/defaults/observed/program", "value": map[string]any{"status": "inactive", "release_command_id": r.CommandID}}) + } + observed := result + if changed { + observed.Status = "pending" + observed.Reason = "PROGRAM_RELEASE_RECONCILING" + } + return append(ops, map[string]any{"op": "add", "path": "/scene_control/defaults/observed/release_program", "value": observed}), nil + }) + if changed { + c.mu.Lock() + c.desired = desired + delete(c.current, "program") + c.mu.Unlock() + if persistErr := c.persist(); persistErr != nil { + result.Status = "failed" + result.Reason = "PROGRAM_RELEASE_PERSIST_FAILED" + } + if err != nil { + result.Status = "failed" + result.Reason = "PROGRAM_RELEASE_CONTROL_UNCONFIRMED" + } + if finalErr := c.reception.WriteLeaf(ack, "orion/state", "/scene_control/defaults/observed/release_program", result); finalErr != nil { + c.log("program release final receipt unavailable", finalErr) + } + } + if err != nil { + c.log("program release observation unavailable", err) + } + return desired, changed +} diff --git a/internal/api/program_release_native_test.go b/internal/api/program_release_native_test.go new file mode 100644 index 00000000..caf23271 --- /dev/null +++ b/internal/api/program_release_native_test.go @@ -0,0 +1,313 @@ +package api + +import ( + "context" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/config" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/protocol" + "github.com/ZabLaboratory/Orion/internal/runtime" + "log/slog" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + "time" +) + +// This test owns a disposable Rust receiver, never the common application. +func TestProgramReleaseNative(t *testing.T) { + address := os.Getenv("ORION_TEST_PRIVATE_LANE_ADDRESS") + if address == "" { + t.Skip("requires private native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + p := lsdpreception.NewProducer(ctx, reception) + defer p.Close() + p.Replace("solar/lane-a", nil) + p.Replace("solar/lane-b", nil) + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + hub := lsdpreception.NewHub(p, slog.Default()) + hub.EnablePhysicalLanes() + program, preview := hub.Lane("program"), hub.Lane("preview") + host := bluehost.NewHost() + bridges := bluewire.NewRegistry() + defer bridges.StopAll() + authors := runtime.NewPreviewSlot(ctx, runtime.NewComputeRegistry(), preview, slog.Default()) + authors.SetEditableProgramWire(program) + defer authors.Close() + intent := &SceneIntentDeps{Host: host, Bridges: bridges, CommitLaneRoles: NativeLaneCommitter(hub, host, bridges, authors), CheckProgramRelease: NativeProgramReleaseChecker(hub, authors), ReleaseProgram: NativeProgramReleaser(hub, host, bridges, authors), InspectProgram: NativeProgramInspector(hub, host, authors)} + mux := http.NewServeMux() + RegisterPublic(mux, PublicDeps{Logger: slog.Default(), Config: config.Config{Profile: config.ProfileEmbeddedLocal}, Preview: authors, SceneIntent: intent, NativeLSDPFlush: p.Flush}) + open := func(id string) runtime.EditableHead { + t.Helper() + doc := map[string]any{"lsml": "1.2", "scene_id": id, "scene_version": "sha256:" + strings.Repeat("0", 64), "layout": map[string]any{"kind": "shape", "bind": map[string]any{"width": "__editable.width"}}, "defaults": map[string]any{"__editable.width": json.Number("10")}} + version, err := canonical.Digest(doc) + if err != nil { + t.Fatal(err) + } + doc["scene_version"] = version + got := editableAPIRequest(t, mux, http.MethodPost, map[string]any{"scene_id": id, "scene_version": version, "render_mode": "source-only", "edit_seq": 0, "lsml_bundle": doc}, "operator") + if got.Code != http.StatusOK { + t.Fatal(got.Code, got.Body.String()) + } + head, ok := authors.EditableTargetHead("preview") + if !ok { + t.Fatal("Preview author missing") + } + return head + } + read := func(target string) any { + t.Helper() + state, err := reception.Read(ctx, target) + if err != nil { + t.Fatal(err) + } + return state + } + bytes := func(v any) string { raw, _ := json.Marshal(v); return string(raw) } + first := open("release-live") + d := NewSceneControlDocument() + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control", d); err != nil { + t.Fatal(err) + } + c := &SceneControl{deps: *intent, reception: reception, path: filepath.Join(t.TempDir(), "selection.lsml"), desired: d.Defaults.Desired, current: map[string]string{}} + runCtx, stopRun := context.WithCancel(ctx) + done := make(chan struct{}) + go func() { defer close(done); _ = c.Run(runCtx) }() + defer func() { stopRun(); <-done }() + commit := lsdpreception.LaneCommit{Schema: "orion.lane-commit.v1", RuntimeInstanceID: "release-native-runtime", PrepareCommandID: "first-prepare", TakeCommandID: "first-take", IntentID: "first-intent", FrameID: 12, PtsNs: 1234, ServerSeq: 4, PreviousRoleMap: lsdpreception.RoleMap{OnAir: "A", Preview: "B"}, RoleMap: lsdpreception.RoleMap{OnAir: "B", Preview: "A"}, PreviousRevisions: lsdpreception.LaneRevisions{Program: 0, Preview: 1, RoleMap: 0}, Revisions: lsdpreception.LaneRevisions{Program: 1, Preview: 1, RoleMap: 1}, SceneID: first.SceneID, SceneVersion: first.SceneVersion} + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/lane_commit", commit); err != nil { + t.Fatal(err) + } + control := func() SceneControlDocument { + t.Helper() + raw, _ := json.Marshal(read("orion/state").(map[string]any)["scene_control"]) + var got SceneControlDocument + if err = json.Unmarshal(raw, &got); err != nil { + t.Fatal(err) + } + return got + } + wait := func(check func(SceneControlDocument) bool) { + t.Helper() + for ctx.Err() == nil { + if check(control()) { + return + } + time.Sleep(5 * time.Millisecond) + } + t.Fatal("native control receipt timed out") + } + wait(func(d SceneControlDocument) bool { + r, _ := d.Defaults.Observed["lane_commit"].(map[string]any) + return r["status"] == "committed" + }) + if read("solar/lane-a") != nil || read("solar/lane-b").(map[string]any)["scene_id"] != first.SceneID { + t.Fatal("first start duplicated/reloaded Preview") + } + live, ok := authors.EditableTargetHead("program") + if !ok || live.WriterID != first.WriterID { + t.Fatal("start lost original writer") + } + oldMirror := authors.EditableTargetMirror("program") + second := open("release-preview") + previewBefore := bytes(read("solar/lane-a")) + observedBefore := control().Defaults.Observed["preview"] + inspect := lsdpreception.ProgramInspect{Schema: "orion.program-inspect.v1", CommandID: "inspect-1", RuntimeInstanceID: commit.RuntimeInstanceID, TakeCommandID: commit.TakeCommandID, ExpectedRoleMap: commit.RoleMap, ExpectedRevisions: commit.Revisions} + inspect.ExpectedRevisions.Preview += 10 // independent Preview preparations are allowed + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/inspect_program", inspect); err != nil { + t.Fatal(err) + } + wait(func(d SceneControlDocument) bool { + got, _ := d.Defaults.Observed["inspect_program"].(map[string]any) + return got["command_id"] == inspect.CommandID && got["status"] == "active" + }) + raw, _ := json.Marshal(control().Defaults.Observed["inspect_program"]) + var identity lsdpreception.ProgramIdentityReceipt + if err = json.Unmarshal(raw, &identity); err != nil || identity.WriterID != live.WriterID || identity.EditSeq == nil || *identity.EditSeq != live.EditSeq { + t.Fatal("native inspection lost author", identity, err) + } + seq := *identity.EditSeq + r := lsdpreception.ProgramRelease{Schema: "orion.program-release.v1", CommandID: "release-1", StopCommandID: "confirmed-stop-1", OutputState: "stopped", RuntimeInstanceID: commit.RuntimeInstanceID, TakeCommandID: commit.TakeCommandID, ExpectedRoleMap: commit.RoleMap, ExpectedRevisions: commit.Revisions, SceneID: live.SceneID, SceneVersion: live.SceneVersion, ArtifactSet: live.SceneVersion, WriterID: live.WriterID, EditSeq: &seq} + patched := editableAPIRequest(t, mux, http.MethodPut, map[string]any{"target": "program", "scene_id": live.SceneID, "writer_id": live.WriterID, "base_edit_seq": seq, "edit_seq": seq + 1, "patches": []map[string]any{{"path": "__editable.width", "value": 12}}}, "operator") + if patched.Code != http.StatusAccepted { + t.Fatal(patched.Code, patched.Body.String()) + } + if stale := intent.ReleaseProgram(ctx, r); stale.Reason != "PROGRAM_RELEASE_WRITER_MISMATCH" { + t.Fatal("inspection failed to fence intervening edits", stale) + } + seq++ + previewSnapshot, _ := authors.EditableTargetSnapshot("preview") + programSnapshot, _ := authors.EditableTargetSnapshot("program") + for _, tc := range []struct { + name, reason string + change func(*lsdpreception.ProgramRelease) + }{ + {"runtime", "PROGRAM_RELEASE_FOREIGN_RUNTIME", func(r *lsdpreception.ProgramRelease) { r.RuntimeInstanceID = "foreign" }}, + {"epoch", "PROGRAM_RELEASE_STALE_EPOCH", func(r *lsdpreception.ProgramRelease) { r.ExpectedRevisions.RoleMap++ }}, + {"identity", "PROGRAM_RELEASE_IDENTITY_MISMATCH", func(r *lsdpreception.ProgramRelease) { r.SceneID = "retired" }}, + {"writer", "PROGRAM_RELEASE_WRITER_MISMATCH", func(r *lsdpreception.ProgramRelease) { r.WriterID = "retired-writer" }}, + } { + bad := r + bad.CommandID = "bad-" + tc.name + tc.change(&bad) + got := intent.ReleaseProgram(ctx, bad) + if got.Reason != tc.reason || bytes(read("solar/lane-a")) != previewBefore || read("solar/lane-b") == nil { + t.Fatal(tc.name, got) + } + } + // A pending Program admission is cancelled and joined; its delayed result + // cannot reoccupy the slot after release. Preview work is not cancelled. + jobCtx, stopJob := context.WithCancel(ctx) + defer stopJob() + previewJob, stopPreviewJob := context.WithCancel(ctx) + defer stopPreviewJob() + c.opMu.Lock() + c.mu.Lock() + c.inFlight = map[string]context.CancelFunc{"program": stopJob, "preview": stopPreviewJob} + c.mu.Unlock() + joined := make(chan struct{}) + go func() { <-jobCtx.Done(); c.opMu.Unlock(); close(joined) }() + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/release_program", r); err != nil { + t.Fatal(err) + } + wait(func(d SceneControlDocument) bool { + got, _ := d.Defaults.Observed["release_program"].(map[string]any) + return got["command_id"] == r.CommandID && got["status"] == "released" + }) + <-joined + if previewJob.Err() != nil || bytes(read("solar/lane-a")) != previewBefore || read("solar/lane-b") != nil { + t.Fatal("release touched Preview or retained Program") + } + if _, ok = authors.EditableTargetHead("program"); ok || host.Digest(bluehost.SlotOnAir) != "" { + t.Fatal("retired owner remains exposed") + } + if got, _ := authors.EditableTargetHead("preview"); got != second { + t.Fatal("Preview writer changed") + } + if now, _ := authors.EditableTargetSnapshot("preview"); now != previewSnapshot { + t.Fatal("release invalidated Preview compilation") + } + if now, _ := authors.EditableTargetSnapshot("program"); now == programSnapshot { + t.Fatal("release retained Program compilation authority") + } + final := control() + if _, exists := final.Defaults.Desired["program"]; exists || bytes(final.Defaults.Observed["preview"]) != bytes(observedBefore) { + t.Fatal("release did not reconcile only Program") + } + saved, err := os.ReadFile(c.path) + if err != nil { + t.Fatal(err) + } + var persisted SceneControlDocument + if json.Unmarshal(saved, &persisted) != nil || len(persisted.Defaults.Observed) != 0 || persisted.Defaults.ReleaseProgram != nil { + t.Fatal("release runtime command was persisted") + } + oldMirror.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: "__editable.width", Value: json.RawMessage(`99`)}}}) + if err = p.Flush(ctx); err != nil || read("solar/lane-b") != nil { + t.Fatal("late publication recreated released Program", err) + } + if got := intent.ReleaseProgram(ctx, r); got.Status != "released" || !got.Replayed { + t.Fatal("release replay changed authority", got) + } + // The next real Take promotes the still-existing Preview without reloading. + next := commit + next.PrepareCommandID = "second-prepare" + next.TakeCommandID = "second-take" + next.IntentID = "second-intent" + next.FrameID++ + next.PtsNs++ + next.ServerSeq++ + next.PreviousRoleMap = commit.RoleMap + next.RoleMap = commit.PreviousRoleMap + next.PreviousRevisions = commit.Revisions + next.Revisions.Program++ + next.Revisions.RoleMap++ + next.SceneID = second.SceneID + next.SceneVersion = second.SceneVersion + if got := intent.CommitLaneRoles(ctx, next); got.Status != "committed" { + t.Fatal(got) + } + if epoch, allowed := host.ProgramAdmissionToken(); !allowed || !host.ProgramAdmissionValid(epoch) { + t.Fatal("editable physical start did not reopen Program admissions") + } + if bytes(read("solar/lane-a")) != previewBefore || read("solar/lane-b") != nil { + t.Fatal("next start reloaded or duplicated document") + } + if got, ok := authors.EditableTargetHead("program"); !ok || got.WriterID != second.WriterID { + t.Fatal("next start did not transfer writer") + } + if got := intent.ReleaseProgram(ctx, r); got.Status != "released" || !got.Replayed || read("solar/lane-a") == nil { + t.Fatal("old release replay retired new Program", got) + } + t.Logf("REAL_NATIVE_PROGRAM_RELEASE_PROOF first-start-empty=true retired=solar/lane-b preview_unchanged=true late_publication_refused=true next-start-no-reload=true receipt=%s", bytes(final.Defaults.Observed["release_program"])) +} + +func TestProgramReleaseBlueNative(t *testing.T) { + address := os.Getenv("ORION_TEST_PRIVATE_LANE_ADDRESS") + if address == "" { + t.Skip("requires private native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + p := lsdpreception.NewProducer(ctx, reception) + defer p.Close() + p.Replace("solar/lane-a", nil) + p.Replace("solar/lane-b", nil) + hub := lsdpreception.NewHub(p, slog.Default()) + hub.EnablePhysicalLanes() + program, preview := hub.Lane("program"), hub.Lane("preview") + preview.MirrorForLSML("blue-live", "blue-artifacts", []byte(`{"lsml":"1.2","scene_id":"blue-live","scene_version":"blue-source","layout":{"type":"frame","children":[]},"defaults":{}}`)) + preview.SetActive("blue-live") + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + host := bluehost.NewHost() + fixture := minimalProgram(t) + if err = host.Prepare(bluehost.SlotPreview, "blue-actor", "blue-live", "blue-digest", fixture, nil, nil, nil); err != nil { + t.Fatal(err) + } + if _, err = host.Step(bluehost.SlotPreview); err != nil { + t.Fatal(err) + } + bridges := bluewire.NewRegistry() + defer bridges.StopAll() + authors := runtime.NewPreviewSlot(ctx, runtime.NewComputeRegistry(), preview, slog.Default()) + authors.SetEditableProgramWire(program) + defer authors.Close() + commit := lsdpreception.LaneCommit{Schema: "orion.lane-commit.v1", RuntimeInstanceID: "blue-native-runtime", PrepareCommandID: "blue-prepare", TakeCommandID: "blue-take", IntentID: "blue-intent", FrameID: 12, PtsNs: 1234, ServerSeq: 4, PreviousRoleMap: lsdpreception.RoleMap{OnAir: "A", Preview: "B"}, RoleMap: lsdpreception.RoleMap{OnAir: "B", Preview: "A"}, PreviousRevisions: lsdpreception.LaneRevisions{Preview: 1}, Revisions: lsdpreception.LaneRevisions{Program: 1, Preview: 1, RoleMap: 1}, SceneID: "blue-live", SceneVersion: "blue-source"} + if got := NativeLaneCommitter(hub, host, bridges, authors)(ctx, commit); got.Status != "committed" { + t.Fatal(got) + } + if _, err = host.Step(bluehost.SlotOnAir); err != nil { + t.Fatal("promoted Blue did not execute", err) + } + r := lsdpreception.ProgramRelease{Schema: "orion.program-release.v1", CommandID: "blue-release", StopCommandID: "blue-stop", OutputState: "stopped", RuntimeInstanceID: commit.RuntimeInstanceID, TakeCommandID: commit.TakeCommandID, ExpectedRoleMap: commit.RoleMap, ExpectedRevisions: commit.Revisions, SceneID: commit.SceneID, SceneVersion: commit.SceneVersion, ArtifactSet: "blue-artifacts"} + if got := NativeProgramReleaser(hub, host, bridges, authors)(ctx, r); got.Status != "released" { + t.Fatal(got) + } + if _, err = host.Step(bluehost.SlotOnAir); err == nil { + t.Fatal("released Blue still steps") + } + state, err := reception.Read(ctx, "solar/lane-b") + if err != nil || state != nil { + t.Fatal("Blue document retained", state, err) + } + t.Log("REAL_NATIVE_BLUE_RELEASE_PROOF SDK instance stopped, physical Program null, next steps refused") +} diff --git a/internal/api/public.go b/internal/api/public.go index 29adb685..7057d573 100644 --- a/internal/api/public.go +++ b/internal/api/public.go @@ -4,6 +4,7 @@ package api import ( + "context" "encoding/json" "errors" "log/slog" @@ -11,22 +12,29 @@ import ( "github.com/ZabLaboratory/Orion/internal/adapters" "github.com/ZabLaboratory/Orion/internal/auth" + "github.com/ZabLaboratory/Orion/internal/bluehost" "github.com/ZabLaboratory/Orion/internal/config" "github.com/ZabLaboratory/Orion/internal/effects" "github.com/ZabLaboratory/Orion/internal/obs" "github.com/ZabLaboratory/Orion/internal/runtime" + "github.com/ZabLaboratory/Orion/internal/streamcontrol" "github.com/ZabLaboratory/Orion/internal/ws" ) // PublicDeps groups every dependency the public router needs. type PublicDeps struct { - Logger *slog.Logger - Metrics *obs.Metrics - Config config.Config - Show *runtime.Show - Inbox *adapters.Inbox - Test *runtime.TestSessionManager - WSServer *ws.Server + HostEffects *bluehost.EffectDeps + OverlayStatus func() map[string]streamcontrol.AppStatus + NativeLSDPCheck func(context.Context) error + NativeLSDPFlush func(context.Context) error + NativeLSDPStatus func() any + Logger *slog.Logger + Metrics *obs.Metrics + Config config.Config + Show *runtime.Show + Inbox *adapters.Inbox + Test *runtime.TestSessionManager + WSServer *ws.Server // Harness runs scene-validation campaigns (ADR 003 §3.2, issue #87) — // still consumed by postSimulate (validate_simulate.go). The serialised @@ -61,8 +69,8 @@ type PublicDeps struct { PreviewLSDP http.Handler // EditablePreview is the local no-Blue authoring lane. It is deliberately // separate from SceneIntent/Blue: a bounded LSML bundle is installed in - // the PreviewSlot and leaf edits are mirrored directly to the same Preview - // LSDP wire. + // the PreviewSlot and leaf edits target its active Preview/Program actor on + // the physical native resource. Target omission retains Preview compatibility. EditablePreview *runtime.PreviewSlot LocalEditorToken string StaticAssetBaseURL string @@ -117,6 +125,14 @@ func RegisterPublic(mux *http.ServeMux, deps PublicDeps) { // Public descriptor used by Prism to verify the Blue runtime embedded in // its local Orion sidecar. This is not the remote Blue authoring service. mux.HandleFunc("GET /api/v1/runtime/descriptor", getRuntimeDescriptor) + mux.HandleFunc("GET /api/v1/runtime/host-surface", getHostSurface(deps)) + mux.HandleFunc("GET /api/v1/show/overlay-apps", requireOperator(func(w http.ResponseWriter, _ *http.Request) { + status := map[string]streamcontrol.AppStatus{} + if deps.OverlayStatus != nil { + status = deps.OverlayStatus() + } + writeJSON(w, http.StatusOK, map[string]any{"apps": status}) + })) // POST /api/v1/scenes/{id}/push — RETIRED (#15, #331): see the removed // scenes_push.go. Superseded by POST /api/v1/host/scene-intent below. @@ -156,6 +172,10 @@ func RegisterPublic(mux *http.ServeMux, deps PublicDeps) { // scene-push.ts) — migration to scene-intent is a separate Prism-repo // work stream, not implemented here; see the #331 final report. mux.HandleFunc("POST /api/v1/show/test-sessions", postTestSession(deps)) + if deps.NativeLSDPCheck != nil { + mux.HandleFunc("POST /api/v1/show/test-sessions/{session}/lease", renewNativeTestSession(deps)) + mux.HandleFunc("DELETE /api/v1/show/test-sessions/{session}", closeNativeTestSession(deps)) + } // Preview/antenne split: the cockpit preview flips the PERSISTENT preview // wire (a clone behind /show/preview.lsdp), never the antenne's active // scene — so a preview switch no longer flips the live antenne. The @@ -164,6 +184,7 @@ func RegisterPublic(mux *http.ServeMux, deps PublicDeps) { mux.HandleFunc("POST /api/v1/show/preview-active-scene", postPreviewActiveScene(deps)) mux.HandleFunc("GET /api/v1/show/preview-snapshot", getPreviewSnapshot(deps)) mux.HandleFunc("POST /api/v1/show/editable-preview", postEditablePreview(deps)) + mux.HandleFunc("GET /api/v1/show/editable-preview/state", getEditableTargetState(deps)) mux.HandleFunc("POST /api/v1/show/editable-preview/activate", postEditablePreviewActivate(deps)) mux.HandleFunc("POST /api/v1/show/editable-preview/air", postEditablePreviewAir(deps)) mux.HandleFunc("PUT /api/v1/show/editable-preview", putEditablePreviewPatch(deps)) @@ -216,6 +237,7 @@ func RegisterPublic(mux *http.ServeMux, deps PublicDeps) { // registered only once cmd/orion provisions Trust/Workload/Host. if deps.SceneIntent != nil { if deps.SceneIntent.EmbeddedLocal { + mux.HandleFunc("POST /api/v1/runtime/scene-catalog", postSceneCatalog(*deps.SceneIntent)) mux.HandleFunc("POST /api/v1/host/scene-intent/atomic", postLocalAtomicSceneIntent(*deps.SceneIntent)) } mux.HandleFunc("POST /api/v1/host/scene-intent", postSceneIntent(*deps.SceneIntent)) @@ -237,7 +259,7 @@ func RegisterPublic(mux *http.ServeMux, deps PublicDeps) { mux.HandleFunc("POST /api/v1/validate/render-bundle", postValidateRenderBundle(*deps.SceneIntent)) } if deps.CameraSlots != nil { - mux.HandleFunc("POST /api/v1/host/camera-slots", postCameraSlots(deps.CameraSlots)) + mux.HandleFunc("POST /api/v1/host/camera-slots", postCameraSlots(deps.CameraSlots, deps.NativeLSDPFlush)) } // WebSocket endpoints. coder/websocket lives behind these handlers. mux.HandleFunc("/api/v1/show/stream", deps.WSServer.ServeShowStream) @@ -300,12 +322,21 @@ func health(w http.ResponseWriter, _ *http.Request) { // the process is up (the show roster is in-memory, never a boot-blocking // external call). func ready(deps PublicDeps) http.HandlerFunc { - return func(w http.ResponseWriter, _ *http.Request) { + return func(w http.ResponseWriter, request *http.Request) { + if deps.NativeLSDPCheck != nil { + if err := deps.NativeLSDPCheck(request.Context()); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]any{"status": "unavailable", "service": "orion", "dependency": "native-lsdp"}) + return + } + } body := map[string]any{ "status": "ok", "service": "orion", "scenes_loaded": len(deps.Show.IDs()), } + if deps.NativeLSDPCheck != nil { + body["native_lsdp"] = map[string]any{"ready": true, "wire": "LSDP-TCP/2.0-draft2", "address": deps.Config.NativeLSDPAddress, "resource": deps.Config.NativeLSDPResource} + } writeJSON(w, http.StatusOK, body) } } diff --git a/internal/api/scene_blue_manifest.go b/internal/api/scene_blue_manifest.go new file mode 100644 index 00000000..012b322a --- /dev/null +++ b/internal/api/scene_blue_manifest.go @@ -0,0 +1,65 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/canonical" + "io" +) + +// A manifest preserves Canvas declarations/closure beside its signed executable. +// Its canonical digest checks transport integrity; it is not another signature. +// Legacy capsules without the manifest can execute their signed program, but +// cannot claim to contain a complete authoring closure. +func verifySceneBlueManifest(raw json.RawMessage, claims *attestation.Claims, sourceBytes []byte) ([]byte, error) { + if len(raw) == 0 { + return nil, nil + } + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + var value map[string]any + if decoder.Decode(&value) != nil || decoder.Decode(new(any)) != io.EOF { + return nil, errors.New("BLUE_MANIFEST_INVALID") + } + readiness, _ := value["readiness"].(map[string]any) + _, closure := value["binding_closure"].([]any) + _, declarations := value["declarations"].(map[string]any) + _, validation := value["validation"].(map[string]any) + revision, number := value["scene_revision"].(json.Number) + integer, revisionErr := revision.Int64() + // Canvas addresses the source LSML separately from its signed artifact set. + // Older source-less envelopes retain their existing artifact-set identity. + version := claims.ArtifactSetDigest + if len(sourceBytes) > 0 { + var source struct { + SceneID string `json:"scene_id"` + Version string `json:"scene_version"` + } + if json.Unmarshal(sourceBytes, &source) != nil || source.SceneID != claims.SceneID || source.Version == "" { + return nil, errors.New("BLUE_MANIFEST_SOURCE_IDENTITY_INVALID") + } + version = source.Version + } + if value["schema_version"] != "zabcanvas.scene-blue-manifest.v1" || value["scene_id"] != claims.SceneID || value["scene_version"] != version || value["revision_id"] != claims.RevisionID || !number || revisionErr != nil || integer < 1 || !closure || !declarations || !validation || readiness == nil { + return nil, errors.New("BLUE_MANIFEST_IDENTITY_INVALID") + } + for _, field := range []string{"program_ready", "binding_closure_complete", "offline_ready"} { + if _, ok := readiness[field].(bool); !ok { + return nil, errors.New("BLUE_MANIFEST_READINESS_INVALID") + } + } + missingBindings, bindings := readiness["missing_binding_ids"].([]any) + missingKeys, keys := readiness["missing_scene_blueprint_keys"].([]any) + if !bindings || !keys || readiness["offline_ready"] == true && (readiness["binding_closure_complete"] != true || len(missingBindings) != 0 || len(missingKeys) != 0) { + return nil, errors.New("BLUE_MANIFEST_READINESS_INVALID") + } + expected, _ := value["manifest_digest"].(string) + delete(value, "manifest_digest") + actual, err := canonical.Digest(value) + if err != nil || actual != expected { + return nil, errors.New("BLUE_MANIFEST_DIGEST_MISMATCH") + } + return append([]byte(nil), raw...), nil +} diff --git a/internal/api/scene_catalog.go b/internal/api/scene_catalog.go new file mode 100644 index 00000000..53851d64 --- /dev/null +++ b/internal/api/scene_catalog.go @@ -0,0 +1,190 @@ +package api + +import ( + "bytes" + "crypto/sha256" + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "github.com/ZabLaboratory/Orion/internal/attestation" + "io" + "net/http" + "os" + "path/filepath" + "sync" +) + +// Only admitted immutable source/program capsules. Live mirror state and host +// credentials are never persisted here; each replay rechecks the signature. +type SceneCatalog struct { + mu sync.Mutex + root string +} +type catalogEntry struct { + Principal string `json:"principal"` + SceneID string `json:"scene_id"` + Version string `json:"scene_version"` + StreamID string `json:"stream_id"` + Action string `json:"action"` + Intent sceneIntentRequest `json:"intent"` +} + +func OpenSceneCatalog(root string) (*SceneCatalog, error) { + if !filepath.IsAbs(root) { + return nil, errors.New("SCENE_CATALOG_ABSOLUTE_PATH_REQUIRED") + } + if err := os.MkdirAll(root, 0700); err != nil { + return nil, err + } + return &SceneCatalog{root: root}, nil +} +func catalogKey(principal, sceneID, version, streamID, action string) string { + raw, _ := json.Marshal([]string{principal, sceneID, version, streamID, action}) + sum := sha256.Sum256(raw) + return hex.EncodeToString(sum[:]) +} +func (c *SceneCatalog) put(principal string, claims *attestation.Claims, req sceneIntentRequest, envelope resolvedSceneEnvelope) error { + c.mu.Lock() + defer c.mu.Unlock() + // Normalize a Prism-cache reference to immutable admitted bytes, allowing + // recovery after that external cache has been moved/removed. Never copy it. + req.LocalArtifacts = false + req.BlueProgram = envelope.BlueProgram + req.BlueProgramDigest = envelope.BlueProgramDigest + req.LSMLBundle = envelope.LSMLBundle + req.LSMLBundleDigest = envelope.LSMLBundleDigest + req.RenderBundle = envelope.RenderBundle + req.RenderBundleDigest = envelope.RenderBundleDigest + req.BlueManifest = append(json.RawMessage(nil), envelope.BlueManifest...) + if envelope.blueProgramBytes != nil { + req.BlueProgram = base64.StdEncoding.EncodeToString(envelope.blueProgramBytes) + } + if envelope.lsmlBundleBytes != nil { + req.LSMLBundle = base64.StdEncoding.EncodeToString(envelope.lsmlBundleBytes) + } + if envelope.renderBundleBytes != nil { + req.RenderBundle = base64.StdEncoding.EncodeToString(envelope.renderBundleBytes) + } + entry := catalogEntry{Principal: principal, SceneID: claims.SceneID, Version: claims.ArtifactSetDigest, StreamID: req.StreamID, Action: req.Action, Intent: req} + raw, err := json.Marshal(entry) + if err != nil { + return err + } + if len(raw) > maxSceneIntentBytes { + return errors.New("SCENE_CATALOG_CAPSULE_LIMIT") + } + filename := catalogKey(principal, entry.SceneID, entry.Version, entry.StreamID, entry.Action) + ".json" + files, err := os.ReadDir(c.root) + if err != nil { + return err + } + count := 0 + var size int64 + for _, file := range files { + if filepath.Ext(file.Name()) != ".json" || file.Name() == filename { + continue + } + info, err := file.Info() + if err != nil { + return err + } + count++ + size += info.Size() + } + if count >= 64 || size+int64(len(raw)) > 64<<20 { + return errors.New("SCENE_CATALOG_QUOTA") + } + return writeControlFile(filepath.Join(c.root, filename), raw) +} +func (c *SceneCatalog) get(principal, sceneID, version, streamID, action string) (sceneIntentRequest, error) { + c.mu.Lock() + defer c.mu.Unlock() + file, err := os.Open(filepath.Join(c.root, catalogKey(principal, sceneID, version, streamID, action)+".json")) + if err != nil { + return sceneIntentRequest{}, err + } + defer file.Close() + raw, err := io.ReadAll(io.LimitReader(file, maxSceneIntentBytes+1)) + if err != nil || len(raw) > maxSceneIntentBytes { + return sceneIntentRequest{}, errors.New("SCENE_CATALOG_INVALID") + } + var entry catalogEntry + if json.Unmarshal(raw, &entry) != nil || entry.Principal != principal || entry.SceneID != sceneID || entry.Version != version || entry.StreamID != streamID || entry.Action != action { + return sceneIntentRequest{}, errors.New("SCENE_CATALOG_IDENTITY_MISMATCH") + } + return entry.Intent, nil +} + +// postSceneCatalog prepares bytes without taking/stepping a scene. Admission is +// identical to the embedded-local path: same principal/action/ref and verifier. +func postSceneCatalog(deps SceneIntentDeps) http.HandlerFunc { + return requireOperator(func(w http.ResponseWriter, r *http.Request) { + if !deps.EmbeddedLocal || deps.Catalog == nil { + writeOperatorError(w, 409, "SCENE_CATALOG_UNAVAILABLE", "local scene catalog unavailable") + return + } + raw, err := io.ReadAll(io.LimitReader(r.Body, maxSceneIntentBytes+1)) + var req sceneIntentRequest + if err != nil || len(raw) > maxSceneIntentBytes || json.Unmarshal(raw, &req) != nil { + writeOperatorError(w, 400, "MALFORMED_INTENT", "invalid capsule") + return + } + if req.Action != string(attestation.ActionPreparePreview) && req.Action != string(attestation.ActionTakeOnAir) { + writeOperatorError(w, 400, "UNKNOWN_ACTION", "invalid scene action") + return + } + if req.LocalArtifacts && (req.BlueProgram != "" || req.LSMLBundle != "" || req.RenderBundle != "") { + writeOperatorError(w, 400, "MALFORMED_INTENT", "local and inline artifacts cannot be combined") + return + } + principal := authSource.FromHeaders(r.Header).UserID + claims, err := attestation.Verify(req.ResolvedSceneRef, deps.Trust, attestation.Options{Principal: principal, OwnerID: deps.OwnerID, TenantID: deps.TenantID, StreamID: req.StreamID, Action: attestation.Action(req.Action), LocatorPrefix: deps.LocatorPrefix, ClockSkew: deps.AttestationClockSkew}) + if err != nil { + writeOperatorError(w, 403, "ATTESTATION_REJECTED", err.Error()) + return + } + envelope := resolvedSceneEnvelope{BlueManifest: req.BlueManifest, BlueProgram: req.BlueProgram, BlueProgramDigest: req.BlueProgramDigest, LSMLBundle: req.LSMLBundle, LSMLBundleDigest: req.LSMLBundleDigest, RenderBundle: req.RenderBundle, RenderBundleDigest: req.RenderBundleDigest} + if req.LocalArtifacts { + envelope, err = loadLocalSceneEnvelope(deps.LocalArtifactRoot, claims) + } + if err == nil { + _, err = verifySceneArtifacts(envelope, claims, deps.ProgramVerificationCache) + } + if err != nil { + writeOperatorError(w, 400, "CANVAS_ARTIFACT_DIGEST_MISMATCH", err.Error()) + return + } + if err = deps.Catalog.put(principal, claims, req, envelope); err != nil { + writeOperatorError(w, 409, "SCENE_CATALOG_WRITE_FAILED", err.Error()) + return + } + writeJSON(w, 200, map[string]any{"status": "prepared", "scene_id": claims.SceneID, "scene_version": claims.ArtifactSetDigest, "execution": "signed-program-reverified-on-selection"}) + }) +} + +func writeControlFile(path string, raw []byte) error { + if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { + return err + } + file, err := os.CreateTemp(filepath.Dir(path), ".scene-control-*.tmp") + if err != nil { + return err + } + name := file.Name() + defer os.Remove(name) + if err = file.Chmod(0600); err == nil { + _, err = io.Copy(file, bytes.NewReader(raw)) + } + if err == nil { + err = file.Sync() + } + closed := file.Close() + if err != nil { + return err + } + if closed != nil { + return closed + } + return os.Rename(name, path) +} diff --git a/internal/api/scene_catalog_test.go b/internal/api/scene_catalog_test.go new file mode 100644 index 00000000..29ac2afb --- /dev/null +++ b/internal/api/scene_catalog_test.go @@ -0,0 +1,141 @@ +package api + +import ( + "bytes" + "crypto/ed25519" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/canonical" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" +) + +func manifestForTest(t *testing.T, claims *attestation.Claims) json.RawMessage { + t.Helper() + value := map[string]any{"schema_version": "zabcanvas.scene-blue-manifest.v1", "scene_id": claims.SceneID, "scene_version": claims.ArtifactSetDigest, "scene_revision": json.Number("1"), "revision_id": claims.RevisionID, "declarations": map[string]any{"blueprints": []any{"blue-1"}}, "validation": map[string]any{"status": "validated"}, "binding_closure": []any{map[string]any{"binding_id": "blue-1", "source_digest": "immutable-blue-source"}}, "readiness": map[string]any{"program_ready": true, "offline_ready": true, "binding_closure_complete": true, "missing_binding_ids": []any{}, "missing_scene_blueprint_keys": []any{}}} + digest, err := canonical.Digest(value) + if err != nil { + t.Fatal(err) + } + value["manifest_digest"] = digest + raw, _ := json.Marshal(value) + return raw +} + +func TestLocalSceneIndexPreservesCanvasBlueManifest(t *testing.T) { + claims := &attestation.Claims{SceneID: "scene-1", RevisionID: "rev-1", ArtifactSetDigest: "sha256:source"} + manifest := manifestForTest(t, claims) + root := t.TempDir() + if err := os.MkdirAll(filepath.Join(root, "scene-index"), 0700); err != nil { + t.Fatal(err) + } + index, _ := json.Marshal(localSceneIndex{SceneID: claims.SceneID, RevisionID: claims.RevisionID, BlueManifest: manifest}) + if err := os.WriteFile(filepath.Join(root, "scene-index", "scene-1--rev-1.json"), index, 0600); err != nil { + t.Fatal(err) + } + envelope, err := loadLocalSceneEnvelope(root, claims) + if err != nil || !bytes.Equal(envelope.BlueManifest, manifest) { + t.Fatal("local source preparation dropped Canvas Blue closure", err) + } + if _, err := verifySceneBlueManifest(envelope.BlueManifest, claims, nil); err != nil { + t.Fatal(err) + } +} + +func TestSceneCatalogPreservesClosureAndReverifiesAfterReopen(t *testing.T) { + pub, priv, _ := ed25519.GenerateKey(nil) + source := []byte(`{"lsml":"1.2","scene_id":"scene-1","scene_version":"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","layout":{"type":"frame"},"defaults":{}}`) + raw, digest := canvasEnvelopeWithBundle(minimalProgram(t), source) + var envelope resolvedSceneEnvelope + if err := json.Unmarshal(raw, &envelope); err != nil { + t.Fatal(err) + } + ref := signedRef(t, priv, "canvas-key-1", attestation.ActionTakeOnAir, time.Now(), "scene-1", digest) + trust := attestation.TrustSet{"canvas-key-1": pub} + options := attestation.Options{Principal: "operator-1", OwnerID: "owner-1", TenantID: "tenant-1", StreamID: "stream-1", Action: attestation.ActionTakeOnAir, LocatorPrefix: "scenes/"} + claims, err := attestation.Verify(ref, trust, options) + if err != nil { + t.Fatal(err) + } + envelope.BlueManifest = manifestForTest(t, claims) + root := filepath.Join(t.TempDir(), "catalog") + catalog, err := OpenSceneCatalog(root) + if err != nil { + t.Fatal(err) + } + req := sceneIntentRequest{StreamID: "stream-1", Action: "take-on-air", ResolvedSceneRef: ref, BlueProgram: envelope.BlueProgram, BlueProgramDigest: envelope.BlueProgramDigest, LSMLBundle: envelope.LSMLBundle, LSMLBundleDigest: envelope.LSMLBundleDigest, BlueManifest: envelope.BlueManifest} + deps := SceneIntentDeps{EmbeddedLocal: true, Catalog: catalog, Trust: trust, OwnerID: "owner-1", TenantID: "tenant-1", LocatorPrefix: "scenes/"} + prepare := func(request sceneIntentRequest) int { + raw, _ := json.Marshal(request) + r := httptest.NewRequest("POST", "/", bytes.NewReader(raw)) + r.Header.Set("X-Authenticated-User", "operator-1") + r.Header.Set("X-Authenticated-Role", "operator") + response := httptest.NewRecorder() + postSceneCatalog(deps)(response, r) + return response.Code + } + if code := prepare(req); code != 200 { + t.Fatalf("admission %d", code) + } + catalog, err = OpenSceneCatalog(root) + if err != nil { + t.Fatal(err) + } + restored, err := catalog.get("operator-1", claims.SceneID, claims.ArtifactSetDigest, "stream-1", "take-on-air") + if err != nil || !bytes.Equal(restored.BlueManifest, req.BlueManifest) { + t.Fatalf("closure lost: %v", err) + } + artifacts, err := verifySceneArtifacts(resolvedSceneEnvelope{BlueManifest: restored.BlueManifest, BlueProgram: restored.BlueProgram, BlueProgramDigest: restored.BlueProgramDigest, LSMLBundle: restored.LSMLBundle, LSMLBundleDigest: restored.LSMLBundleDigest}, claims, nil) + if err != nil || !bytes.Equal(artifacts.Source, source) || len(artifacts.BlueManifest) == 0 { + t.Fatal("immutable capsule failed replay", err) + } + for _, key := range []struct{ principal, action, version string }{{"another-user", "take-on-air", claims.ArtifactSetDigest}, {"operator-1", "prepare-preview", claims.ArtifactSetDigest}, {"operator-1", "take-on-air", "different"}} { + if _, err := catalog.get(key.principal, claims.SceneID, key.version, "stream-1", key.action); err == nil { + t.Fatal("catalog crossed authority boundary") + } + } + bad := req + bad.BlueManifest = bytes.Replace(req.BlueManifest, []byte("immutable-blue-source"), []byte("tampered-blue-source"), 1) + if code := prepare(bad); code == 200 { + t.Fatal("corrupt closure admitted") + } + bad = req + bad.ResolvedSceneRef = signedRef(t, priv, "canvas-key-1", attestation.ActionTakeOnAir, time.Now().Add(-time.Hour), "scene-1", digest) + if code := prepare(bad); code != 403 { + t.Fatalf("expired authority accepted: %d", code) + } + // A catalog entry is private immutable authoring data, never an observation. + files, _ := os.ReadDir(root) + if len(files) != 1 { + t.Fatal("unexpected catalog writes") + } +} + +func TestSceneControlFileValidationAndDesiredOnlyPersistence(t *testing.T) { + catalog, _ := OpenSceneCatalog(filepath.Join(t.TempDir(), "catalog")) + path := filepath.Join(t.TempDir(), "selection.lsml") + deps := SceneIntentDeps{EmbeddedLocal: true, Catalog: catalog} + controller, err := OpenSceneControl(deps, nil, path, nil) + if err != nil { + t.Fatal(err) + } + controller.desired["program"] = SceneSelection{SceneID: "scene-1", Version: "sha256:version", StreamID: "stream-1"} + if err = controller.persist(); err != nil { + t.Fatal(err) + } + reopened, err := OpenSceneControl(deps, nil, path, nil) + if err != nil || reopened.desired["program"].SceneID != "scene-1" { + t.Fatal("desired selection lost", err) + } + for _, raw := range []string{`{}`, `{"lsml":"1.2","schema":"wrong"}`} { + if err := os.WriteFile(path, []byte(raw), 0600); err != nil { + t.Fatal(err) + } + if _, err = OpenSceneControl(deps, nil, path, nil); err == nil { + t.Fatal("corrupt control admitted") + } + } +} diff --git a/internal/api/scene_control.go b/internal/api/scene_control.go new file mode 100644 index 00000000..455d55d4 --- /dev/null +++ b/internal/api/scene_control.go @@ -0,0 +1,344 @@ +package api + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" + "net/http" + "os" + "path/filepath" + "sync" + "time" +) + +type SceneSelection struct { + SceneID string `json:"scene_id"` + Version string `json:"scene_version"` + StreamID string `json:"stream_id"` +} +type SceneControlDocument struct { + LSML string `json:"lsml"` + Schema string `json:"schema"` + SceneID string `json:"scene_id"` + Layout map[string]any `json:"layout"` + Defaults struct { + Desired map[string]SceneSelection `json:"desired"` + Observed map[string]any `json:"observed"` + LaneCommit *lsdpreception.LaneCommit `json:"lane_commit,omitempty"` + ReleaseProgram *lsdpreception.ProgramRelease `json:"release_program,omitempty"` + InspectProgram *lsdpreception.ProgramInspect `json:"inspect_program,omitempty"` + } `json:"defaults"` +} + +func NewSceneControlDocument() SceneControlDocument { + d := SceneControlDocument{LSML: "1.2", Schema: "orion.scene-control.v1", SceneID: "orion-scene-control", Layout: map[string]any{"type": "frame", "children": []any{}}} + d.Defaults.Desired = map[string]SceneSelection{} + d.Defaults.Observed = map[string]any{} + return d +} + +type SceneControl struct { + deps SceneIntentDeps + reception *lsdpreception.Reception + path string + headers http.Header + mu sync.Mutex + desired map[string]SceneSelection + current map[string]string + opMu sync.Mutex + seenCommit string + seenRelease string + seenInspect string + inFlight map[string]context.CancelFunc +} + +func OpenSceneControl(deps SceneIntentDeps, reception *lsdpreception.Reception, path string, headers http.Header) (*SceneControl, error) { + if deps.Catalog == nil || !deps.EmbeddedLocal || !filepath.IsAbs(path) { + return nil, errors.New("SCENE_CONTROL_CONFIG_INVALID") + } + c := &SceneControl{deps: deps, reception: reception, path: path, headers: headers.Clone(), desired: map[string]SceneSelection{}, current: map[string]string{}, inFlight: map[string]context.CancelFunc{}} + raw, err := os.ReadFile(path) + if err == nil { + if len(raw) > 65536 { + return nil, errors.New("SCENE_CONTROL_LIMIT") + } + var d SceneControlDocument + if json.Unmarshal(raw, &d) != nil || validateSceneControl(d) != nil { + return nil, errors.New("SCENE_CONTROL_INVALID") + } + c.desired = d.Defaults.Desired + } else if !os.IsNotExist(err) { + return nil, err + } + return c, nil +} +func validateSceneControl(d SceneControlDocument) error { + if d.LSML != "1.2" || d.Schema != "orion.scene-control.v1" || d.SceneID != "orion-scene-control" || d.Layout == nil || d.Defaults.Desired == nil || d.Defaults.Observed == nil || len(d.Defaults.Desired) > 2 { + return errors.New("SCENE_CONTROL_INVALID") + } + for lane, s := range d.Defaults.Desired { + if lane != "program" && lane != "preview" || s.SceneID == "" || s.Version == "" || s.StreamID == "" || len(s.SceneID) > 128 || len(s.Version) > 128 || len(s.StreamID) > 128 { + return errors.New("SCENE_CONTROL_SELECTION_INVALID") + } + } + return nil +} +func selectionKey(s SceneSelection) string { + raw, _ := json.Marshal(s) + hash := sha256.Sum256(raw) + return hex.EncodeToString(hash[:]) +} + +// Run watches only the shared native resource. Changes to observed fields never +// trigger another Blue activation. Each lane cancels/joins its own predecessor. +func (c *SceneControl) Run(ctx context.Context) error { + state, err := c.reception.Read(ctx, "orion/state") + if err != nil { + return err + } + root, _ := state.(map[string]any) + if root["scene_control"] == nil { + d := NewSceneControlDocument() + d.Defaults.Desired = c.desired + if err = c.reception.WriteLeaf(ctx, "orion/state", "/scene_control", d); err != nil { + return err + } + } + queues := map[string]chan SceneSelection{"program": make(chan SceneSelection, 1), "preview": make(chan SceneSelection, 1)} + var workers sync.WaitGroup + for lane, queue := range queues { + workers.Add(1) + go func(lane string, queue chan SceneSelection) { defer workers.Done(); c.lane(ctx, lane, queue) }(lane, queue) + } + defer workers.Wait() + // Observation writes and reconnect snapshots are not new selection intent. + // Keep failed attempts admitted once as well: otherwise their own failed + // observation schedules another attempt and creates an unbounded write loop. + lastDesired := map[string]SceneSelection{} + c.reception.Watch(ctx, "orion/state", func(state any) { + root, _ := state.(map[string]any) + raw, err := json.Marshal(root["scene_control"]) + var d SceneControlDocument + if err != nil || len(raw) > 65536 || json.Unmarshal(raw, &d) != nil || validateSceneControl(d) != nil { + c.log("invalid native scene control", errors.New("SCENE_CONTROL_INVALID")) + return + } + c.mu.Lock() + c.desired = d.Defaults.Desired + c.mu.Unlock() + if d.Defaults.LaneCommit != nil { + raw, _ := json.Marshal(d.Defaults.LaneCommit) + if string(raw) != c.seenCommit { + c.seenCommit = string(raw) + if desired, committed := c.commitLaneRoles(ctx, *d.Defaults.LaneCommit, d.Defaults.Desired, d.Defaults.Observed); committed { + d.Defaults.Desired = desired + } + } + } + if d.Defaults.InspectProgram != nil { + raw, _ := json.Marshal(d.Defaults.InspectProgram) + if string(raw) != c.seenInspect { + c.seenInspect = string(raw) + c.inspectProgram(ctx, *d.Defaults.InspectProgram) + } + } + if d.Defaults.ReleaseProgram != nil { + raw, _ := json.Marshal(d.Defaults.ReleaseProgram) + if string(raw) != c.seenRelease { + c.seenRelease = string(raw) + releaseCtx, cancel := context.WithTimeout(ctx, 20*time.Second) + if desired, changed := c.releaseProgram(releaseCtx, *d.Defaults.ReleaseProgram, d.Defaults.Desired); changed { + d.Defaults.Desired = desired + } + cancel() + } + } + for lane := range lastDesired { + if _, exists := d.Defaults.Desired[lane]; !exists { + delete(lastDesired, lane) + } + } + for lane, selection := range d.Defaults.Desired { + if previous, exists := lastDesired[lane]; exists && previous == selection { + continue + } + lastDesired[lane] = selection + queue := queues[lane] + select { + case queue <- selection: + default: + select { + case <-queue: + default: + } + queue <- selection + } + } + }, func(err error) { c.log("scene-control subscription reconnecting", err) }) + return ctx.Err() +} +func (c *SceneControl) lane(ctx context.Context, lane string, queue chan SceneSelection) { + var cancel context.CancelFunc + var done chan struct{} + defer func() { + if cancel != nil { + cancel() + } + if done != nil { + <-done + } + }() + for { + select { + case <-ctx.Done(): + return + case selection := <-queue: + key := selectionKey(selection) + c.mu.Lock() + current := c.current[lane] + desired := c.desired[lane] + c.mu.Unlock() + if key == current || selection != desired { + continue + } + if cancel != nil { + cancel() + } + if done != nil { + <-done + } + attempt, stopAttempt := context.WithTimeout(ctx, 40*time.Second) + cancel = stopAttempt + c.mu.Lock() + if c.inFlight == nil { + c.inFlight = map[string]context.CancelFunc{} + } + c.inFlight[lane] = stopAttempt + c.mu.Unlock() + taskDone := make(chan struct{}) + done = taskDone + go func() { + defer close(taskDone) + defer stopAttempt() + c.opMu.Lock() + defer c.opMu.Unlock() + c.mu.Lock() + valid := c.desired[lane] == selection && c.current[lane] != key + c.mu.Unlock() + if valid { + c.selectScene(attempt, lane, selection) + } + }() + } + } +} +func (c *SceneControl) persist() error { + c.mu.Lock() + defer c.mu.Unlock() + d := NewSceneControlDocument() + d.Defaults.Desired = c.desired + raw, err := json.Marshal(d) + if err != nil { + return err + } + return writeControlFile(c.path, raw) +} +func (c *SceneControl) selectScene(ctx context.Context, lane string, selection SceneSelection) { + id, err := native.NewID() + if err != nil { + c.log("selection identity unavailable", err) + return + } + observe := func(status, reason string) { + ackCtx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + value := map[string]any{"activation_id": id, "scene_id": selection.SceneID, "scene_version": selection.Version, "status": status} + if reason != "" { + value["reason"] = reason + } + if err := c.reception.WriteLeaf(ackCtx, "orion/state", "/scene_control/defaults/observed/"+lane, value); err != nil { + c.log("selection observation unavailable", err) + } + } + if err = c.persist(); err != nil { + observe("failed", "SCENE_CONTROL_PERSIST_FAILED") + return + } + observe("preparing", "") + action := attestation.ActionPreparePreview + if lane == "program" { + action = attestation.ActionTakeOnAir + } + principal := authSource.FromHeaders(c.headers).UserID + req, err := c.deps.Catalog.get(principal, selection.SceneID, selection.Version, selection.StreamID, string(action)) + if err != nil { + observe("failed", "SCENE_CATALOG_UNAVAILABLE") + return + } + req.IntentID = id + req.IdempotencyKey = id + raw, err := json.Marshal(req) + if err != nil { + observe("failed", "SCENE_CATALOG_INVALID") + return + } + request, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://127.0.0.1/api/v1/host/scene-intent", bytes.NewReader(raw)) + if err != nil { + observe("failed", "SCENE_CONTROL_REQUEST_FAILED") + return + } + request.Header = c.headers.Clone() + response := &controlResponse{header: http.Header{}} + postSceneIntent(c.deps)(response, request) + var result sceneIntentResponse + if json.Unmarshal(response.body.Bytes(), &result) != nil { + observe("failed", "SCENE_CONTROL_RESPONSE_INVALID") + return + } + if response.status != http.StatusOK { + status := "failed" + if ctx.Err() != nil { + status = "superseded" + } + observe(status, result.Reason) + return + } + observe("active", "") + c.mu.Lock() + c.current[lane] = selectionKey(selection) + c.mu.Unlock() +} +func (c *SceneControl) log(message string, err error) { + if c.deps.Logger != nil { + c.deps.Logger.Warn(message, "err", err) + } +} + +type controlResponse struct { + header http.Header + body bytes.Buffer + status int +} + +func (w *controlResponse) Header() http.Header { return w.header } +func (w *controlResponse) WriteHeader(status int) { + if w.status == 0 { + w.status = status + } +} +func (w *controlResponse) Write(bytes []byte) (int, error) { + if w.status == 0 { + w.status = 200 + } + if w.body.Len()+len(bytes) > 65536 { + return 0, fmt.Errorf("scene control response limit") + } + return w.body.Write(bytes) +} diff --git a/internal/api/scene_control_failure_native_test.go b/internal/api/scene_control_failure_native_test.go new file mode 100644 index 00000000..10119f21 --- /dev/null +++ b/internal/api/scene_control_failure_native_test.go @@ -0,0 +1,92 @@ +package api + +import ( + "context" + "encoding/json" + "net/http" + "os" + "path/filepath" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/lsdpreception" +) + +// Uses only the disposable Rust node owned by the private test launcher. +func TestSceneControlFailedSelectionDoesNotLoopNative(t *testing.T) { + address := os.Getenv("ORION_TEST_PRIVATE_LANE_ADDRESS") + if address == "" { + t.Skip("requires private native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 8*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + catalog, err := OpenSceneCatalog(filepath.Join(t.TempDir(), "catalog")) + if err != nil { + t.Fatal(err) + } + deps := SceneIntentDeps{EmbeddedLocal: true, Catalog: catalog} + control, err := OpenSceneControl(deps, reception, filepath.Join(t.TempDir(), "selection.lsml"), http.Header{}) + if err != nil { + t.Fatal(err) + } + document := NewSceneControlDocument() + document.Defaults.Desired["program"] = SceneSelection{"missing-catalog-scene", "version-1", "live"} + if err := reception.WriteLeaf(ctx, "orion/state", "/scene_control", document); err != nil { + t.Fatal(err) + } + done := make(chan struct{}) + go func() { defer close(done); _ = control.Run(ctx) }() + defer func() { cancel(); <-done }() + read := func() (SceneControlDocument, string) { + state, err := reception.Read(ctx, "orion/state") + if err != nil { + t.Fatal(err) + } + raw, _ := json.Marshal(state.(map[string]any)["scene_control"]) + var doc SceneControlDocument + if err := json.Unmarshal(raw, &doc); err != nil { + t.Fatal(err) + } + observed, _ := doc.Defaults.Observed["program"].(map[string]any) + id, _ := observed["activation_id"].(string) + return doc, id + } + awaitFailure := func(previous string) string { + for ctx.Err() == nil { + doc, id := read() + observed, _ := doc.Defaults.Observed["program"].(map[string]any) + if id != "" && id != previous && observed["status"] == "failed" && observed["reason"] == "SCENE_CATALOG_UNAVAILABLE" { + return id + } + time.Sleep(10 * time.Millisecond) + } + t.Fatal("failure observation unavailable") + return "" + } + first := awaitFailure("") + for i := 0; i < 4; i++ { + if err := reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/observed/probe", i); err != nil { + t.Fatal(err) + } + } + time.Sleep(250 * time.Millisecond) + stable, id := read() + if id != first { + t.Fatal("observed updates retried failed selection", first, id) + } + stable.Defaults.Desired["program"] = SceneSelection{"missing-catalog-scene", "version-2", "live"} + if err := reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/desired", stable.Defaults.Desired); err != nil { + t.Fatal(err) + } + second := awaitFailure(first) + time.Sleep(250 * time.Millisecond) + _, id = read() + if id != second { + t.Fatal("changed desired selection admitted repeatedly", second, id) + } + t.Log("NATIVE_FAILED_SELECTION_PROOF: one failed attempt per desired identity; four observed writes do not retry; changed version admits exactly one new attempt") +} diff --git a/internal/api/scene_control_native_test.go b/internal/api/scene_control_native_test.go new file mode 100644 index 00000000..8cdc00e4 --- /dev/null +++ b/internal/api/scene_control_native_test.go @@ -0,0 +1,330 @@ +package api + +import ( + "bytes" + "context" + "crypto/ed25519" + "encoding/base64" + "encoding/json" + "fmt" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/effects" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/runtime" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "strings" + "testing" + "time" +) + +// Complete existing scene + unmodified published program + real native receiver +// + real CEF observer. Local test signatures are not production Canvas admission. +func TestRealNativeSceneControlVisual(t *testing.T) { + if os.Getenv("ORION_TEST_SCENE_CONTROL_VISUAL") == "" { + t.Skip("requires actual CEF scene-control observer") + } + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second) + defer cancel() + source, err := os.ReadFile(os.Getenv("ORION_TEST_LSML_PATH")) + if err != nil { + t.Fatal(err) + } + var original map[string]any + if err := json.Unmarshal(source, &original); err != nil { + t.Fatal(err) + } + id, version := original["scene_id"].(string), original["scene_version"].(string) + program, err := os.ReadFile("testdata/scene-lec-lck.program.json") + if err != nil { + t.Fatal(err) + } + envelopeBytes, digest := canvasEnvelopeWithBundle(program, source) + var envelope resolvedSceneEnvelope + if err := json.Unmarshal(envelopeBytes, &envelope); err != nil { + t.Fatal(err) + } + reception, err := lsdpreception.New(os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), "orion/state") + if err != nil { + t.Fatal(err) + } + producer := lsdpreception.NewProducer(ctx, reception) + defer producer.Close() + hub := lsdpreception.NewHub(producer, testLogger()) + pub, priv, _ := ed25519.GenerateKey(nil) + reSign := func(version string) string { + token := signedRef(t, priv, "canvas-key-1", attestation.ActionTakeOnAir, time.Now(), id, digest) + parts := strings.Split(token, ".") + raw, _ := base64.RawURLEncoding.DecodeString(parts[1]) + var claims map[string]any + if err := json.Unmarshal(raw, &claims); err != nil { + t.Fatal(err) + } + claims["artifact_set_digest"] = version + claims["scene_digest"] = digest + raw, _ = json.Marshal(claims) + parts[1] = base64.RawURLEncoding.EncodeToString(raw) + parts[2] = base64.RawURLEncoding.EncodeToString(ed25519.Sign(priv, []byte(parts[0]+"."+parts[1]))) + return strings.Join(parts, ".") + } + root := t.TempDir() + catalog, err := OpenSceneCatalog(filepath.Join(root, "catalog")) + if err != nil { + t.Fatal(err) + } + deps := SceneIntentDeps{Trust: attestation.TrustSet{"canvas-key-1": pub}, LocatorPrefix: "scenes/", OwnerID: "owner-1", TenantID: "tenant-1", EmbeddedLocal: true, Host: bluehost.NewHost(), Catalog: catalog, Bridges: bluewire.NewRegistry(), WireFlush: producer.Flush, Logger: testLogger(), Idempotency: NewIdempotencyCache(), + Effects: bluehost.EffectDeps{DB: effects.NewDBQueryClient(os.Getenv("ORION_TEST_QUERY_GATEWAY"), "", &http.Client{Timeout: 12 * time.Second}), DataSources: map[string]effects.DataSource{"truth": {Name: "truth", Svc: "truth"}, "ranking": {Name: "ranking", Svc: "ranking"}}}} + laneFor := func(slot bluehost.Slot) *lsdpreception.Lane { + if slot == bluehost.SlotOnAir { + return hub.Lane("program") + } + return hub.Lane("preview") + } + deps.MirrorFor = func(id, version string, slot bluehost.Slot, source []byte) runtime.SceneMirror { + return laneFor(slot).MirrorForLSML(id, version, source) + } + deps.Activate = func(id, _ string, slot bluehost.Slot) { laneFor(slot).SetActive(id) } + deps.BeginLaneTransition = func(slot bluehost.Slot) func(bool) { return laneFor(slot).BeginTransition() } + deps.PresentScene = NativeScenePresenter(reception, func(slot bluehost.Slot, id, version string, raw []byte) (map[string]any, error) { + return laneFor(slot).PrepareSource(id, version, raw) + }) + defer func() { + deps.Bridges.StopAll() + if err := deps.Host.Release(bluehost.SlotOnAir, "test"); err != nil { + t.Fatal(err) + } + if err := deps.Host.Release(bluehost.SlotPreview, "test"); err != nil { + t.Fatal(err) + } + }() + headers := http.Header{"X-Authenticated-User": []string{"operator-1"}, "X-Authenticated-Role": []string{"operator"}} + makeReq := func(action, version string) sceneIntentRequest { + return sceneIntentRequest{IntentID: "prepare-catalog", StreamID: "stream-1", Action: action, ResolvedSceneRef: reSign(version), BlueProgram: envelope.BlueProgram, BlueProgramDigest: envelope.BlueProgramDigest, LSMLBundle: envelope.LSMLBundle, LSMLBundleDigest: envelope.LSMLBundleDigest} + } + for _, action := range []string{"prepare-preview", "take-on-air"} { + raw, _ := json.Marshal(makeReq(action, version)) + request := httptest.NewRequest("POST", "/", bytes.NewReader(raw)) + request.Header = headers.Clone() + response := httptest.NewRecorder() + postSceneCatalog(deps)(response, request) + if response.Code != 200 { + t.Fatalf("catalog admission: %s", response.Body.String()) + } + } + path := filepath.Join(root, "selection.lsml") + controller, err := OpenSceneControl(deps, reception, path, headers) + if err != nil { + t.Fatal(err) + } + controlCtx, stopControl := context.WithCancel(ctx) + controlDone := make(chan error, 1) + go func() { controlDone <- controller.Run(controlCtx) }() + defer func() { stopControl(); <-controlDone }() + wait := func(check func(map[string]any) bool) { + t.Helper() + until := time.Now().Add(20 * time.Second) + for time.Now().Before(until) { + state, err := reception.Read(ctx, "orion/state") + if err == nil && check(state.(map[string]any)) { + return + } + time.Sleep(40 * time.Millisecond) + } + t.Fatal("native scene-control condition timed out") + } + wait(func(state map[string]any) bool { return state["scene_control"] != nil }) + selected := func(lane string) bool { + state, err := reception.Read(ctx, "orion/state") + if err != nil { + return false + } + root, _ := state.(map[string]any) + control, _ := root["scene_control"].(map[string]any) + defaults, _ := control["defaults"].(map[string]any) + observed, _ := defaults["observed"].(map[string]any) + status, _ := observed[lane].(map[string]any) + return status["status"] == "active" + } + publishPhase := func(phase string) { + raw, _ := json.Marshal(map[string]any{"type": "control-proof", "phase": phase}) + response, err := http.Post(os.Getenv("ORION_TEST_LOCAL_HTTP")+"/__render_diag", "application/json", bytes.NewReader(raw)) + if err != nil { + t.Fatal(err) + } + response.Body.Close() + time.Sleep(1200 * time.Millisecond) + } + selection := SceneSelection{SceneID: id, Version: version, StreamID: "stream-1"} + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/desired/program", selection); err != nil { + t.Fatal(err) + } + wait(func(map[string]any) bool { return selected("program") }) + if !deps.Host.Serving(bluehost.SlotOnAir, id, digest) { + t.Fatal("Program identity not admitted") + } + publishPhase("program-active") + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control/defaults/desired/preview", selection); err != nil { + t.Fatal(err) + } + wait(func(map[string]any) bool { return selected("preview") }) + publishPhase("preview-active") + // Discover every authored command through the same contracts an operator + // consumes. No command name or business-output oracle selects the coverage. + var portable struct{ Entrypoints []struct{ Kind string } } + if err = json.Unmarshal(program, &portable); err != nil { + t.Fatal(err) + } + declaredCalls := 0 + for _, entry := range portable.Entrypoints { + if entry.Kind == "call" { + declaredCalls++ + } + } + var matchPayload any + for _, lane := range []string{"program", "preview"} { + selector := "" + if lane == "preview" { + selector = "?target=preview" + } + contractsRequest := httptest.NewRequest("GET", "/api/v1/cockpit/contracts?stream_id=stream-1"+func() string { + if lane == "preview" { + return "&target=preview" + } + return "" + }(), nil) + contractsRequest.Header = headers.Clone() + contractsResponse := httptest.NewRecorder() + public := PublicDeps{SceneIntent: &deps, NativeLSDPFlush: producer.Flush, Logger: testLogger()} + getCockpitContracts(public)(contractsResponse, contractsRequest) + var contracts cockpitContracts + if contractsResponse.Code != 200 || json.Unmarshal(contractsResponse.Body.Bytes(), &contracts) != nil || len(contracts.Triggers) != declaredCalls || declaredCalls == 0 { + t.Fatalf("command discovery incomplete: %s", contractsResponse.Body.String()) + } + for index, command := range contracts.Triggers { + var ui struct{ Widget string } + if len(command.UI) > 0 && json.Unmarshal(command.UI, &ui) != nil { + t.Fatal("invalid declared command UI") + } + var payload any + switch ui.Widget { + case "": + case "match-selector": + // Test-input acquisition only, using this published UI contract. + // Orion never knows the meaning of the operator's opaque payload. + if matchPayload == nil { + rows, queryErr := deps.Effects.DB.Query(ctx, deps.Effects.DataSources["truth"], json.RawMessage(`{"table":"matches","select":["id"],"order":[{"column":"played_at","direction":"desc"}],"limit":1}`)) + if queryErr != nil { + t.Fatal(queryErr) + } + var actual []map[string]any + if json.Unmarshal(rows.Rows, &actual) != nil || len(actual) != 1 || actual[0]["id"] == nil { + t.Fatal("match-selector input unavailable") + } + matchPayload = map[string]any{"match_id": actual[0]["id"]} + } + payload = matchPayload + default: + t.Fatalf("test payload not provided for widget %q; command not covered", ui.Widget) + } + body, _ := json.Marshal(map[string]any{"payload": payload}) + path := "/api/v1/operator/call/" + url.PathEscape(command.BlueprintKey) + "/" + url.PathEscape(command.EntrypointID) + selector + request := httptest.NewRequest("POST", path, bytes.NewReader(body)) + request.Header = headers.Clone() + request.SetPathValue("blueprint_id", command.BlueprintKey) + request.SetPathValue("entrypoint_id", command.EntrypointID) + response := httptest.NewRecorder() + postOperatorCall(public)(response, request) + if response.Code != 202 { + t.Fatalf("operator %s/%s: %d %s", lane, command.EntrypointID, response.Code, response.Body.String()) + } + requireDispatchReceipt(t, response, "fired") + state, readErr := reception.Read(ctx, "solar/"+lane) + if readErr != nil { + t.Fatal(readErr) + } + doc, _ := state.(map[string]any) + if doc["scene_id"] != id || doc["scene_version"] != version { + t.Fatal("command delivered to a different scene") + } + phase := fmt.Sprintf("%s-command-%d", lane, index) + var receipt any + if err := json.Unmarshal(response.Body.Bytes(), &receipt); err != nil { + t.Fatal(err) + } + actual, _ := json.Marshal(map[string]any{"phase": phase, "lane": lane, "entrypoint": command.EntrypointID, "path": path, "receipt": receipt, "nativeStateRead": true, "projection": doc["x-orion"]}) + t.Log("REAL_OPERATOR_NATIVE_PROOF " + string(actual)) + publishPhase(phase) + } + } + bridge := deps.Bridges.Current(bluehost.SlotOnAir) + oldDigest := deps.Host.Digest(bluehost.SlotOnAir) + bad := makeReq("take-on-air", "sha256:"+strings.Repeat("f", 64)) + bad.IntentID = "failed-stage" + bad.IdempotencyKey = "failed-stage" + raw, _ := json.Marshal(bad) + request := httptest.NewRequest("POST", "/", bytes.NewReader(raw)) + request.Header = headers.Clone() + response := httptest.NewRecorder() + postSceneIntent(deps)(response, request) + if response.Code == 200 || deps.Host.Digest(bluehost.SlotOnAir) != oldDigest || deps.Bridges.Current(bluehost.SlotOnAir) != bridge { + t.Fatalf("failed source selection displaced active Blue: %s", response.Body.String()) + } + publishPhase("rollback") + // The crash observer kills only the owned Rust child after this marker. + publishPhase("ready-for-crash") + time.Sleep(3 * time.Second) + if err = producer.Check(ctx); err != nil { + t.Fatal(err) + } + publishPhase("after-crash") + // Fresh controller + fresh Blue host reconstruct from the durable desired + // config and reopened immutable catalog, after the native control is removed. + stopControl() + <-controlDone + deps.Bridges.StopAll() + if err := deps.Host.Release(bluehost.SlotOnAir, "restart"); err != nil { + t.Fatal(err) + } + if err := deps.Host.Release(bluehost.SlotPreview, "restart"); err != nil { + t.Fatal(err) + } + deps.Host = bluehost.NewHost() + deps.Bridges = bluewire.NewRegistry() + deps.Catalog, err = OpenSceneCatalog(filepath.Join(root, "catalog")) + if err != nil { + t.Fatal(err) + } + if err = reception.WriteLeaf(ctx, "orion/state", "/scene_control", nil); err != nil { + t.Fatal(err) + } + controller, err = OpenSceneControl(deps, reception, path, headers) + if err != nil { + t.Fatal(err) + } + controlCtx, stopControl = context.WithCancel(ctx) + defer stopControl() + controlDone = make(chan error, 1) + go func() { controlDone <- controller.Run(controlCtx) }() + wait(func(map[string]any) bool { return selected("program") && selected("preview") }) + if !deps.Host.Serving(bluehost.SlotOnAir, id, digest) || !deps.Host.Serving(bluehost.SlotPreview, id, digest) { + t.Fatal("fresh hosts not restored from owned cache") + } + publishPhase("orion-restart") + saved, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var persisted SceneControlDocument + if json.Unmarshal(saved, &persisted) != nil || len(persisted.Defaults.Desired) != 2 || len(persisted.Defaults.Observed) != 0 { + t.Fatal("durable selection contains runtime state") + } + if after, err := os.ReadFile(os.Getenv("ORION_TEST_LSML_PATH")); err != nil || !bytes.Equal(source, after) { + t.Fatal("source LSML mutated") + } + t.Log("REAL_SCENE_CONTROL_PROOF PASS: signed catalog, desired LSML, two Solar lanes, every discovered command, exact old bridge after failed stage, receiver recovery, immutable source") +} diff --git a/internal/api/scene_intent.go b/internal/api/scene_intent.go index 8e7e0857..b80a765c 100644 --- a/internal/api/scene_intent.go +++ b/internal/api/scene_intent.go @@ -18,12 +18,13 @@ import ( "github.com/ZabLaboratory/Orion/internal/bluehost" "github.com/ZabLaboratory/Orion/internal/bluewire" "github.com/ZabLaboratory/Orion/internal/compiler" - "github.com/ZabLaboratory/Orion/internal/providers" + "github.com/ZabLaboratory/Orion/internal/lsdpreception" "github.com/ZabLaboratory/Orion/internal/runtime" "github.com/ZabLaboratory/Orion/internal/workload" "io" "log/slog" "net/http" + "strings" "time" ) @@ -75,11 +76,11 @@ type SceneIntentDeps struct { // read by the embedded-local path after the signed scene ref has passed // attestation verification. LocalArtifactRoot string + Catalog *SceneCatalog - // StaticBundleCompiler converts ZabCanvas authoring LSML into the Solar - // RenderBundle and returns its initial literal state. Production wiring - // supplies the compiler; nil keeps legacy test doubles and old envelopes - // byte-compatible until the stateless surface is enabled there. + // StaticBundleCompiler serves explicit render validation and editable + // preview compatibility. Scene-intent never invokes it: Solar loads pinned + // LSMLZ from ZabCanvas and Vision renders the source directly. StaticBundleCompiler func(raw []byte, sceneID, sceneVersion string) ([]byte, map[string]json.RawMessage, error) // StaticRenderBundleCompiler avoids a JSON roundtrip for in-process Preview. // Optional: byte-only integrations keep the existing decode/error behavior. @@ -134,36 +135,31 @@ type SceneIntentDeps struct { // regardless of flux: a prepare-preview projected its deltas onto the // antenne, silently. // - // sceneVersion is required too (ORION-TAKE-SLOT-IDENTITY, Blue#345): - // startBridge passes claims.SceneDigest, the SAME digest Prepare/Take - // committed on the slot. Before this, the call site hardcoded "" here, - // so whatever the LSDP kit told the client its scene_version was (""), - // the client would echo back as ?v= on GET .../render-bundle — a value - // that, post-#401, can never match host.Digest(slot). Keying the - // resolver correctly (#401, this unit's Take fix) is necessary but not - // sufficient on its own: the client also has to be TOLD the value that - // will actually match. For a NO-PROGRAM ref (#398, Decision A) this - // value is the bundle hash (scene_digest == artifact_set_digest), so - // it also equals the scene_version the bundle itself carries — the - // client-side lumencast check passes by construction. For a - // with-program ref the bundle-side mismatch remains, out of this - // unit's scope (separate chantier). + // sceneVersion is the admitted artifact-set digest used to key generations. + // The native mirror preserves source.scene_version for Solar's exact Canvas + // fetch and carries this artifact-set identity in x-orion-artifact-set. + // Blue runtime lookup remains keyed by SceneDigest. // - // bundle is the slot's LSML render-bundle bytes (deps.Host.Bundle(slot), - // the value SetBundle stored for the Prepare/Take that is starting this - // bridge) — the ONLY render-bundle artefact this path ever holds; - // startBridge passes it through so the bound-leaf gate + // bundle is the validated LSML source bytes. startBridge passes them to + // MirrorForLSML so the bound-leaf gate // (internal/lsdp.boundLeafSet, #396) actually executes on the stateless - // path instead of running permanently disabled on a hardcoded nil. May - // be nil (no lsml_bundle in the envelope), which correctly disables the - // gate — same fail-open posture as the legacy path's binding-less - // bundle. + // path instead of running permanently disabled on a hardcoded nil. It may + // be nil when the envelope carries no source, which preserves the existing + // fail-open behavior for source-less scenes. MirrorFor func(sceneID, sceneVersion string, slot bluehost.Slot, bundle []byte) runtime.SceneMirror // Activate flips the selected LSDP wire after the first real snapshot has // been applied. Registration and activation stay separate so a connected // client never receives an empty keyframe before the validated bundle is // seeded. Activate func(sceneID, sceneVersion string, slot bluehost.Slot) + // WireFlush requires the native receiver's application ACK before success. + WireFlush func(context.Context) error + PresentScene ScenePresenter + BeginLaneTransition func(bluehost.Slot) func(bool) + CommitLaneRoles func(context.Context, lsdpreception.LaneCommit) lsdpreception.LaneCommitReceipt + CheckProgramRelease func(lsdpreception.ProgramRelease) lsdpreception.ProgramReleaseReceipt + InspectProgram func(context.Context, lsdpreception.ProgramInspect) lsdpreception.ProgramIdentityReceipt + ReleaseProgram func(context.Context, lsdpreception.ProgramRelease) lsdpreception.ProgramReleaseReceipt // Bridges tracks the running bridge per bluehost.Slot so a superseding // Take (or a re-Prepare) stops the previous one instead of leaking a // goroutine stepping an instance the Host has already released. @@ -171,11 +167,9 @@ type SceneIntentDeps struct { // bluewire.NewRegistry(). Bridges *bluewire.Registry // EmitRoster publishes a short-lived, slot-scoped preload hint to the - // matching LSDP wire. It is deliberately not persisted and does not - // activate or prepare a future scene: it only lets an already-connected - // Solar client fetch the exact validated bundle while the keyframe and - // Blue projection are being assembled. Nil keeps minimal/bespoke embeds - // unchanged. + // matching LSDP wire. It lets an already-connected Solar client warm the + // exact validated source and Blue manifest while the keyframe is assembled. + // Nil keeps minimal/bespoke embeds unchanged. EmitRoster func(slot bluehost.Slot, entries []runtime.RosterEntry) // ProjectionInterval paces the bridge's injected Tick loop. <= 0 defaults to // 100ms. @@ -191,6 +185,9 @@ type SceneIntentDeps struct { // verification for the same signed digest and exact raw bytes. Nil keeps // tests and minimal embedders on the uncached fail-closed path. ProgramVerificationCache *VerifiedProgramCache + // ObservePresentationPhase reports local phase durations without changing + // admission, presentation receipts or compensation semantics. + ObservePresentationPhase func(string, time.Duration) } // sceneIntentRequest is the slice of `orion.scene-intent.v1` (§6.4) this @@ -204,20 +201,21 @@ type SceneIntentDeps struct { // the intent's values (deadline among them) into the ticket and any // reconstruction risks AUTH_CONTEXT_MISMATCH. type sceneIntentRequest struct { - SchemaVersion string `json:"schema_version"` - IntentID string `json:"intent_id"` - IdempotencyKey string `json:"idempotency_key"` - StreamID string `json:"stream_id"` - Target string `json:"target"` // preview | on-air - Action string `json:"action"` // prepare-preview | take-on-air - ResolvedSceneRef string `json:"resolved_scene_ref"` - BlueProgram string `json:"blue_program,omitempty"` - BlueProgramDigest string `json:"blue_program_digest,omitempty"` - LSMLBundle string `json:"lsml_bundle,omitempty"` - LSMLBundleDigest string `json:"lsml_bundle_digest,omitempty"` - RenderBundle string `json:"render_bundle,omitempty"` - RenderBundleDigest string `json:"render_bundle_digest,omitempty"` - LocalArtifacts bool `json:"local_artifacts,omitempty"` + SchemaVersion string `json:"schema_version"` + IntentID string `json:"intent_id"` + IdempotencyKey string `json:"idempotency_key"` + StreamID string `json:"stream_id"` + Target string `json:"target"` // preview | on-air + Action string `json:"action"` // prepare-preview | take-on-air + ResolvedSceneRef string `json:"resolved_scene_ref"` + BlueProgram string `json:"blue_program,omitempty"` + BlueProgramDigest string `json:"blue_program_digest,omitempty"` + LSMLBundle string `json:"lsml_bundle,omitempty"` + LSMLBundleDigest string `json:"lsml_bundle_digest,omitempty"` + RenderBundle string `json:"render_bundle,omitempty"` + RenderBundleDigest string `json:"render_bundle_digest,omitempty"` + LocalArtifacts bool `json:"local_artifacts,omitempty"` + BlueManifest json.RawMessage `json:"blue_manifest,omitempty"` } // maxSceneIntentBytes bounds the raw intent body kept for the verbatim @@ -274,11 +272,16 @@ func postSceneIntent(deps SceneIntentDeps) http.HandlerFunc { } var action attestation.Action + programEpoch, programAllowed := deps.Host.ProgramAdmissionToken() switch req.Action { case string(attestation.ActionPreparePreview): action = attestation.ActionPreparePreview case string(attestation.ActionTakeOnAir): action = attestation.ActionTakeOnAir + if !programAllowed { + writeJSON(w, http.StatusConflict, sceneIntentResponse{Status: "rejected", Reason: "PROGRAM_RELEASED", IntentID: req.IntentID}) + return + } default: writeJSON(w, http.StatusBadRequest, sceneIntentResponse{Status: "rejected", IntentID: req.IntentID, Reason: "UNKNOWN_ACTION"}) return @@ -372,6 +375,7 @@ func postSceneIntent(deps SceneIntentDeps) http.HandlerFunc { // validation and bundle creation. Do not dereference Canvas again // on activation. envelope = resolvedSceneEnvelope{ + BlueManifest: req.BlueManifest, BlueProgram: req.BlueProgram, BlueProgramDigest: req.BlueProgramDigest, LSMLBundle: req.LSMLBundle, @@ -408,14 +412,11 @@ func postSceneIntent(deps SceneIntentDeps) http.HandlerFunc { // artifact.Body is `zabcanvas.resolved-scene.v1` (§6.3). The markPhase("artifacts") - // blue_program bytes are verified against the SIGNED - // claims.BlueProgramDigest before Load — §6.2: "Orion revérifie - // tous les digests sur les bytes reçus avant Load." The LSML - // render-bundle has NO equivalent signed claim in §6.2's claim - // set (only blue_program_digest is covered) — its integrity here - // rests on envelope self-consistency plus the mTLS/delegation - // chain that fetched it, not a second signed digest. Documented - // gap, not silently assumed equal to the program's guarantee. + // Blue program bytes are verified against the signed + // claims.BlueProgramDigest before Load. The LSML source is separately + // checked against the envelope digest and forwarded to LSDP; it is not + // compiled or stored as Solar's former RenderBundle. An explicitly + // attached compatibility capsule is checked against its signed digest. // if !envelopeReady { if err := json.Unmarshal(envelopeBody, &envelope); err != nil { @@ -424,118 +425,72 @@ func postSceneIntent(deps SceneIntentDeps) http.HandlerFunc { } } - // A ref whose SIGNED claims declare NO program (empty - // blue_program_digest, ORION-NOBLUE-AND-VERSION-ALIGN #398) skips - // program decode/verify and never Loads anything — but an envelope - // that then DOES carry program bytes is refused: unattested program - // bytes never ride into Orion, even unexecuted. The bundle path is - // identical in both cases (fetch, self-integrity, SetBundle). - noProgram := claims.BlueProgramDigest == "" - var program []byte - if noProgram { - if err := verifyNoProgramEnvelopeValue(envelope); err != nil { - writeJSON(w, http.StatusBadGateway, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "CANVAS_ARTIFACT_DIGEST_MISMATCH"}) - return - } - } else { - var err error - program, err = decodeAndVerifyProgramEnvelopeCached(envelope, claims.BlueProgramDigest, deps.ProgramVerificationCache) - if err != nil { - writeJSON(w, http.StatusBadGateway, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "CANVAS_ARTIFACT_DIGEST_MISMATCH"}) - return - } - } - bundle, bundleErr := decodeAndVerifyBundleEnvelope(envelope) - if bundleErr != nil { + // A ref whose signed claims declare no program skips program + // decode/verify and never Loads a Blue instance. Unexpected program + // bytes are still refused; source bytes follow the same verified LSDP + // path for programmed and static scenes. + artifacts, artifactErr := verifySceneArtifacts(envelope, claims, deps.ProgramVerificationCache) + if artifactErr != nil { writeJSON(w, http.StatusBadGateway, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "CANVAS_ARTIFACT_DIGEST_MISMATCH"}) return } - mirrorBundle := []byte(nil) - var staticState map[string]json.RawMessage - if bundle != nil { - mirrorBundle = append([]byte(nil), bundle...) - } - precompiledBundle, precompiledErr := decodeAndVerifyRenderBundleEnvelope(envelope, claims.RenderBundleDigest) - if precompiledErr != nil { + // The mirror receives source bytes, never the current-backend capsule. + bundle, staticState, renderErr := prepareCurrentRender(artifacts) + if renderErr != nil { writeJSON(w, http.StatusBadGateway, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "CANVAS_ARTIFACT_DIGEST_MISMATCH"}) return } - if precompiledBundle != nil { - bundle = precompiledBundle - staticState, precompiledErr = decodeRenderBundleDefaults(bundle) - if precompiledErr != nil { - writeJSON(w, http.StatusBadGateway, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "CANVAS_ARTIFACT_DIGEST_MISMATCH"}) + + if deps.Catalog != nil { + if err := deps.Catalog.put(principal, claims, req, envelope); err != nil { + writeJSON(w, http.StatusServiceUnavailable, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "SCENE_CATALOG_WRITE_FAILED", Message: err.Error()}) return } - } else if bundle != nil && deps.StaticBundleCompiler != nil { - compiledBundle, defaults, err := deps.StaticBundleCompiler(bundle, claims.SceneID, claims.SceneDigest) - if err != nil { - if deps.Logger != nil { - deps.Logger.Error("static scene bundle compilation failed", "scene_id", claims.SceneID, "err", err) - } - writeJSON(w, http.StatusBadGateway, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "STATIC_BUNDLE_COMPILE_FAILED"}) + } + // Blue host preparation remains keyed by SceneDigest; mirror generation + // keys use ArtifactSetDigest. The native source document separately + // preserves its LSML address for Solar's Canvas fetch and renderer ACK. + releaseCommit, err := deps.Host.AcquireSceneCommit(ctx, slot) + if err != nil { + writeJSON(w, http.StatusRequestTimeout, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "INTENT_CANCELLED"}) + return + } + defer releaseCommit() + if slot == bluehost.SlotOnAir && !deps.Host.ProgramAdmissionValid(programEpoch) { + writeJSON(w, http.StatusConflict, sceneIntentResponse{Status: "rejected", Reason: "PROGRAM_ADMISSION_SUPERSEDED", IntentID: req.IntentID}) + return + } + if dedupKey != "" { + if cached, ok := deps.Idempotency.lookup(dedupKey); ok { + writeJSON(w, http.StatusOK, cached) return } - bundle = compiledBundle - // Legacy refs compile at click time; validated refs carry the same - // defaults inside the precompiled bundle instead. - staticState = defaults } - - // The serving identity stays claims.SceneDigest for BOTH shapes — - // the with-program path is byte-identical to before this unit. - // M6 note (#398, porteur's Decision A): for a NO-PROGRAM ref, - // ZabCanvas mints scene_digest == artifact_set_digest == the hash - // of the bundle, and stamps that same value as the bundle's own - // scene_version — so the version announced to Solar (startBridge → - // MirrorFor), matched by resolveHostBundle and returned as ETag - // equals the value @lumencast/runtime compares ?v= against, BY - // CONSTRUCTION, with no re-keying here. The with-program - // misalignment (scene_digest is a program-family hash, not the - // bundle's own scene_version) is real and intentionally NOT - // touched by this unit — separate chantier. - var opErr error markPhase("verification") - switch action { - case attestation.ActionPreparePreview: - if noProgram { - opErr = deps.Host.PreparePreviewStatic(claims.SceneID, claims.SceneDigest) - } else { - opErr = deps.Host.PreparePreview(claims.RefID, claims.SceneID, claims.SceneDigest, program, deps.Providers, deps.Policy, bluehost.NewEffectHandlers(deps.Effects, blueruntime.Preview)) + presentationDeps := deps + if deps.EmbeddedLocal { + presentationDeps.ObservePresentationPhase = func(name string, duration time.Duration) { + w.Header().Add("Server-Timing", fmt.Sprintf("%s;dur=%.3f", name, float64(duration.Microseconds())/1000)) } - if errors.Is(opErr, bluehost.ErrAlreadyLoaded) { - if deps.Host.Serving(slot, claims.SceneID, claims.SceneDigest) { - opErr = nil // idempotent re-prepare: same scene, same digest already running - } + } + if err := replaceAdmittedScene(ctx, presentationDeps, slot, claims, req, artifacts, bundle, staticState); err != nil { + reason := "NATIVE_LSDP_DELIVERY_FAILED" + if strings.Contains(err.Error(), "HOST_PREPARE_FAILED") { + reason = "HOST_PREPARE_FAILED" } - case attestation.ActionTakeOnAir: - // claims.SceneID now threaded through (ORION-TAKE-SLOT-IDENTITY, - // Blue#345) — Take used to be the one caller of the two that left - // the on-air slot's sceneID empty, silently making it unmatchable - // by resolveHostBundle's (scene_id, v) check (#401). - if noProgram { - opErr = deps.Host.TakeStatic(claims.SceneID, claims.SceneDigest) - } else { - opErr = deps.Host.Take(claims.RefID, claims.SceneID, claims.SceneDigest, program, deps.Providers, deps.Policy, bluehost.NewEffectHandlers(deps.Effects, blueruntime.Execute)) + if strings.Contains(err.Error(), "SOLAR_") { + reason = "SOLAR_PRESENTATION_FAILED" } - } - if opErr != nil { - writeJSON(w, http.StatusInternalServerError, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: "HOST_PREPARE_FAILED"}) + if strings.Contains(err.Error(), "SCENE_COMPENSATION_FAILED") { + reason = "SCENE_COMPENSATION_FAILED" + } + status := http.StatusServiceUnavailable + if reason == "HOST_PREPARE_FAILED" { + status = http.StatusInternalServerError + } + writeJSON(w, status, sceneIntentResponse{Status: "failed", IntentID: req.IntentID, Reason: reason, Message: err.Error()}) return } - if bundle != nil { - deps.Host.SetBundle(slot, bundle) - } - markPhase("host") - deps.Host.SetArtifactSetDigest(slot, claims.ArtifactSetDigest) - if slot == bluehost.SlotOnAir { - // A successful take is a new stateless generation, even when the - // scene digest is reused. Drop process-local ingress ordering from - // the previous instance before the new generation receives events. - providers.ResetActiveIngress(deps.Host) - } - - startBridge(deps, slot, claims, req.IntentID, !noProgram, mirrorBundle, staticState) markPhase("wire") resp := sceneIntentResponse{ diff --git a/internal/api/scene_intent_artifacts.go b/internal/api/scene_intent_artifacts.go index 586b4468..56eb4788 100644 --- a/internal/api/scene_intent_artifacts.go +++ b/internal/api/scene_intent_artifacts.go @@ -19,11 +19,12 @@ import ( // resolvedSceneEnvelope is the slice of `zabcanvas.resolved-scene.v1` // (§6.3) this handler consumes: the pinned blue.program.v1 bytes, // base64-encoded, plus the digest Canvas computed over them at -// publication. Every other §6.3 field (LSML render-bundle, projection -// resources, full attestation echo) is out of this handler's scope. +// publication. It also carries the optional LSML source and current render capsule. +// Projection resources and the full attestation echo remain outside this slice. type resolvedSceneEnvelope struct { - BlueProgram string `json:"blue_program"` - BlueProgramDigest string `json:"blue_program_digest"` + BlueManifest json.RawMessage `json:"blue_manifest,omitempty"` + BlueProgram string `json:"blue_program"` + BlueProgramDigest string `json:"blue_program_digest"` // LSMLBundle is OPTIONAL — an envelope with no bundle (e.g. an // operator-only rule with nothing to render) is valid; // decodeAndVerifyBundle returns (nil, nil) for it. LSMLBundleDigest is @@ -32,9 +33,10 @@ type resolvedSceneEnvelope struct { // carries a bundle with no digest, rather than skip verification. LSMLBundle string `json:"lsml_bundle,omitempty"` LSMLBundleDigest string `json:"lsml_bundle_digest,omitempty"` - // RenderBundle is compiled during Canvas validation. Its digest is also - // signed in the Canvas ref claims; when present, scene-intent loads these - // bytes verbatim and skips StaticBundleCompiler. + // RenderBundle is an optional signed compatibility artifact. Solar's + // source-only Vision path omits it; scene-intent never compiles LSML to + // create one. When an older caller explicitly attaches it, verification + // keeps it separate from the LSML source and Blue program. RenderBundle string `json:"render_bundle,omitempty"` RenderBundleDigest string `json:"render_bundle_digest,omitempty"` @@ -46,9 +48,10 @@ type resolvedSceneEnvelope struct { } type localSceneIndex struct { - SceneID string `json:"scene_id"` - RevisionID string `json:"revision_id"` - LSMLBundleDigest string `json:"lsml_bundle_digest,omitempty"` + SceneID string `json:"scene_id"` + RevisionID string `json:"revision_id"` + LSMLBundleDigest string `json:"lsml_bundle_digest,omitempty"` + BlueManifest json.RawMessage `json:"blue_manifest,omitempty"` } const maxLocalSceneArtifactBytes = 1 << 30 @@ -69,7 +72,7 @@ func loadLocalSceneEnvelope(root string, claims *attestation.Claims) (resolvedSc if err := json.Unmarshal(indexRaw, &index); err != nil || index.SceneID != claims.SceneID || index.RevisionID != claims.RevisionID { return resolvedSceneEnvelope{}, errors.New("local scene index does not match the attested scene") } - envelope := resolvedSceneEnvelope{} + envelope := resolvedSceneEnvelope{BlueManifest: append(json.RawMessage(nil), index.BlueManifest...)} if claims.BlueProgramDigest != "" { program, err := readLocalArtifact(root, claims.BlueProgramDigest) if err != nil { @@ -204,7 +207,7 @@ func blueProgramDigest(program []byte) (string, error) { return computedDigest, nil } -// decodeAndVerifyBundle extracts the OPTIONAL LSML render-bundle from +// decodeAndVerifyBundle extracts the OPTIONAL LSML source from // the Canvas artifact envelope. Unlike decodeAndVerifyProgram, there is // no SIGNED claim to cross-check against (§6.2's claim set has no // lsml_bundle_digest) — only the envelope's own self-consistency @@ -296,7 +299,7 @@ func decodeSceneArtifact(encoded string, localBytes []byte) ([]byte, error) { return base64.StdEncoding.DecodeString(encoded) } -// getHostRenderBundle serves the LSML render-bundle bytes attached to a +// getHostRenderBundle serves the LSML source bytes attached to a // slot by the most recent Prepare/Take (§15 read-route migration: the // new-path equivalent of legacy's GET /scenes/{id}/render-bundle, // content-addressed and immutably cacheable the same way — but keyed by diff --git a/internal/api/scene_intent_bridge.go b/internal/api/scene_intent_bridge.go index b01ce7b8..21e6575c 100644 --- a/internal/api/scene_intent_bridge.go +++ b/internal/api/scene_intent_bridge.go @@ -24,43 +24,39 @@ const defaultProjectionInterval = 10 * time.Millisecond // starting this one, so a Take superseding the on-air instance never // leaves a goroutine stepping an instance bluehost.Host has released. // -// hasProgram=false (a static occupation, #398) still REGISTERS the scene -// on the wire — Solar must learn (sceneID, scene_version) to know what to -// fetch — but starts no bridge (there is no instance to step). Any bridge +// hasProgram=false still REGISTERS the admitted artifact generation on the wire, +// but starts no bridge (there is no instance to step). Any bridge // previously owning the slot is stopped: a static occupation superseding // a programmed one must not leave a goroutine stepping an instance the -// Host has already released. The announced scene_version stays -// claims.SceneDigest in both cases; for a no-program ref that value IS -// the bundle hash (== artifact_set_digest, porteur's Decision A), so the -// ?v= Solar derives matches both the resolver and the bundle's own -// scene_version by construction. -func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.Claims, intentID string, hasProgram bool, mirrorBundle []byte, staticState map[string]json.RawMessage) { +// Host has already released. Roster/generation keys use ArtifactSetDigest; +// the native mirror preserves source.scene_version for the renderer's exact +// source fetch and includes x-orion-artifact-set. Blue execution and projection +// provenance continue to use SceneDigest. +func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.Claims, intentID string, hasProgram bool, mirrorBundle []byte, staticState map[string]json.RawMessage) func() { if deps.MirrorFor == nil || deps.Bridges == nil { - return + return func() {} } - if len(mirrorBundle) == 0 { - mirrorBundle = deps.Host.Bundle(slot) - } - mirror := deps.MirrorFor(claims.SceneID, claims.SceneDigest, slot, mirrorBundle) + sceneVersion := claims.ArtifactSetDigest + mirror := deps.MirrorFor(claims.SceneID, sceneVersion, slot, mirrorBundle) if mirror == nil { - return + return func() {} } - // The stateless scene-intent path has no Show roster to emit the - // scene_roster frame for it. Publish this one validated bundle to the - // wire that owns the slot before the keyframe/activation. Solar's runtime - // fetcher then warms its content-addressed cache in parallel; the later + // The scene-intent path has no Show roster to emit the + // scene_roster frame for it. Publish this one validated source to the + // wire that owns the slot before the keyframe/activation. Solar's source + // provider then warms its pinned-source cache in parallel; the later // snapshot reuses the same in-flight request instead of paying the bundle // fetch after scene_changed. Orion keeps no roster entry after this wire - // update and still remains stateless across restarts. + // update. On restart, the owned selection/catalog reconstruct the runtime. if deps.EmitRoster != nil { deps.EmitRoster(slot, []runtime.RosterEntry{{ SceneID: claims.SceneID, - SceneVersion: claims.SceneDigest, + SceneVersion: sceneVersion, }}) } - // A compiled LSML bundle can legitimately have no authored defaults while - // still containing a renderable static scene and dynamic bindings. Solar - // still needs one snapshot to mount that bundle before the first operator + // LSML source can legitimately have no authored defaults while still + // containing a renderable scene and dynamic bindings. Solar still needs a + // snapshot to mount that source before the first operator // delta can be displayed. For programmed scenes the snapshot and first // delta are sequenced behind a bridge startup gate so the HTTP response is // not held by a large LSML seed, while Run cannot tick before the seed. @@ -70,7 +66,7 @@ func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.C deps.Bridges.Stop(slot) initialSnapshot = &protocol.Snapshot{ SceneID: claims.SceneID, - SceneVersion: claims.SceneDigest, + SceneVersion: sceneVersion, State: staticState, } } @@ -79,15 +75,18 @@ func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.C mirror.Forward(initialSnapshot) } if deps.Activate != nil { - deps.Activate(claims.SceneID, claims.SceneDigest, slot) + deps.Activate(claims.SceneID, sceneVersion, slot) } deps.Bridges.Stop(slot) - return + deps.Bridges.SetSceneMirror(slot, mirror) + return func() {} } target := blueproject.TargetPreview if slot == bluehost.SlotOnAir { target = blueproject.TargetProgram } + // Bluewire's projection digest remains the runtime identity committed by + // Prepare/Take; the LSDP wire itself is pinned to ArtifactSetDigest above. bridge := bluewire.NewBridge(deps.Host, slot, mirror, claims.SceneID, claims.SceneDigest, claims.RefID, target, claims.RevisionID, intentID) logger := deps.Logger bridge.SetLogger(logger) @@ -98,7 +97,7 @@ func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.C var startupCtx context.Context var startupCancel context.CancelFunc var startupGate chan struct{} - if initialSnapshot != nil { + if hasProgram { startupCtx, startupCancel = context.WithCancel(context.Background()) startupGate = make(chan struct{}) bridge.SetStartupGate(startupGate, startupCancel) @@ -108,8 +107,8 @@ func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.C logger.Warn("bluewire bridge step failed", "slot", slot, "scene_id", claims.SceneID, "err", err) } }) - // The compiled render-bundle snapshot and wire activation are the visible - // scene switch. Dispatch them before answering the intent so a successful + // The source-pinned snapshot and wire activation are the visible scene + // switch. Dispatch them before answering the intent so a successful // response cannot outrun Solar's first scene snapshot. The first Blue // runtime projection remains outside the HTTP critical path; the startup // gate keeps the periodic loop behind it and Registry can cancel the worker @@ -119,20 +118,25 @@ func startBridge(deps SceneIntentDeps, slot bluehost.Slot, claims *attestation.C mirror.Forward(initialSnapshot) } if deps.Activate != nil { - deps.Activate(claims.SceneID, claims.SceneDigest, slot) + deps.Activate(claims.SceneID, sceneVersion, slot) } } - go func() { - if startupCtx != nil && startupCtx.Err() != nil { - return - } - if err := bridge.TickOnce(0); err != nil && logger != nil { - logger.Warn("bluewire initial projection failed", "slot", slot, "scene_id", claims.SceneID, "err", err) - } - if startupGate != nil { - close(startupGate) - } - }() + return func() { + go func() { + if startupCtx != nil && startupCtx.Err() != nil { + return + } + // Tick only advances tick entrypoints and timers; it does not consume + // the initial on-start transition. Run that transition once so scene + // automation and operator awaits are armed before periodic ticking. + if err := bridge.StepOnce(); err != nil && logger != nil { + logger.Warn("bluewire initial projection failed", "slot", slot, "scene_id", claims.SceneID, "err", err) + } + if startupGate != nil { + close(startupGate) + } + }() + } } // releaseSlot stops slot's bridge (if any) BEFORE releasing the diff --git a/internal/api/scene_intent_bundle_test.go b/internal/api/scene_intent_bundle_test.go index 5cf706a9..cc553e27 100644 --- a/internal/api/scene_intent_bundle_test.go +++ b/internal/api/scene_intent_bundle_test.go @@ -6,6 +6,7 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "strings" "testing" "time" @@ -15,36 +16,10 @@ import ( "github.com/ZabLaboratory/Orion/internal/runtime" ) -// recordingBundleMirror is a bare runtime.SceneMirror stand-in — the -// bytes/sceneID/call-count assertions this test cares about are captured -// directly by the MirrorFor closure below, not by the mirror itself. -type recordingBundleMirror struct{} - -func (m *recordingBundleMirror) Forward(any) {} - -// TestStartBridge_ThreadsHostBundleIntoMirrorFor is the plumbing proof for -// #396: an envelope carrying an lsml_bundle is verified and attached to -// the slot via Host.SetBundle (scenes_intent.go's existing behaviour, -// unchanged), and startBridge must now pass exactly those bytes to -// deps.MirrorFor — the wiring that was missing before this fix, where -// cmd/orion/main.go's closure ignored whatever the slot held and always -// forwarded nil to lsdp.Wire.MirrorFor's bundle argument. -// -// It also covers half of #398's plumbing proof: a prepare-preview must -// reach MirrorFor with slot == bluehost.SlotPreview. The symmetric case -// (a take reaching MirrorFor with SlotOnAir) is -// TestStartBridge_ThreadsOnAirSlotIntoMirrorFor below — a test proving -// only one side would be worthless (#398's own point dur), since a -// closure that ignores its slot argument entirely could still pass a -// preview-only assertion. -// -// Mutation proof: reverting scene_intent.go's `deps.MirrorFor(claims.SceneID, -// claims.SceneDigest, slot, deps.Host.Bundle(slot))` back to a call site -// that drops the bundle or slot argument does not even compile against the -// widened MirrorFor field — and reverting the field type too (to make it -// compile again) makes gotBundle/gotSlot below unreachable, failing this -// test's assertions. -func TestStartBridge_ThreadsHostBundleIntoMirrorFor(t *testing.T) { +// TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor proves source bytes +// reach the LSDP leaf gate and snapshot without compiling or storing a +// Solar RenderBundle during the scene switch. +func TestSceneIntent_PassesLSMLSourceDirectlyToMirrorFor(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) program := minimalProgram(t) lsmlBundle := []byte(`{"kind":"text","bind":{"value":"board.display"}}`) @@ -52,11 +27,13 @@ func TestStartBridge_ThreadsHostBundleIntoMirrorFor(t *testing.T) { now := time.Now() ref := signedRef(t, priv, "canvas-key-1", attestation.ActionPreparePreview, now, "scene-1", digest) - mirror := &recordingBundleMirror{} + mirror := &recordingMirror{} var gotSceneID string + var gotSceneVersion string var gotSlot bluehost.Slot - var gotBundle []byte + var gotSource []byte var calls int + compilerCalls := 0 deps := SceneIntentDeps{ Trust: attestation.TrustSet{"canvas-key-1": pub}, @@ -65,10 +42,16 @@ func TestStartBridge_ThreadsHostBundleIntoMirrorFor(t *testing.T) { TenantID: "tenant-1", Workload: &fakeWorkload{body: envelope}, Host: bluehost.NewHost(), - MirrorFor: func(sceneID, _ string, slot bluehost.Slot, bundle []byte) runtime.SceneMirror { + StaticBundleCompiler: func([]byte, string, string) ([]byte, map[string]json.RawMessage, error) { + compilerCalls++ + t.Fatal("scene-intent must not compile source") + return nil, nil, nil + }, + MirrorFor: func(sceneID, sceneVersion string, slot bluehost.Slot, source []byte) runtime.SceneMirror { gotSceneID = sceneID + gotSceneVersion = sceneVersion gotSlot = slot - gotBundle = bundle + gotSource = append([]byte(nil), source...) calls++ return mirror }, @@ -100,18 +83,21 @@ func TestStartBridge_ThreadsHostBundleIntoMirrorFor(t *testing.T) { if gotSlot != bluehost.SlotPreview { t.Fatalf("a prepare-preview must reach MirrorFor with slot=preview (#398) — got %q", gotSlot) } - if gotBundle == nil { - t.Fatalf("MirrorFor received a nil bundle — the #396 defect: SetBundle stored real LSML bytes but startBridge never forwarded them") + if gotSource == nil { + t.Fatal("MirrorFor received no LSML source") } - if string(gotBundle) != string(lsmlBundle) { - t.Fatalf("MirrorFor bundle mismatch: got %q, want %q", gotBundle, lsmlBundle) + if string(gotSource) != string(lsmlBundle) { + t.Fatalf("MirrorFor source mismatch: got %q, want %q", gotSource, lsmlBundle) } - - // Cross-check against the slot directly: what startBridge forwarded - // must be exactly what SetBundle attached (deps.Host.Bundle(slot)), - // never a copy or a different artefact. - if got := deps.Host.Bundle(bluehost.SlotPreview); string(got) != string(lsmlBundle) { - t.Fatalf("Host.Bundle(preview) = %q, want %q", got, lsmlBundle) + wantVersion := "sha256:" + strings.Repeat("b", 64) + if gotSceneVersion != wantVersion || mirror.snapshotVersion != wantVersion { + t.Fatalf("LSDP source/snapshot version = %q/%q, want artifact_set_digest %q", gotSceneVersion, mirror.snapshotVersion, wantVersion) + } + if got := deps.Host.Bundle(bluehost.SlotPreview); len(got) != 0 { + t.Fatalf("LSML source must not be stored as a legacy RenderBundle: %q", got) + } + if compilerCalls != 0 { + t.Fatalf("scene switch invoked static compiler %d times", compilerCalls) } } @@ -129,7 +115,7 @@ func TestStartBridge_ThreadsOnAirSlotIntoMirrorFor(t *testing.T) { now := time.Now() ref := signedRef(t, priv, "canvas-key-1", attestation.ActionTakeOnAir, now, "scene-1", digest) - mirror := &recordingBundleMirror{} + mirror := &recordingMirror{} var gotSlot bluehost.Slot var calls int diff --git a/internal/api/scene_intent_concurrency_test.go b/internal/api/scene_intent_concurrency_test.go new file mode 100644 index 00000000..394cd53c --- /dev/null +++ b/internal/api/scene_intent_concurrency_test.go @@ -0,0 +1,86 @@ +package api + +import ( + "bytes" + "context" + "crypto/ed25519" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "net/http" + "net/http/httptest" + "sync/atomic" + "testing" + "time" +) + +type intentTestKey struct{} + +func TestSceneIntentLaneCommitSerializesReplayButNotOtherLane(t *testing.T) { + pub, priv, _ := ed25519.GenerateKey(nil) + program := minimalProgram(t) + var envelope resolvedSceneEnvelope + raw, digest := canvasEnvelope(program) + if err := json.Unmarshal(raw, &envelope); err != nil { + t.Fatal(err) + } + firstFlush := make(chan struct{}) + release := make(chan struct{}) + var flushes atomic.Int32 + deps := SceneIntentDeps{Trust: attestation.TrustSet{"canvas-key-1": pub}, LocatorPrefix: "scenes/", OwnerID: "owner-1", TenantID: "tenant-1", EmbeddedLocal: true, Host: bluehost.NewHost(), Idempotency: NewIdempotencyCache(), + WireFlush: func(context.Context) error { + if flushes.Add(1) == 1 { + close(firstFlush) + <-release + } + return nil + }, + } + handler := postSceneIntent(deps) + replayHandler := postSceneIntent(deps) // wrapper-created handler, same Host. + request := func(action attestation.Action, ctx context.Context) *httptest.ResponseRecorder { + body, _ := json.Marshal(sceneIntentRequest{IntentID: "same-intent", StreamID: "stream-1", Action: string(action), ResolvedSceneRef: signedRef(t, priv, "canvas-key-1", action, time.Now(), "scene-1", digest), IdempotencyKey: "same-request", BlueProgram: envelope.BlueProgram, BlueProgramDigest: envelope.BlueProgramDigest}) + r := httptest.NewRequest("POST", "/api/v1/host/scene-intent", bytes.NewReader(body)).WithContext(ctx) + r.Header.Set("X-Authenticated-User", "operator-1") + r.Header.Set("X-Authenticated-Role", "operator") + w := httptest.NewRecorder() + if ctx.Value(intentTestKey{}) == true { + replayHandler(w, r) + } else { + handler(w, r) + } + return w + } + first := make(chan *httptest.ResponseRecorder, 1) + go func() { first <- request(attestation.ActionTakeOnAir, context.Background()) }() + <-firstFlush + // Preview commits while Program waits on the native receipt. + preview := request(attestation.ActionPreparePreview, context.Background()) + if preview.Code != http.StatusOK { + t.Fatal(preview.Code, preview.Body.String()) + } + cancelled, cancel := context.WithCancel(context.Background()) + cancel() + if got := request(attestation.ActionTakeOnAir, cancelled); got.Code != http.StatusRequestTimeout { + t.Fatal("cancelled lane wait", got.Code, got.Body.String()) + } + replay := make(chan *httptest.ResponseRecorder, 1) + go func() { + replay <- request(attestation.ActionTakeOnAir, context.WithValue(context.Background(), intentTestKey{}, true)) + }() + select { + case <-replay: + t.Fatal("concurrent replay bypassed commit barrier") + case <-time.After(20 * time.Millisecond): + } + close(release) + if got := <-first; got.Code != http.StatusOK { + t.Fatal(got.Code, got.Body.String()) + } + if got := <-replay; got.Code != http.StatusOK { + t.Fatal(got.Code, got.Body.String()) + } + if flushes.Load() != 2 { + t.Fatalf("replay restarted the Blue/bridge commit: %d", flushes.Load()) + } +} diff --git a/internal/api/scene_intent_current_render.go b/internal/api/scene_intent_current_render.go new file mode 100644 index 00000000..b6ece4f0 --- /dev/null +++ b/internal/api/scene_intent_current_render.go @@ -0,0 +1,17 @@ +package api + +import ( + "encoding/json" +) + +// prepareCurrentRender extracts an explicitly attached, attested compatibility +// capsule. Scene-intent switches never compile LSML: Solar fetches the pinned +// source from ZabCanvas and Vision renders it directly. The compiler remains +// available to explicit validation and editable-preview routes. +func prepareCurrentRender(artifacts verifiedSceneArtifacts) ([]byte, map[string]json.RawMessage, error) { + if artifacts.CurrentRender != nil { + defaults, err := decodeRenderBundleDefaults(artifacts.CurrentRender) + return artifacts.CurrentRender, defaults, err + } + return nil, nil, nil +} diff --git a/internal/api/scene_intent_identity_test.go b/internal/api/scene_intent_identity_test.go new file mode 100644 index 00000000..f4664d66 --- /dev/null +++ b/internal/api/scene_intent_identity_test.go @@ -0,0 +1,101 @@ +package api + +import ( + "bytes" + "crypto/ed25519" + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +// The admission callbacks key mirror generations/rosters by artifact_set_digest; +// Blue execution retains scene_digest. Native source-version preservation is +// covered by lsdpreception's source document tests and the cold-start CEF proof. +func TestPostSceneIntent_UsesArtifactSetForGenerationAndSceneDigestForBlue(t *testing.T) { + pub, priv, _ := ed25519.GenerateKey(nil) + program := minimalProgram(t) + source := []byte(`{"lsml":"1.1","layout":{"kind":"text"}}`) + envelope, digest := canvasEnvelopeWithBundle(program, source) + now := time.Now() + ref := signedRef(t, priv, "canvas-key-1", attestation.ActionPreparePreview, now, "scene-1", digest) + + var gotSceneID, gotSceneVersion string + var gotRosterVersion, gotActiveVersion string + var calls int + mirror := &recordingMirror{} + compilerCalls := 0 + deps := SceneIntentDeps{ + Trust: attestation.TrustSet{"canvas-key-1": pub}, + LocatorPrefix: "scenes/", + OwnerID: "owner-1", + TenantID: "tenant-1", + Workload: &fakeWorkload{body: envelope}, + Host: bluehost.NewHost(), + StaticBundleCompiler: func([]byte, string, string) ([]byte, map[string]json.RawMessage, error) { + compilerCalls++ + t.Fatal("scene-intent must not compile LSML on a switch") + return nil, nil, nil + }, + MirrorFor: func(sceneID, sceneVersion string, _ bluehost.Slot, gotSource []byte) runtime.SceneMirror { + gotSceneID = sceneID + gotSceneVersion = sceneVersion + calls++ + if !bytes.Equal(gotSource, source) { + t.Fatalf("MirrorFor source = %s, want source bytes %s", gotSource, source) + } + return mirror + }, + EmitRoster: func(_ bluehost.Slot, entries []runtime.RosterEntry) { + if len(entries) == 1 { + gotRosterVersion = entries[0].SceneVersion + } + }, + Activate: func(_ string, version string, _ bluehost.Slot) { gotActiveVersion = version }, + Bridges: bluewire.NewRegistry(), + ProjectionInterval: time.Hour, + } + + body, _ := json.Marshal(sceneIntentRequest{ + IntentID: "intent-1", StreamID: "stream-1", Target: "preview", + Action: string(attestation.ActionPreparePreview), ResolvedSceneRef: ref, + }) + req := httptest.NewRequest(http.MethodPost, "/api/v1/host/scene-intent", bytes.NewReader(body)) + req.Header.Set("X-Authenticated-User", "operator-1") + req.Header.Set("X-Authenticated-Role", "operator") + req.Header.Set(authContextHeader, "opaque-ticket") + + rec := httptest.NewRecorder() + postSceneIntent(deps)(rec, req) + if rec.Code != http.StatusOK { + t.Fatalf("expected 200, got %d: %s", rec.Code, rec.Body.String()) + } + + if calls != 1 { + t.Fatalf("expected MirrorFor called exactly once, got %d", calls) + } + if gotSceneID != "scene-1" { + t.Fatalf("expected sceneID %q, got %q", "scene-1", gotSceneID) + } + if gotSceneVersion == "" { + t.Fatal("MirrorFor received an empty sceneVersion — the #398-class defect: a client can never learn a ?v= that resolveHostBundle would accept") + } + wantSceneVersion := "sha256:" + strings.Repeat("b", 64) + if gotSceneVersion != wantSceneVersion || gotRosterVersion != wantSceneVersion || gotActiveVersion != wantSceneVersion || mirror.snapshotVersion != wantSceneVersion { + t.Fatalf("Admitted generation identity mismatch: mirror=%q roster=%q snapshot=%q active=%q want artifact_set_digest=%q", gotSceneVersion, gotRosterVersion, mirror.snapshotVersion, gotActiveVersion, wantSceneVersion) + } + wantBlueDigest := "sha256:" + strings.Repeat("a", 64) + if got := deps.Host.Digest(bluehost.SlotPreview); got != wantBlueDigest { + t.Fatalf("Blue host digest = %q, want scene_digest %q", got, wantBlueDigest) + } + if compilerCalls != 0 { + t.Fatalf("scene switch invoked static compiler %d times", compilerCalls) + } +} diff --git a/internal/api/scene_intent_noblue_test.go b/internal/api/scene_intent_noblue_test.go index 94a9d546..edf59817 100644 --- a/internal/api/scene_intent_noblue_test.go +++ b/internal/api/scene_intent_noblue_test.go @@ -5,17 +5,11 @@ package api // // 1. A ResolvedSceneRef whose SIGNED claims declare NO program (empty // blue_program_digest — the ONLY claims relaxation) is accepted: the -// slot is occupied with (scene_id, scene_digest) and the bundle is -// served, with NO runtime instance ever Loaded/Started/Stepped. -// 2. M6, no-program case only: ZabCanvas mints scene_digest == -// artifact_set_digest == the bundle hash and stamps that same value -// as the bundle's own scene_version — so the version announced on -// the LSDP wire (claims.SceneDigest, unchanged threading), the value -// the public resolver matches, the ETag, and the scene_version -// @lumencast/runtime compares ?v= against are ONE value by -// construction. The with-program misalignment is intentionally NOT -// touched (separate chantier); the with-program path is asserted -// byte-identical elsewhere in this package. +// slot is occupied and the source is announced over LSDP, with NO +// runtime instance ever Loaded/Started/Stepped. +// 2. The LSDP source identity is artifact_set_digest. For these no-program +// fixtures it happens to equal scene_digest, while programmed-scene +// coverage proves the identities stay distinct. import ( "bytes" @@ -35,18 +29,11 @@ import ( "github.com/ZabLaboratory/Orion/internal/runtime" ) -// noblueDigest is the single content address of the no-program fixtures -// (Decision A): the claims' scene_digest AND artifact_set_digest AND the -// scene_version embedded in the bundle bytes. Orion never recomputes it -// over the bundle (documented gap — the signed claim is the authority); -// what matters here is the END-TO-END EQUALITY of the announced / -// matched / embedded values. +// noblueDigest is the shared scene and artifact identity of these +// no-program fixtures. func noblueDigest() string { return "sha256:" + strings.Repeat("f", 64) } -// alignedBundle builds LSML-bundle bytes carrying their OWN -// scene_version equal to the claims' digest — exactly what the ZabCanvas -// twin emits for a no-program scene. The client-side lumencast check -// compares this embedded field against the ?v= it fetched with. +// alignedBundle builds the source bytes used by the fixture. func alignedBundle(t *testing.T) []byte { t.Helper() bundle, err := json.Marshal(map[string]any{ @@ -111,10 +98,16 @@ func signedRefNoProgram(t *testing.T, priv ed25519.PrivateKey, kid string, now t return h64 + "." + p64 + "." + s64 } -func noblueDeps(t *testing.T, pub ed25519.PublicKey, body json.RawMessage) (SceneIntentDeps, *string, *int) { +type noBlueObservation struct { + sceneVersion string + mirrorCalls int + source []byte + mirror *recordingMirror +} + +func noblueDeps(t *testing.T, pub ed25519.PublicKey, body json.RawMessage) (SceneIntentDeps, *noBlueObservation) { t.Helper() - var gotVersion string - var mirrorCalls int + observed := &noBlueObservation{mirror: &recordingMirror{}} deps := SceneIntentDeps{ Trust: attestation.TrustSet{"canvas-key-1": pub}, LocatorPrefix: "scenes/", @@ -122,15 +115,16 @@ func noblueDeps(t *testing.T, pub ed25519.PublicKey, body json.RawMessage) (Scen TenantID: "tenant-1", Workload: &fakeWorkload{body: body}, Host: bluehost.NewHost(), - MirrorFor: func(_, sceneVersion string, _ bluehost.Slot, _ []byte) runtime.SceneMirror { - gotVersion = sceneVersion - mirrorCalls++ - return &recordingMirror{} + MirrorFor: func(_, sceneVersion string, _ bluehost.Slot, source []byte) runtime.SceneMirror { + observed.sceneVersion = sceneVersion + observed.mirrorCalls++ + observed.source = append([]byte(nil), source...) + return observed.mirror }, Bridges: bluewire.NewRegistry(), ProjectionInterval: time.Hour, } - return deps, &gotVersion, &mirrorCalls + return deps, observed } func sendIntent(t *testing.T, deps SceneIntentDeps, ref string, action attestation.Action, target, intentID string) *httptest.ResponseRecorder { @@ -151,9 +145,7 @@ func sendIntent(t *testing.T, deps SceneIntentDeps, ref string, action attestati return rec } -// fetchBundle exercises the PUBLIC resolver (resolveHostBundle via -// getRenderBundle) with an explicit (scene_id, v) pair — the same door -// Solar comes through after learning (sceneID, version) off the wire. +// fetchBundle exercises the former compiled-renderer compatibility route. func fetchBundle(deps SceneIntentDeps, sceneID, v string) *httptest.ResponseRecorder { pub := PublicDeps{SceneIntent: &deps} req := httptest.NewRequest(http.MethodGet, "/api/v1/scenes/"+sceneID+"/render-bundle?v="+v, nil) @@ -163,19 +155,18 @@ func fetchBundle(deps SceneIntentDeps, sceneID, v string) *httptest.ResponseReco return rec } -// TestPostSceneIntent_NoProgram_PrepareOccupiesAndServes_NoInstance is -// proof (a): a no-program ref passes Verify, occupies the preview slot -// with (scene_id, scene_digest), serves its bundle through the public -// resolver — and holds NO runtime instance (every instance-consuming +// TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance is proof (a): +// a no-program ref passes Verify, occupies the preview slot, publishes its +// exact source identity to LSDP, and holds NO runtime instance (every instance-consuming // door answers "not loaded"; no program bytes ever existed to Load, and // had the handler attempted one, the empty program would have failed the // intent with HOST_PREPARE_FAILED instead of this 200 — Bastion req 3). -func TestPostSceneIntent_NoProgram_PrepareOccupiesAndServes_NoInstance(t *testing.T) { +func TestPostSceneIntent_NoProgram_PrepareStreamsSource_NoInstance(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) bundle := alignedBundle(t) now := time.Now() ref := signedRefNoProgram(t, priv, "canvas-key-1", now, "scene-1") - deps, gotVersion, _ := noblueDeps(t, pub, noProgramEnvelope(bundle)) + deps, observed := noblueDeps(t, pub, noProgramEnvelope(bundle)) rec := sendIntent(t, deps, ref, attestation.ActionPreparePreview, "preview", "intent-nb-1") if rec.Code != http.StatusOK { @@ -193,12 +184,14 @@ func TestPostSceneIntent_NoProgram_PrepareOccupiesAndServes_NoInstance(t *testin if !deps.Host.Serving(bluehost.SlotPreview, "scene-1", noblueDigest()) { t.Fatalf("expected preview slot serving (scene-1, %s)", noblueDigest()) } - // Bundle attached and served through the public resolver. - if got := deps.Host.Bundle(bluehost.SlotPreview); string(got) != string(bundle) { - t.Fatalf("bundle not attached: %q", got) + if string(observed.source) != string(bundle) { + t.Fatalf("LSDP source = %q, want exact ZabCanvas bytes %q", observed.source, bundle) } - if fetched := fetchBundle(deps, "scene-1", noblueDigest()); fetched.Code != http.StatusOK || fetched.Body.String() != string(bundle) { - t.Fatalf("public resolver must serve the bundle for v=scene_digest: %d %q", fetched.Code, fetched.Body.String()) + if got := deps.Host.Bundle(bluehost.SlotPreview); len(got) != 0 { + t.Fatalf("source-only scene switch must not populate the legacy render-bundle slot: %q", got) + } + if fetched := fetchBundle(deps, "scene-1", noblueDigest()); fetched.Code != http.StatusNotFound { + t.Fatalf("source-only scene must not be served by the legacy render-bundle route: %d %q", fetched.Code, fetched.Body.String()) } // NO instance: every instance door answers not-loaded, never a panic // or a silent no-op (Bastion req 3 — no Load/Start/Step/Stop). @@ -213,8 +206,8 @@ func TestPostSceneIntent_NoProgram_PrepareOccupiesAndServes_NoInstance(t *testin } // The scene IS registered on the wire (Solar must learn what to // fetch) — but no bridge is stepping. - if *gotVersion != noblueDigest() { - t.Fatalf("MirrorFor announced %q, want %q", *gotVersion, noblueDigest()) + if observed.sceneVersion != noblueDigest() || observed.mirror.snapshotVersion != noblueDigest() { + t.Fatalf("LSDP source version/snapshot = %q/%q, want %q", observed.sceneVersion, observed.mirror.snapshotVersion, noblueDigest()) } if deps.Bridges.Running(bluehost.SlotPreview) { t.Fatal("no bridge may run for a program-less occupation") @@ -230,7 +223,7 @@ func TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance(t *testing.T program := minimalProgram(t) envelope, digest := canvasEnvelopeWithBundle(program, []byte(`{"scene":"old"}`)) now := time.Now() - deps, gotVersion, _ := noblueDeps(t, pub, envelope) + deps, observed := noblueDeps(t, pub, envelope) t.Cleanup(func() { deps.Bridges.StopAll() _ = deps.Host.Release(bluehost.SlotOnAir, "test-cleanup") @@ -266,11 +259,11 @@ func TestPostSceneIntent_NoProgram_TakeSupersedesProgrammedInstance(t *testing.T if deps.Bridges.Running(bluehost.SlotOnAir) { t.Fatal("superseded bridge must be STOPPED — no goroutine may keep stepping a released instance") } - if *gotVersion != noblueDigest() { - t.Fatalf("MirrorFor announced %q, want %q", *gotVersion, noblueDigest()) + if observed.sceneVersion != noblueDigest() || string(observed.source) != string(bundle) { + t.Fatalf("LSDP source version/source = %q/%q, want version %q and exact source", observed.sceneVersion, observed.source, noblueDigest()) } - if fetched := fetchBundle(deps, "scene-2", noblueDigest()); fetched.Code != http.StatusOK { - t.Fatalf("on-air static occupation must resolve through the public route, got %d", fetched.Code) + if fetched := fetchBundle(deps, "scene-2", noblueDigest()); fetched.Code != http.StatusNotFound { + t.Fatalf("source-only occupation must not use the legacy render-bundle route, got %d", fetched.Code) } } @@ -283,7 +276,7 @@ func TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram(t *testing.T) envelope, _ := canvasEnvelope(program) // envelope WITH program fields now := time.Now() ref := signedRefNoProgram(t, priv, "canvas-key-1", now, "scene-1") - deps, _, _ := noblueDeps(t, pub, envelope) + deps, _ := noblueDeps(t, pub, envelope) rec := sendIntent(t, deps, ref, attestation.ActionPreparePreview, "preview", "intent-nb-evil") if rec.Code != http.StatusBadGateway { @@ -301,20 +294,15 @@ func TestPostSceneIntent_NoProgram_RefusesEnvelopeCarryingProgram(t *testing.T) } } -// TestPostSceneIntent_NoProgram_VersionAlignedEndToEnd is proof (c) for -// the no-program case (Decision A): the v announced on the wire == the -// scene_version the bundle itself carries == the ?v= the public resolver -// accepts (and serves as ETag) — one value end to end, with NO re-keying -// in Orion (the announced value is claims.SceneDigest, same threading as -// a programmed ref; the equality holds because ZabCanvas mints -// scene_digest as the bundle's content address). A non-matching v must -// still miss. -func TestPostSceneIntent_NoProgram_VersionAlignedEndToEnd(t *testing.T) { +// TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion proves the +// LSDP scene version pins the source and snapshot without consulting the +// retired Solar render-bundle route. +func TestPostSceneIntent_NoProgram_UsesPinnedArtifactSetVersion(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) now := time.Now() bundle := alignedBundle(t) ref := signedRefNoProgram(t, priv, "canvas-key-1", now, "scene-1") - deps, gotVersion, mirrorCalls := noblueDeps(t, pub, noProgramEnvelope(bundle)) + deps, observed := noblueDeps(t, pub, noProgramEnvelope(bundle)) t.Cleanup(func() { deps.Bridges.StopAll() _ = deps.Host.Release(bluehost.SlotPreview, "test-cleanup") @@ -323,37 +311,23 @@ func TestPostSceneIntent_NoProgram_VersionAlignedEndToEnd(t *testing.T) { if rec := sendIntent(t, deps, ref, attestation.ActionPreparePreview, "preview", "intent-align"); rec.Code != http.StatusOK { t.Fatalf("prepare-preview: expected 200, got %d: %s", rec.Code, rec.Body.String()) } - if *mirrorCalls != 1 { - t.Fatalf("expected exactly one wire registration, got %d", *mirrorCalls) + if observed.mirrorCalls != 1 { + t.Fatalf("expected exactly one wire registration, got %d", observed.mirrorCalls) } - // (1) announced on the wire. - announced := *gotVersion + announced := observed.sceneVersion if announced != noblueDigest() { - t.Fatalf("wire announced %q, want the scene_digest/bundle hash %q", announced, noblueDigest()) - } - // (2) == the bundle's OWN scene_version (the field lumencast compares - // ?v= against client-side). - var served struct { - SceneVersion string `json:"scene_version"` - } - fetched := fetchBundle(deps, "scene-1", announced) - if fetched.Code != http.StatusOK { - t.Fatalf("resolver must accept the announced v %q, got %d", announced, fetched.Code) - } - if err := json.Unmarshal(fetched.Body.Bytes(), &served); err != nil { - t.Fatal(err) + t.Fatalf("wire announced %q, want the artifact_set_digest %q", announced, noblueDigest()) } - if served.SceneVersion != announced { - t.Fatalf("bundle scene_version %q != announced/fetched v %q — the client-side lumencast check would refuse this bundle", served.SceneVersion, announced) + if observed.mirror.snapshotVersion != announced || string(observed.source) != string(bundle) { + t.Fatalf("snapshot/source identity = %q/%q, want version %q and exact bytes", observed.mirror.snapshotVersion, observed.source, announced) } - // (3) ETag is the same value (immutable-cache identity). - if etag := fetched.Header().Get("ETag"); etag != `"`+announced+`"` { - t.Fatalf("ETag %q != announced v %q", etag, announced) + if fetched := fetchBundle(deps, "scene-1", announced); fetched.Code != http.StatusNotFound { + t.Fatalf("source-only scene unexpectedly reached legacy render-bundle route: %d", fetched.Code) } - // A non-matching v still misses — the resolver guard is intact. + // The old bundle resolver stays empty, whatever version is supplied. if miss := fetchBundle(deps, "scene-1", "sha256:"+strings.Repeat("a", 64)); miss.Code != http.StatusNotFound { - t.Fatalf("a non-matching v must 404, got %d", miss.Code) + t.Fatalf("legacy render-bundle route must remain empty, got %d", miss.Code) } } @@ -365,7 +339,7 @@ func TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) bundle := alignedBundle(t) now := time.Now() - deps, _, _ := noblueDeps(t, pub, noProgramEnvelope(bundle)) + deps, _ := noblueDeps(t, pub, noProgramEnvelope(bundle)) refPrep := signedRefNoProgram(t, priv, "canvas-key-1", now, "scene-1") if rec := sendIntent(t, deps, refPrep, attestation.ActionPreparePreview, "preview", "i-prev"); rec.Code != http.StatusOK { @@ -380,14 +354,14 @@ func TestPostSceneIntent_NoProgram_PreviewOnAirSymmetry(t *testing.T) { if !deps.Host.Serving(slot, "scene-1", noblueDigest()) { t.Fatalf("%s: expected (scene-1, %s)", slot, noblueDigest()) } - if got := deps.Host.Bundle(slot); string(got) != string(bundle) { - t.Fatalf("%s: bundle mismatch", slot) + if got := deps.Host.Bundle(slot); len(got) != 0 { + t.Fatalf("%s: source-only switch populated the legacy bundle slot: %q", slot, got) } if deps.Bridges.Running(slot) { t.Fatalf("%s: no bridge may run for a program-less occupation", slot) } } - if fetched := fetchBundle(deps, "scene-1", noblueDigest()); fetched.Code != http.StatusOK { - t.Fatalf("resolver: %d", fetched.Code) + if fetched := fetchBundle(deps, "scene-1", noblueDigest()); fetched.Code != http.StatusNotFound { + t.Fatalf("legacy resolver must not serve source-only scenes, got %d", fetched.Code) } } diff --git a/internal/api/scene_intent_source.go b/internal/api/scene_intent_source.go new file mode 100644 index 00000000..e3881e25 --- /dev/null +++ b/internal/api/scene_intent_source.go @@ -0,0 +1,40 @@ +package api + +import "github.com/ZabLaboratory/Orion/internal/attestation" + +// verifiedSceneArtifacts keeps the authoring source separate from the optional +// current-backend render capsule. Verification neither compiles nor loads Blue. +// Source integrity retains the existing envelope/delegation guarantee; unlike +// Program and CurrentRender, its transport digest is not a signed claim. +type verifiedSceneArtifacts struct { + Program []byte + Source []byte + CurrentRender []byte + BlueManifest []byte +} + +func verifySceneArtifacts(envelope resolvedSceneEnvelope, claims *attestation.Claims, cache *VerifiedProgramCache) (verifiedSceneArtifacts, error) { + var artifacts verifiedSceneArtifacts + var err error + if claims.BlueProgramDigest == "" { + err = verifyNoProgramEnvelopeValue(envelope) + } else { + artifacts.Program, err = decodeAndVerifyProgramEnvelopeCached(envelope, claims.BlueProgramDigest, cache) + } + if err != nil { + return verifiedSceneArtifacts{}, err + } + artifacts.Source, err = decodeAndVerifyBundleEnvelope(envelope) + if err != nil { + return verifiedSceneArtifacts{}, err + } + artifacts.CurrentRender, err = decodeAndVerifyRenderBundleEnvelope(envelope, claims.RenderBundleDigest) + if err != nil { + return verifiedSceneArtifacts{}, err + } + artifacts.BlueManifest, err = verifySceneBlueManifest(envelope.BlueManifest, claims, artifacts.Source) + if err != nil { + return verifiedSceneArtifacts{}, err + } + return artifacts, nil +} diff --git a/internal/api/scene_intent_source_test.go b/internal/api/scene_intent_source_test.go new file mode 100644 index 00000000..56310ec7 --- /dev/null +++ b/internal/api/scene_intent_source_test.go @@ -0,0 +1,123 @@ +package api + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "testing" + + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/canonical" +) + +func TestCanvasManifestUsesSourceVersionDistinctFromArtifactSet(t *testing.T) { + claims := &attestation.Claims{SceneID: "scene-1", RevisionID: "rev-1", ArtifactSetDigest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"} + version := "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + source := []byte(`{"lsml":"1.2","scene_id":"scene-1","scene_version":"` + version + `","layout":{"type":"frame","children":[]}}`) + var manifest map[string]any + decoder := json.NewDecoder(bytes.NewReader(manifestForTest(t, claims))) + decoder.UseNumber() + if err := decoder.Decode(&manifest); err != nil { + t.Fatal(err) + } + manifest["scene_version"] = version + delete(manifest, "manifest_digest") + digest, err := canonical.Digest(manifest) + if err != nil { + t.Fatal(err) + } + manifest["manifest_digest"] = digest + raw, _ := json.Marshal(manifest) + envelope := resolvedSceneEnvelope{BlueManifest: raw, lsmlBundleBytes: source, LSMLBundleDigest: sha256Digest(source)} + if _, err := verifySceneArtifacts(envelope, claims, nil); err != nil { + t.Fatalf("Canvas manifest must pin the LSML address, not the artifact-set digest: %v", err) + } + for _, field := range []string{"scene_id", "scene_version", "revision_id"} { + t.Run(field, func(t *testing.T) { + var changed map[string]any + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + if err := decoder.Decode(&changed); err != nil { + t.Fatal(err) + } + changed[field] = "different" + delete(changed, "manifest_digest") + digest, err := canonical.Digest(changed) + if err != nil { + t.Fatal(err) + } + changed["manifest_digest"] = digest + envelope.BlueManifest, _ = json.Marshal(changed) + if _, err := verifySceneArtifacts(envelope, claims, nil); err == nil { + t.Fatal("mismatched Canvas/source identity admitted") + } + }) + } +} + +func TestVerifySceneArtifacts_KeepsSourceAndRenderSeparate(t *testing.T) { + source := []byte(`{"lsml":"1.1","layout":{"kind":"text"},"defaults":{"label":"source"}}`) + render := []byte(`{"root":{"kind":"text"},"defaults":{"label":"render"}}`) + claims := &attestation.Claims{RenderBundleDigest: sha256Digest(render)} + for _, local := range []bool{false, true} { + envelope := resolvedSceneEnvelope{LSMLBundleDigest: sha256Digest(source), RenderBundleDigest: sha256Digest(render)} + if local { + envelope.lsmlBundleBytes, envelope.renderBundleBytes = source, render + } else { + envelope.LSMLBundle = base64.StdEncoding.EncodeToString(source) + envelope.RenderBundle = base64.StdEncoding.EncodeToString(render) + } + artifacts, err := verifySceneArtifacts(envelope, claims, nil) + if err != nil || !bytes.Equal(artifacts.Source, source) || !bytes.Equal(artifacts.CurrentRender, render) || artifacts.Program != nil { + t.Fatalf("local=%t: artifacts=%+v err=%v", local, artifacts, err) + } + got, defaults, err := prepareCurrentRender(artifacts) + if err != nil || !bytes.Equal(got, render) || string(defaults["label"]) != `"render"` || !bytes.Equal(artifacts.Source, source) { + t.Fatalf("render adaptation: bundle=%s defaults=%v err=%v", got, defaults, err) + } + } +} + +func TestVerifySceneArtifacts_SourceDoesNotRequireRenderCapsule(t *testing.T) { + source := []byte(`{"lsml":"1.1","layout":{"kind":"text"}}`) + artifacts, err := verifySceneArtifacts(resolvedSceneEnvelope{lsmlBundleBytes: source, LSMLBundleDigest: sha256Digest(source)}, &attestation.Claims{}, nil) + if err != nil || !bytes.Equal(artifacts.Source, source) || artifacts.CurrentRender != nil { + t.Fatalf("source-only verification: %+v %v", artifacts, err) + } +} + +func TestVerifySceneArtifacts_RetainsAdmissionFailures(t *testing.T) { + source := []byte(`{"lsml":"1.1"}`) + for name, envelope := range map[string]resolvedSceneEnvelope{ + "unattested program": {BlueProgram: "e30="}, + "missing source digest": {lsmlBundleBytes: source}, + "bad source digest": {lsmlBundleBytes: source, LSMLBundleDigest: sha256Digest([]byte("different"))}, + "unsigned render": {renderBundleBytes: []byte(`{}`), RenderBundleDigest: sha256Digest([]byte(`{}`))}, + } { + t.Run(name, func(t *testing.T) { + if _, err := verifySceneArtifacts(envelope, &attestation.Claims{}, nil); err == nil { + t.Fatal("invalid artifacts were admitted") + } + }) + } +} + +func TestPrepareCurrentRender_DoesNotCompileSourceAtSceneSwitch(t *testing.T) { + source := []byte(`{"lsml":"1.1"}`) + got, state, err := prepareCurrentRender(verifiedSceneArtifacts{Source: source}) + if err != nil || got != nil || state != nil { + t.Fatalf("source-only scene switch must not create a render bundle: bundle=%s defaults=%v err=%v", got, state, err) + } +} + +func TestPrepareCurrentRender_PreservesPassthroughAndRejectsBadDefaults(t *testing.T) { + source := []byte(`{"lsml":"1.1"}`) + got, defaults, err := prepareCurrentRender(verifiedSceneArtifacts{Source: source}) + if err != nil || got != nil || defaults != nil { + t.Fatalf("source-only scene switch created a render bundle: %s %v %v", got, defaults, err) + } + _, _, err = prepareCurrentRender(verifiedSceneArtifacts{CurrentRender: []byte(`{"defaults":42}`)}) + if err == nil { + t.Fatalf("invalid capsule defaults must retain integrity failure taxonomy: %v", err) + } +} diff --git a/internal/api/scene_intent_static_test.go b/internal/api/scene_intent_static_test.go index 2a6dc6e7..11d64b62 100644 --- a/internal/api/scene_intent_static_test.go +++ b/internal/api/scene_intent_static_test.go @@ -40,7 +40,7 @@ func TestStartBridge_StaticSceneSeedsInitialSnapshot(t *testing.T) { }, Bridges: bluewire.NewRegistry(), } - claims := &attestation.Claims{SceneID: "scene-1", SceneDigest: "sha256:scene"} + claims := &attestation.Claims{SceneID: "scene-1", SceneDigest: "sha256:scene", ArtifactSetDigest: "sha256:scene"} startBridge(deps, bluehost.SlotPreview, claims, "intent-1", false, raw, defaults) if mirror.snapshot == nil { t.Fatal("static scene did not emit its initial snapshot") diff --git a/internal/api/scene_intent_test.go b/internal/api/scene_intent_test.go index b82dc20a..c5dd8309 100644 --- a/internal/api/scene_intent_test.go +++ b/internal/api/scene_intent_test.go @@ -22,6 +22,7 @@ import ( "github.com/ZabLaboratory/Orion/internal/blueproject" "github.com/ZabLaboratory/Orion/internal/bluewire" "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/protocol" "github.com/ZabLaboratory/Orion/internal/runtime" "github.com/ZabLaboratory/Orion/internal/workload" ) @@ -45,9 +46,9 @@ func (f *fakeIdempotencyMetrics) IdempotencyEvicted(reason string) { } // TestIdempotencyCache_TTLWindowExpiresAndIsCounted is the nominal -// replay/dedup-window proof (ADR-BLUE-012 §6.4/§12, B3-R6-OPS-ORION): a +// replay/dedup-window proof (ADR-BLUE-012 §6.4/§12, B3-R6-OPS-ORION): a // tuple stored at t0 is served from cache within the TTL, and treated as a -// fresh miss (not returned stale) once the TTL has elapsed — the eviction +// fresh miss (not returned stale) once the TTL has elapsed — the eviction // is counted with reason "ttl". func TestIdempotencyCache_TTLWindowExpiresAndIsCounted(t *testing.T) { metrics := &fakeIdempotencyMetrics{} @@ -66,7 +67,7 @@ func TestIdempotencyCache_TTLWindowExpiresAndIsCounted(t *testing.T) { t.Fatal("expected a hit at 9s into a 10s TTL window") } - // Past the window: a miss, counted as a "ttl" eviction — never a stale + // Past the window: a miss, counted as a "ttl" eviction — never a stale // replay returned past its window. now = now.Add(2 * time.Second) // t0+11s > 10s TTL if _, ok := c.lookup("k1"); ok { @@ -80,17 +81,17 @@ func TestIdempotencyCache_TTLWindowExpiresAndIsCounted(t *testing.T) { } // TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted is the -// saturation proof for the cache's OTHER axis (ADR-BLUE-012 §12/B8 — -// "surcharge non bornée" is the principal named risk): storing far more +// saturation proof for the cache's OTHER axis (ADR-BLUE-012 §12/B8 — +// "surcharge non bornée" is the principal named risk): storing far more // distinct tuples than maxEntries never grows the map past the cap, and // the eviction that keeps it bounded is counted with reason "capacity". // Fail-closed behavior: an evicted tuple's replay is processed FRESH -// (a miss), never denied outright — bounding memory never blocks traffic. +// (a miss), never denied outright — bounding memory never blocks traffic. func TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted(t *testing.T) { metrics := &fakeIdempotencyMetrics{} const maxEntries = 8 // A TTL long enough that capacity, not staleness, is what triggers - // eviction — isolates the axis under test from TestIdempotencyCache_ + // eviction — isolates the axis under test from TestIdempotencyCache_ // TTLWindowExpiresAndIsCounted above. c := NewIdempotencyCacheWithLimits(time.Hour, maxEntries, metrics) now := time.Unix(1_700_000_000, 0) @@ -106,7 +107,7 @@ func TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted(t *testing.T) { size := len(c.cache) c.mu.Unlock() if size > maxEntries { - t.Fatalf("cache grew to %d entries, want <= %d (maxEntries bound violated — unbounded memory)", size, maxEntries) + t.Fatalf("cache grew to %d entries, want <= %d (maxEntries bound violated — unbounded memory)", size, maxEntries) } metrics.mu.Lock() @@ -117,7 +118,7 @@ func TestIdempotencyCache_SaturationBoundsMemoryAndIsCounted(t *testing.T) { } // Fail-closed-but-not-fail-shut: an evicted (oldest) tuple is a MISS on - // replay, never an error — the caller re-executes fresh. + // replay, never an error — the caller re-executes fresh. if _, ok := c.lookup("k0"); ok { t.Fatal("expected the oldest key to have been evicted under capacity pressure") } @@ -175,7 +176,7 @@ func minimalProgram(t *testing.T) json.RawMessage { return data } -// sha256Digest formats the `sha256:` digest string §6.2 requires. +// sha256Digest formats the `sha256:` digest string §6.2 requires. func sha256Digest(data []byte) string { sum := sha256.Sum256(data) return "sha256:" + hex.EncodeToString(sum[:]) @@ -301,11 +302,11 @@ func TestPostSceneIntent_PreparePreview_Success(t *testing.T) { } // TestPostSceneIntent_PreparePreview_SameSceneSameDigestIsIdempotent is the -// "must still short-circuit" direction of the ADR-BLUE-012 §4.4 slot-identity -// fix: a genuine repeat — same scene_id, same digest — must keep succeeding. +// "must still short-circuit" direction of the ADR-BLUE-012 §4.4 slot-identity +// fix: a genuine repeat — same scene_id, same digest — must keep succeeding. // Host.Prepare unconditionally refuses (ErrAlreadyLoaded) any second call on // an occupied slot BEFORE it ever touches the runtime (host.go's existence -// check is the first statement in Prepare, ahead of runtime.Load/Start) — so +// check is the first statement in Prepare, ahead of runtime.Load/Start) — so // a second response of "prepared" here is only reachable via the caller's // Host.Serving short-circuit swallowing that refusal, which is itself proof // no re-Load happened for the repeat. @@ -388,7 +389,7 @@ func TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces(t *test send := func(sceneID, intentID string) *httptest.ResponseRecorder { // signedRef's scene_digest claim is a fixed "sha256:aaa...a" for - // every call regardless of sceneID/blueProgramDigest — exactly the + // every call regardless of sceneID/blueProgramDigest — exactly the // pre-C3 shape this test targets: two scenes sharing one digest. ref := signedRef(t, priv, "canvas-key-1", attestation.ActionPreparePreview, now, sceneID, digest) body, _ := json.Marshal(sceneIntentRequest{ @@ -424,7 +425,7 @@ func TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces(t *test t.Fatalf("expected scene B to be prepared, got %+v", resp) } // signedRef's scene_digest claim (distinct from blueProgramDigest/digest - // above) is the fixed "sha256:aaa...a" both scene A and scene B carry — + // above) is the fixed "sha256:aaa...a" both scene A and scene B carry — // exactly the collision this test forces. sceneDigest := "sha256:" + strings.Repeat("a", 64) if !deps.Host.Serving(bluehost.SlotPreview, "scene-B", sceneDigest) { @@ -435,7 +436,7 @@ func TestPostSceneIntent_PreparePreview_DifferentSceneSameDigestReplaces(t *test } } -func TestPostSceneIntent_TakeOnAirOwnsBundleAndBridgeOnAir(t *testing.T) { +func TestPostSceneIntent_TakeOnAirKeepsSourceOutsideLegacyBundleAndBridgesOnAir(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) program := minimalProgram(t) bundle := []byte(`{"scene":"on-air"}`) @@ -481,8 +482,8 @@ func TestPostSceneIntent_TakeOnAirOwnsBundleAndBridgeOnAir(t *testing.T) { if rec := send(attestation.ActionPreparePreview, "preview"); rec.Code != http.StatusOK { t.Fatalf("prepare-preview: expected 200, got %d: %s", rec.Code, rec.Body.String()) } - if got := host.Bundle(bluehost.SlotPreview); string(got) != string(bundle) { - t.Fatalf("prepare-preview bundle attached to wrong value: %q", got) + if got := host.Bundle(bluehost.SlotPreview); len(got) != 0 { + t.Fatalf("source-only prepare-preview populated the legacy bundle slot: %q", got) } if host.Bundle(bluehost.SlotOnAir) != nil { t.Fatal("prepare-preview must not attach a bundle to on-air") @@ -494,8 +495,8 @@ func TestPostSceneIntent_TakeOnAirOwnsBundleAndBridgeOnAir(t *testing.T) { if rec := send(attestation.ActionTakeOnAir, "on-air"); rec.Code != http.StatusOK { t.Fatalf("take-on-air: expected 200, got %d: %s", rec.Code, rec.Body.String()) } - if got := host.Bundle(bluehost.SlotOnAir); string(got) != string(bundle) { - t.Fatalf("take-on-air bundle was not attached to on-air: %q", got) + if got := host.Bundle(bluehost.SlotOnAir); len(got) != 0 { + t.Fatalf("source-only take-on-air populated the legacy bundle slot: %q", got) } if !bridges.Running(bluehost.SlotOnAir) { t.Fatal("take-on-air should run the on-air bridge") @@ -636,7 +637,7 @@ func TestPostSceneIntent_WorkloadRefusalPropagates(t *testing.T) { if rec.Code != http.StatusForbidden { t.Fatalf("expected 403, got %d: %s", rec.Code, rec.Body.String()) } - // The reason must be the BARE §4.7 code — Prism's failure vocabulary + // The reason must be the BARE §4.7 code — Prism's failure vocabulary // matches on it exactly; the old err.Error() spelling ("workload: // CODE (http n)") collapsed every typed refusal into // UNKNOWN_RESPONSE on the operator's screen. @@ -651,7 +652,7 @@ func TestPostSceneIntent_WorkloadRefusalPropagates(t *testing.T) { // TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim is the M3 // point of vigilance: the intent must travel BYTE-FOR-BYTE from the -// request body into MintDelegation — Gate binds its values (deadline +// request body into MintDelegation — Gate binds its values (deadline // among them) into the ticket, so any reconstruction or // re-serialization on Orion's side is an AUTH_CONTEXT_MISMATCH. The // posted body carries fields Orion's own sceneIntentRequest does not @@ -709,7 +710,7 @@ func TestPostSceneIntent_RelaysTicketAndRawIntentVerbatim(t *testing.T) { } // The fetch leg (WORKLOAD-FETCH-CANVAS-ALIGN) rides the SAME ticket // and the SAME raw intent bytes, plus the delegation the mint just - // returned — Gate re-validates all of it on the proxy call too. + // returned — Gate re-validates all of it on the proxy call too. if wl.fetchCalls != 1 { t.Fatalf("expected exactly one canvas fetch, got %d", wl.fetchCalls) } @@ -797,14 +798,18 @@ func TestPostSceneIntent_InlineValidatedCapsuleSkipsCanvasFetch(t *testing.T) { } type recordingMirror struct { - mu sync.Mutex - forwarded int + mu sync.Mutex + forwarded int + snapshotVersion string } -func (m *recordingMirror) Forward(any) { +func (m *recordingMirror) Forward(message any) { m.mu.Lock() defer m.mu.Unlock() m.forwarded++ + if snapshot, ok := message.(*protocol.Snapshot); ok { + m.snapshotVersion = snapshot.SceneVersion + } } func (m *recordingMirror) count() int { @@ -859,7 +864,7 @@ func TestPostSceneIntent_BridgeFullLifecycle(t *testing.T) { // The minimal fixture's on-start entrypoint produces no leaf output, // so Bridge.StepOnce's empty-projection no-op (mirroring the legacy // zero-patch-delta drop) means mirror.Forward is never actually - // called here — this lifecycle test asserts the START/STOP wiring + // called here — this lifecycle test asserts the START/STOP wiring // itself (Running before, not Running after), not payload delivery, // which internal/bluewire's own tests already cover with a // non-empty-output fake. @@ -879,77 +884,6 @@ func TestPostSceneIntent_BridgeFullLifecycle(t *testing.T) { } } -// TestPostSceneIntent_MirrorForReceivesRealSceneDigest is the sceneVersion -// coherence half of ORION-TAKE-SLOT-IDENTITY (Blue#345): startBridge must -// pass claims.SceneDigest — the SAME digest Prepare/Take committed on the -// slot — as MirrorFor's sceneVersion argument, never a hardcoded "". -// Before this fix, cmd/orion/main.go's MirrorFor closure hardcoded "" for -// every call, so whatever value the LSDP kit told Solar its scene_version -// was, Solar could never echo back a ?v= that resolveHostBundle (#401) -// would accept — Take's own sceneID fix alone is not sufficient for a real -// client to ever reach the resolver with a matching pair. -func TestPostSceneIntent_MirrorForReceivesRealSceneDigest(t *testing.T) { - pub, priv, _ := ed25519.GenerateKey(nil) - program := minimalProgram(t) - envelope, digest := canvasEnvelope(program) - now := time.Now() - ref := signedRef(t, priv, "canvas-key-1", attestation.ActionPreparePreview, now, "scene-1", digest) - - var gotSceneID, gotSceneVersion string - var calls int - deps := SceneIntentDeps{ - Trust: attestation.TrustSet{"canvas-key-1": pub}, - LocatorPrefix: "scenes/", - OwnerID: "owner-1", - TenantID: "tenant-1", - Workload: &fakeWorkload{body: envelope}, - Host: bluehost.NewHost(), - MirrorFor: func(sceneID, sceneVersion string, _ bluehost.Slot, _ []byte) runtime.SceneMirror { - gotSceneID = sceneID - gotSceneVersion = sceneVersion - calls++ - return &recordingMirror{} - }, - Bridges: bluewire.NewRegistry(), - ProjectionInterval: time.Hour, - } - - body, _ := json.Marshal(sceneIntentRequest{ - IntentID: "intent-1", StreamID: "stream-1", Target: "preview", - Action: string(attestation.ActionPreparePreview), ResolvedSceneRef: ref, - }) - req := httptest.NewRequest(http.MethodPost, "/api/v1/host/scene-intent", bytes.NewReader(body)) - req.Header.Set("X-Authenticated-User", "operator-1") - req.Header.Set("X-Authenticated-Role", "operator") - req.Header.Set(authContextHeader, "opaque-ticket") - - rec := httptest.NewRecorder() - postSceneIntent(deps)(rec, req) - if rec.Code != http.StatusOK { - t.Fatalf("expected 200, got %d: %s", rec.Code, rec.Body.String()) - } - - if calls != 1 { - t.Fatalf("expected MirrorFor called exactly once, got %d", calls) - } - if gotSceneID != "scene-1" { - t.Fatalf("expected sceneID %q, got %q", "scene-1", gotSceneID) - } - if gotSceneVersion == "" { - t.Fatal("MirrorFor received an empty sceneVersion — the #398-class defect: a client can never learn a ?v= that resolveHostBundle would accept") - } - // scene_digest (claims.SceneDigest) is the fixture's fixed "aaa..." - // literal in signedRef — distinct from blue_program_digest (the - // canvasEnvelope-returned `digest` used for the program cross-check). - // It is the SAME value deps.Host.Prepare/Take are already called with — - // the value host.Digest(slot) will hold, so it is what a matching ?v= - // must equal. - wantSceneVersion := "sha256:" + strings.Repeat("a", 64) - if gotSceneVersion != wantSceneVersion { - t.Fatalf("expected sceneVersion to equal claims.SceneDigest %q, got %q", wantSceneVersion, gotSceneVersion) - } -} - func TestPostSceneIntent_IdempotentReplaySkipsReExecution(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) program := minimalProgram(t) @@ -1045,7 +979,7 @@ func TestPostSceneIntent_NoIdempotencyKeyNeverDedupes(t *testing.T) { func TestPostSceneIntent_RequiresOperatorRole(t *testing.T) { deps := SceneIntentDeps{Host: bluehost.NewHost()} req := httptest.NewRequest(http.MethodPost, "/api/v1/host/scene-intent", bytes.NewReader([]byte(`{}`))) - // No X-Authenticated-* headers ⇒ anonymous. + // No X-Authenticated-* headers ⇒ anonymous. rec := httptest.NewRecorder() postSceneIntent(deps)(rec, req) if rec.Code != http.StatusForbidden { @@ -1107,7 +1041,7 @@ func TestGetHostStatus_ReflectsPreparedSlot(t *testing.T) { // extension end to end: once a slot's bridge has forwarded at least one // projection, GET /api/v1/host/status surfaces the SAME correlation_id/ // render_revision that rode the LSDP delta (bluewire.Bridge.LastForwarded), -// as a stateless polling convenience — never anything Orion waited on to +// as a stateless polling convenience — never anything Orion waited on to // answer this request (Refs B3-R6-16-ORION-PGM). func TestGetHostStatus_ReflectsLastForwardedProjection(t *testing.T) { host := bluehost.NewHost() @@ -1115,7 +1049,7 @@ func TestGetHostStatus_ReflectsLastForwardedProjection(t *testing.T) { // entrypoint output) is the same fixture // TestChatDrivenScene_InjectionOrderingIdempotenceProjection already // proves emits a real baseline projection on the very first tick, with - // zero events injected — exactly the deterministic, non-empty forward + // zero events injected — exactly the deterministic, non-empty forward // this test needs. program := chatOverlayProgramFixture(t) if err := host.Prepare(bluehost.SlotOnAir, "instance-1", "scene-1", "sha256:abc", program, nil, nil, nil); err != nil { @@ -1155,7 +1089,7 @@ func TestGetHostStatus_ReflectsLastForwardedProjection(t *testing.T) { } // TestGetHostStatus_NilBridgesOmitsProjection proves the field degrades to -// absent (never a zero-value/invented identity) when deps.Bridges is nil — +// absent (never a zero-value/invented identity) when deps.Bridges is nil — // the same dark-by-default posture MirrorFor/Idempotency already have // (scene_intent.go's SceneIntentDeps doc comments). func TestGetHostStatus_NilBridgesOmitsProjection(t *testing.T) { @@ -1219,7 +1153,7 @@ func TestDecodeAndVerifyBundle_DigestMismatchRejected(t *testing.T) { } } -// TestDecodeAndVerifyBundle_MissingDigestRejected — Bastion C4 (PR #346): +// TestDecodeAndVerifyBundle_MissingDigestRejected — Bastion C4 (PR #346): // a bundle present without its digest must fail closed, never ride // unverified through to GET /host/render-bundle. func TestDecodeAndVerifyBundle_MissingDigestRejected(t *testing.T) { diff --git a/internal/api/scene_presentation.go b/internal/api/scene_presentation.go new file mode 100644 index 00000000..22d413b6 --- /dev/null +++ b/internal/api/scene_presentation.go @@ -0,0 +1,138 @@ +package api + +import ( + "context" + "encoding/json" + "errors" + "fmt" + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/providers" + "time" +) + +// A receiver receipt is not a renderer acknowledgement. This session owns the +// separate prepare/commit/finalize exchange with the selected physical Solar. +type ScenePresentation interface { + Commit(context.Context) error + Finalize(context.Context) error + Abort(context.Context) error +} +type ScenePresenter func(context.Context, bluehost.Slot, string, string, string, []byte) (ScenePresentation, error) + +type presentationTimings interface { + PresentationTimings() map[string]time.Duration +} + +func replaceAdmittedScene(ctx context.Context, deps SceneIntentDeps, slot bluehost.Slot, + claims *attestation.Claims, req sceneIntentRequest, artifacts verifiedSceneArtifacts, bundle []byte, staticState map[string]json.RawMessage) (err error) { + phaseStarted := time.Now() + markPhase := func(name string) { + if deps.ObservePresentationPhase != nil { + deps.ObservePresentationPhase(name, time.Since(phaseStarted)) + } + phaseStarted = time.Now() + } + mode := blueruntime.Preview + if slot == bluehost.SlotOnAir { + mode = blueruntime.Execute + } + candidate, err := deps.Host.StageReplacement(slot, claims.RefID, claims.SceneID, claims.SceneDigest, artifacts.Program, deps.Providers, deps.Policy, bluehost.NewEffectHandlers(deps.Effects, mode)) + if err != nil { + return fmt.Errorf("HOST_PREPARE_FAILED: %w", err) + } + markPhase("blueprepare") + var resumeBridge func(bool) + if deps.Bridges != nil { + resumeBridge = deps.Bridges.Pause(slot) + } + var resumeLane func(bool) + if deps.BeginLaneTransition != nil { + resumeLane = deps.BeginLaneTransition(slot) + } + var presentation ScenePresentation + committed := false + defer func() { + if committed { + return + } + // Cancellation must not cancel compensation. No candidate Blue has stepped. + rollbackCtx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + if deps.Bridges != nil { + deps.Bridges.Stop(slot) + } + compensation := candidate.Rollback() + if resumeLane != nil { + resumeLane(true) + } + if deps.WireFlush != nil { + compensation = errors.Join(compensation, deps.WireFlush(rollbackCtx)) + } + if presentation != nil { + compensation = errors.Join(compensation, presentation.Abort(rollbackCtx)) + } + if resumeBridge != nil { + resumeBridge(true) + } + if compensation != nil { + err = errors.Join(err, fmt.Errorf("SCENE_COMPENSATION_FAILED: %w", compensation)) + } + }() + if deps.PresentScene != nil { + presentation, err = deps.PresentScene(ctx, slot, req.IntentID, claims.SceneID, claims.ArtifactSetDigest, artifacts.Source) + if err != nil { + return fmt.Errorf("SOLAR_PREPARATION_FAILED: %w", err) + } + markPhase("solarprepare") + if err = presentation.Commit(ctx); err != nil { + return fmt.Errorf("SOLAR_COMMIT_FAILED: %w", err) + } + markPhase("solarcommit") + } + if err = candidate.Commit(); err != nil { + return err + } + if bundle != nil { + deps.Host.SetBundle(slot, bundle) + } + deps.Host.SetSceneInterface(slot, artifacts.Source) + deps.Host.SetArtifactSetDigest(slot, claims.ArtifactSetDigest) + // New mirrors seed the source while the bridge remains behind its startup gate. + beginBlue := startBridge(deps, slot, claims, req.IntentID, len(artifacts.Program) > 0, artifacts.Source, staticState) + if deps.WireFlush != nil { + if err = deps.WireFlush(ctx); err != nil { + return fmt.Errorf("NATIVE_LSDP_DELIVERY_FAILED: %w", err) + } + } + markPhase("wireflush") + if presentation != nil { + if err = presentation.Finalize(ctx); err != nil { + return fmt.Errorf("SOLAR_FINALIZATION_FAILED: %w", err) + } + markPhase("solarfinalize") + if measured, ok := presentation.(presentationTimings); ok && deps.ObservePresentationPhase != nil { + for name, elapsed := range measured.PresentationTimings() { + deps.ObservePresentationPhase(name, elapsed) + } + } + } + if resumeLane != nil { + resumeLane(false) + } + if resumeBridge != nil { + resumeBridge(false) + } + // This is the decision point: presentation confirmed, candidate committed. + // A cleanup failure cannot turn an accepted take into a replay of on-start. + committed = true + if stopErr := candidate.Finalize(); stopErr != nil && deps.Logger != nil { + deps.Logger.Error("old scene cleanup failed after commit", "err", stopErr) + } + if slot == bluehost.SlotOnAir { + providers.ResetActiveIngress(deps.Host) + } + beginBlue() + return nil +} diff --git a/internal/api/scene_presentation_test.go b/internal/api/scene_presentation_test.go new file mode 100644 index 00000000..e318dc08 --- /dev/null +++ b/internal/api/scene_presentation_test.go @@ -0,0 +1,92 @@ +package api + +import ( + "bytes" + "context" + "crypto/ed25519" + "encoding/json" + "errors" + "github.com/ZabLaboratory/Orion/internal/attestation" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/runtime" + "net/http" + "net/http/httptest" + "testing" + "time" +) + +type rejectedPresentation struct { + phase string + aborted bool +} + +func (p *rejectedPresentation) Commit(context.Context) error { + if p.phase == "commit" { + return errors.New("no renderer ACK") + } + return nil +} +func (p *rejectedPresentation) Finalize(context.Context) error { + if p.phase == "finalize" { + return errors.New("finalization failed") + } + return nil +} +func (p *rejectedPresentation) Abort(ctx context.Context) error { p.aborted = true; return ctx.Err() } + +func TestSceneIntentCompensatesEachPreFinalizationFailure(t *testing.T) { + for _, phase := range []string{"prepare", "commit", "wire", "finalize"} { + t.Run(phase, func(t *testing.T) { + pub, priv, _ := ed25519.GenerateKey(nil) + program := minimalProgram(t) + envelope, digest := canvasEnvelopeWithBundle(program, []byte(`{"lsml":"1.2","scene_id":"scene-1","layout":{"type":"frame"},"defaults":{}}`)) + host := bluehost.NewHost() + if err := host.PreparePreview("old", "old-scene", "old-digest", program, nil, nil, nil); err != nil { + t.Fatal(err) + } + oldMirror := &recordingMirror{} + bridges := bluewire.NewRegistry() + oldBridge := bluewire.NewBridge(host, bluehost.SlotPreview, oldMirror, "old-scene", "old-digest", "old", "preview", "rev", "intent") + bridges.Start(bluehost.SlotPreview, oldBridge, time.Hour, nil) + defer bridges.StopAll() + defer func() { + if err := host.Release(bluehost.SlotPreview, "test"); err != nil { + t.Error(err) + } + }() + presentation := &rejectedPresentation{phase: phase} + laneRestored := false + wireCalls := 0 + deps := SceneIntentDeps{Trust: attestation.TrustSet{"canvas-key-1": pub}, LocatorPrefix: "scenes/", OwnerID: "owner-1", TenantID: "tenant-1", Host: host, Workload: &fakeWorkload{body: envelope}, Bridges: bridges, + MirrorFor: func(string, string, bluehost.Slot, []byte) runtime.SceneMirror { return &recordingMirror{} }, + BeginLaneTransition: func(bluehost.Slot) func(bool) { return func(restore bool) { laneRestored = restore } }, + PresentScene: func(context.Context, bluehost.Slot, string, string, string, []byte) (ScenePresentation, error) { + if phase == "prepare" { + return presentation, errors.New("invalid source") + } + return presentation, nil + }, + WireFlush: func(context.Context) error { + wireCalls++ + if phase == "wire" && wireCalls == 1 { + return errors.New("native timeout") + } + return nil + }} + raw, _ := json.Marshal(sceneIntentRequest{IntentID: "new", StreamID: "stream-1", Action: "prepare-preview", ResolvedSceneRef: signedRef(t, priv, "canvas-key-1", attestation.ActionPreparePreview, time.Now(), "scene-1", digest)}) + request := httptest.NewRequest(http.MethodPost, "/", bytes.NewReader(raw)) + request.Header.Set("X-Authenticated-User", "operator-1") + request.Header.Set("X-Authenticated-Role", "operator") + request.Header.Set(authContextHeader, "ticket") + response := httptest.NewRecorder() + postSceneIntent(deps)(response, request) + if response.Code == http.StatusOK { + t.Fatal("failed presentation reported success") + } + if !host.Serving(bluehost.SlotPreview, "old-scene", "old-digest") || bridges.Current(bluehost.SlotPreview) != oldBridge || !laneRestored || !presentation.aborted { + t.Fatalf("compensation incomplete: %s", response.Body.String()) + } + }) + } +} diff --git a/internal/api/scenes_get.go b/internal/api/scenes_get.go index 67141db1..fa664cc6 100644 --- a/internal/api/scenes_get.go +++ b/internal/api/scenes_get.go @@ -27,18 +27,19 @@ func getRenderBundle(deps PublicDeps) http.HandlerFunc { } } -// getOperatorInputs serves the operator_inputs slice from the bundle to -// non-Solar adapters (Companion, mPrism). -// -// Migrated off Store (#15, #331), same posture as getRenderBundle. The -// bundle bytes now come from ZabCanvas's lsml_bundle (§6.3), whose exact -// JSON schema for an "operator_inputs" field has NOT been confirmed -// against Orion's legacy compiler.RenderBundle.OperatorInputs shape — -// unmarshalled here as a generic top-level key, best-effort, rather than -// a typed struct that could silently mismatch. Absent key ⇒ empty array, -// never an error (an authored scene may declare none). +// getOperatorInputs serves the admitted source interface to Companion/mPrism. +// Both exact scene id and scene digest remain required. Native source-only +// slots need no bundle; legacy preview consumers retain bundle fallback. func getOperatorInputs(deps PublicDeps) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + digest := r.URL.Query().Get("v") + if host := engineBHost(deps); host != nil { + if inputs, ok := host.SceneOperatorInputs(r.PathValue("id"), digest); ok { + writeImmutable(w, digest, http.StatusOK) + _ = json.NewEncoder(w).Encode(map[string]any{"scene_version": digest, "operator_inputs": inputs}) + return + } + } digest, bundle, ok := resolveHostBundle(deps, r) if !ok { writeJSON(w, http.StatusNotFound, map[string]string{"code": "PUSHED_VERSION_NOT_FOUND"}) @@ -103,24 +104,12 @@ func serveHostBundle(w http.ResponseWriter, r *http.Request, deps PublicDeps) { // // host.Serving(slot, id, v) is the SAME (sceneID, digest) identity check // bluehost.Host already uses for its own idempotent-Prepare admission -// (host.go) — no new identity concept invented here. Serves all three -// consumers of this resolver identically (render-bundle, lsml-bundle, -// operator-inputs — getOperatorInputs calls it directly), so none of the -// three keeps the wider door open behind the other two. +// (host.go) — no new identity concept invented here. Serves the +// compatibility bundle consumers; source interface reads require the same +// exact keys through SceneOperatorInputs. // -// KNOWN GAP, NOT CLOSED HERE (clause 5, Amendment 3 territory, -// bluehost/host.go:478-499): Host.Take never records a sceneID — only -// Prepare does — so host.Serving(SlotOnAir, id, v) can only ever be true -// for id=="". No legitimate on-air fetch through THIS route currently -// succeeds anyway regardless of {id}/?v= — see the PR: the client-side -// version check in @lumencast/runtime independently refuses every -// response this branch could produce, because no occupation carries a -// non-empty scene_version (clause 11's second half, also not closed -// here). This fix closes the harvest (the ONLY consumer that extracted a -// usable result from the prior fallback); it does not — and cannot, -// without touching the reserved slot-identity surface — make an on-air -// fetch through this resolver succeed. Diagnostic gain (silent client -// failure → explicit 404), not a rendering fix. +// Both slots record the scene identity. This compatibility resolver still +// requires actual bundle bytes; source-only interfaces use SceneOperatorInputs. func resolveHostBundle(deps PublicDeps, r *http.Request) (digest string, bundle []byte, ok bool) { sceneID := r.PathValue("id") v := r.URL.Query().Get("v") diff --git a/internal/api/show.go b/internal/api/show.go index 25e90981..93d4dced 100644 --- a/internal/api/show.go +++ b/internal/api/show.go @@ -1,8 +1,10 @@ package api import ( + "context" "encoding/json" "net/http" + "time" "github.com/ZabLaboratory/Orion/internal/runtime" ) @@ -70,7 +72,18 @@ func postTestSession(deps PublicDeps) http.HandlerFunc { writeJSON(w, http.StatusInternalServerError, map[string]string{"code": "INTERNAL"}) return } - sessionID, _ := deps.Test.Open(r.Context(), body.SceneID, scene.Graph(), scene.Bundle(), progs...) + sessionID, clone := deps.Test.Open(context.Background(), body.SceneID, scene.Graph(), scene.Bundle(), progs...) + if deps.NativeLSDPFlush != nil { + err := clone.Flush(r.Context()) + if err == nil { + err = flushNativeDelivery(r.Context(), deps, false) + } + if err != nil { + deps.Test.CloseSession(sessionID) + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"code": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } + } resp := map[string]string{ "session_id": sessionID, "ws_url": "/orion/api/v1/scenes/" + body.SceneID + "/test?session=" + sessionID, @@ -78,13 +91,43 @@ func postTestSession(deps PublicDeps) http.HandlerFunc { // In dual/lsdp mode the session also exposes an isolated LSDP wire // (the preview Solar runtime is LSDP-only). It follows ONLY this // session's clone, never the antenne's active scene. - if deps.LSDPHandler != nil { + if deps.NativeLSDPCheck != nil { + resp["native_resource"] = "solar/sessions" + resp["native_selector"] = sessionID + resp["lease_renew_url"] = "/orion/api/v1/show/test-sessions/" + sessionID + "/lease" + resp["lease_close_url"] = "/orion/api/v1/show/test-sessions/" + sessionID + if expires, err := deps.Test.Renew(sessionID); err == nil { + resp["lease_expires_at"] = expires.UTC().Format(time.RFC3339Nano) + } + } else if deps.LSDPHandler != nil { resp["lsdp_ws_url"] = "/orion/api/v1/scenes/" + body.SceneID + "/test.lsdp?session=" + sessionID } writeJSON(w, http.StatusCreated, resp) }) } +func renewNativeTestSession(deps PublicDeps) http.HandlerFunc { + return requireOperator(func(w http.ResponseWriter, r *http.Request) { + expires, err := deps.Test.Renew(r.PathValue("session")) + if err != nil { + writeJSON(w, http.StatusGone, map[string]string{"code": "TEST_SESSION_EXPIRED"}) + return + } + writeJSON(w, http.StatusOK, map[string]string{"expires_at": expires.UTC().Format(time.RFC3339Nano)}) + }) +} + +func closeNativeTestSession(deps PublicDeps) http.HandlerFunc { + return requireOperator(func(w http.ResponseWriter, r *http.Request) { + deps.Test.CloseSession(r.PathValue("session")) + if err := flushNativeDelivery(r.Context(), deps, false); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"code": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } + w.WriteHeader(http.StatusNoContent) + }) +} + // testSessionLSDP serves the per-session preview LSDP/1.1 wire. Operator/ // admin only (parity with the bespoke ServeTestSession gate). It marks the // session WS-active, delegates the upgrade to the session's OWN kit server @@ -147,6 +190,10 @@ func postPreviewActiveScene(deps PublicDeps) http.HandlerFunc { return } deps.Preview.Activate(body.SceneID, scene.Graph(), scene.Bundle(), progs...) + if err := flushNativeDelivery(r.Context(), deps, true); err != nil { + writeJSON(w, http.StatusServiceUnavailable, map[string]string{"code": "NATIVE_LSDP_DELIVERY_FAILED"}) + return + } writeJSON(w, http.StatusOK, map[string]string{"scene_id": body.SceneID}) }) } diff --git a/internal/api/stream_rules.go b/internal/api/stream_rules.go index 18f89813..2617f3b7 100644 --- a/internal/api/stream_rules.go +++ b/internal/api/stream_rules.go @@ -21,10 +21,11 @@ const maxStreamRuleBlueResponse = 16 << 20 const maxStreamRuleBlueErrorResponse = 64 << 10 // StreamRulesDeps wires the restored ADR 009 HTTP surface to Orion's -// volatile Engine B RulePlane. BlueBaseURL is the existing Blue edge (the +// Engine B RulePlane. BlueBaseURL is the existing Blue edge (the // gateway in production). TokenFunc mints the service bearer for the two // synchronous Blue reads needed to resolve and compile the published program. -// No credential or program is persisted. +// Orion persists the validated published program in stream-control.lsml for +// restart. Credentials and transient Engine state are never persisted there. type StreamRulesDeps struct { Plane *bluehost.RulePlane BlueBaseURL string @@ -103,12 +104,17 @@ func postStreamRule(deps PublicDeps) http.HandlerFunc { writeOperatorError(w, http.StatusUnprocessableEntity, "PROGRAM_REJECTED", "Blue program was rejected by the runtime") return } + if err := flushNativeDelivery(r.Context(), deps, false); err != nil { + writeOperatorError(w, http.StatusServiceUnavailable, "NATIVE_DELIVERY_FAILED", "stream rule startup effects were not acknowledged by the native receiver") + return + } writeJSON(w, http.StatusOK, map[string]string{"stream_rule_id": body.BlueprintID}) }) } -// getStreamRules lists the volatile active set. Prism compares it with its -// durable intent and replays missing ids after an Orion restart. +// getStreamRules lists the active set, restored by Orion from its durable +// program store at startup. The response remains compatible with existing +// clients that reconcile their selected rule IDs. func getStreamRules(deps PublicDeps) http.HandlerFunc { return requireOperator(func(w http.ResponseWriter, _ *http.Request) { ids := []string{} diff --git a/internal/api/testdata/scene-lec-lck.README.md b/internal/api/testdata/scene-lec-lck.README.md new file mode 100644 index 00000000..0ad449a9 --- /dev/null +++ b/internal/api/testdata/scene-lec-lck.README.md @@ -0,0 +1,16 @@ +# Published LEC/LCK visual regression program + +`scene-lec-lck.program.json` contains the exact Blue program bytes synchronized +by Prism for scene `8cbef8cd-ed05-42ca-af9c-7e2762e860b8`, revision +`e3a5bc45-4167-47f7-ad8c-4708fd3a1c32`. It declares `LEC`, `LCK` and +`load-match`; it is not a synthetic output program. Its digest matches the +cached ZabCanvas reference. The program loader verifies its canonical digest. + +Program digest: `sha256:ca2f21db4459f616c0f996fb7c03b3cf61e2a81d48bbc870d671f8fbda327bfc`. +Exact byte SHA-256: `9754a0b16acbaa5f061e9b45189b9a21443deb97ed37449d277b339f77a2b7b3`. + +`TestRealNativeOperatorVisual` invokes the real operator HTTP route and its +read-only DB effects. It requires an authenticated read gateway, the actual +native receiver and a full LSML scene. The CEF observer separately proves its +rendered result. This fixture does not certify current remote publication or +the local visual variant's ZabCanvas compatibility attestation. diff --git a/internal/api/testdata/scene-lec-lck.program.json b/internal/api/testdata/scene-lec-lck.program.json new file mode 100644 index 00000000..d5c9df4e --- /dev/null +++ b/internal/api/testdata/scene-lec-lck.program.json @@ -0,0 +1 @@ +{"budgets":{"max_effects_per_dispatch":100,"max_execution_ms":30000,"max_pending_effects":100,"max_queue_depth":1024,"max_steps_per_dispatch":10000,"max_timers":100},"compiler_version":"0.1.0","data_edges":[{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lck_lit","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lck_set","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lec_lit","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lec_set","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_match","from_port":"payload","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::match_payload_id","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_cr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_clause","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lg_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_clause","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_desc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_where","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_desc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_id","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_desc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_clause","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_where","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_where","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_ch","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4c","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_lk","from_port":"element","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4col","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_nm","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4n","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4s","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_ch","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf10","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_cl","to_port":"max"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf0","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_cl","to_port":"min"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_cl","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_d","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w2","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_d","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_ro","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_lk","to_port":"index"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pal","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_lk","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_mcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_mc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_mc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_nm","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pcr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pid","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pid","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_d","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_cl","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_ro","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_gr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sc","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_l0","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf0","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_l10","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf10","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_mc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w1","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w1","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w2","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w1","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w2","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_cr","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_clause","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_clause","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_dl","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_desc","to_port":"record"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_where","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_desc","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_desc","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_q","to_port":"descriptor"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_q","from_port":"rows","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_sr","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_clause","from_port":"result","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_where","to_port":"element"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_we","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_where","to_port":"list"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_id","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_latest","to_port":"value"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::match_payload_id","from_port":"value","to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_operator","to_port":"value"}],"data_literals":[],"determinism":{"clock":"injected","entropy":"injected","map_iteration":"canonical","scheduler":"injected"},"effects":[],"entrypoints":[{"id":"LCK","kind":"call","node_id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_lck","port":"then"},{"id":"LEC","kind":"call","node_id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_lec","port":"then"},{"id":"load-match","kind":"call","node_id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_match","port":"then"}],"errors":{"profile":"blue.runtime.error.v1","unhandled":"halt"},"exec_edges":[{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lck_set","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lec_set","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_latest","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_lck","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lck_set","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_lec","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lec_set","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_match","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_operator","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_q","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_sr","to_port":"in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_sr","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_latest","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_q","to_port":"exec_in"},{"from_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_operator","from_port":"then","sequence":0,"to_node":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_q","to_port":"exec_in"}],"nodes":[{"config":{"value":"LCK"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lck_lit","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::league"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lck_set","opcode":"core.variable.set@1"},{"config":{"value":"LEC"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lec_lit","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::league"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lec_set","opcode":"core.variable.set@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::league"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::lg_get","opcode":"core.variable.get@1"},{"config":{"path":"match_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::match_payload_id","opcode":"core.data.get-field@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_clause","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"league","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_cr","opcode":"core.literal@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_desc","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"order":[{"column":"played_at","direction":"desc"}],"select":["id"],"table":"matches"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_rows"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_gr","opcode":"core.variable.get@1"},{"config":{"path":"0.id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_id","opcode":"core.data.get-field@1"},{"config":{"datasource":"truth"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_q","opcode":"core.db.query@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_rows"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_sr","opcode":"core.variable.set@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_we","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_where","opcode":"core.data.list-append@1"},{"config":{"name":"pl.L0.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0c","opcode":"core.output@1"},{"config":{"name":"pl.L0.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0col","opcode":"core.output@1"},{"config":{"name":"pl.L0.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0n","opcode":"core.output@1"},{"config":{"name":"pl.L0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL0s","opcode":"core.output@1"},{"config":{"name":"pl.L1.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1c","opcode":"core.output@1"},{"config":{"name":"pl.L1.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1col","opcode":"core.output@1"},{"config":{"name":"pl.L1.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1n","opcode":"core.output@1"},{"config":{"name":"pl.L1.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL1s","opcode":"core.output@1"},{"config":{"name":"pl.L2.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2c","opcode":"core.output@1"},{"config":{"name":"pl.L2.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2col","opcode":"core.output@1"},{"config":{"name":"pl.L2.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2n","opcode":"core.output@1"},{"config":{"name":"pl.L2.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL2s","opcode":"core.output@1"},{"config":{"name":"pl.L3.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3c","opcode":"core.output@1"},{"config":{"name":"pl.L3.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3col","opcode":"core.output@1"},{"config":{"name":"pl.L3.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3n","opcode":"core.output@1"},{"config":{"name":"pl.L3.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL3s","opcode":"core.output@1"},{"config":{"name":"pl.L4.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4c","opcode":"core.output@1"},{"config":{"name":"pl.L4.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4col","opcode":"core.output@1"},{"config":{"name":"pl.L4.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4n","opcode":"core.output@1"},{"config":{"name":"pl.L4.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oL4s","opcode":"core.output@1"},{"config":{"name":"pl.R0.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0c","opcode":"core.output@1"},{"config":{"name":"pl.R0.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0col","opcode":"core.output@1"},{"config":{"name":"pl.R0.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0n","opcode":"core.output@1"},{"config":{"name":"pl.R0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR0s","opcode":"core.output@1"},{"config":{"name":"pl.R1.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1c","opcode":"core.output@1"},{"config":{"name":"pl.R1.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1col","opcode":"core.output@1"},{"config":{"name":"pl.R1.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1n","opcode":"core.output@1"},{"config":{"name":"pl.R1.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR1s","opcode":"core.output@1"},{"config":{"name":"pl.R2.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2c","opcode":"core.output@1"},{"config":{"name":"pl.R2.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2col","opcode":"core.output@1"},{"config":{"name":"pl.R2.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2n","opcode":"core.output@1"},{"config":{"name":"pl.R2.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR2s","opcode":"core.output@1"},{"config":{"name":"pl.R3.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3c","opcode":"core.output@1"},{"config":{"name":"pl.R3.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3col","opcode":"core.output@1"},{"config":{"name":"pl.R3.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3n","opcode":"core.output@1"},{"config":{"name":"pl.R3.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR3s","opcode":"core.output@1"},{"config":{"name":"pl.R4.champ"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4c","opcode":"core.output@1"},{"config":{"name":"pl.R4.color"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4col","opcode":"core.output@1"},{"config":{"name":"pl.R4.name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4n","opcode":"core.output@1"},{"config":{"name":"pl.R4.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::oR4s","opcode":"core.output@1"},{"config":{"entrypoint":"LCK","ui":{"hint":"Charger le dernier match LCK","label":"LCK"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_lck","opcode":"core.operator.on-call@1"},{"config":{"entrypoint":"LEC","ui":{"hint":"Charger le dernier match LEC","label":"LEC"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_lec","opcode":"core.operator.on-call@1"},{"config":{"entrypoint":"load-match","ui":{"hint":"Choisir, noter et afficher un match","label":"Charger un match","widget":"match-selector"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::on_match","opcode":"core.operator.on-call@1"},{"config":{"path":"0.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_0"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_mcr","opcode":"core.literal@1"},{"config":{"path":"0.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pcr","opcode":"core.literal@1"},{"config":{"path":"0.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_0"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p0_we","opcode":"core.literal@1"},{"config":{"path":"1.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_1"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_mcr","opcode":"core.literal@1"},{"config":{"path":"1.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pcr","opcode":"core.literal@1"},{"config":{"path":"1.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_1"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p1_we","opcode":"core.literal@1"},{"config":{"path":"2.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_2"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_mcr","opcode":"core.literal@1"},{"config":{"path":"2.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pcr","opcode":"core.literal@1"},{"config":{"path":"2.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_2"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p2_we","opcode":"core.literal@1"},{"config":{"path":"3.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_3"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_mcr","opcode":"core.literal@1"},{"config":{"path":"3.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pcr","opcode":"core.literal@1"},{"config":{"path":"3.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_3"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p3_we","opcode":"core.literal@1"},{"config":{"path":"4.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_4"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_mcr","opcode":"core.literal@1"},{"config":{"path":"4.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pcr","opcode":"core.literal@1"},{"config":{"path":"4.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_4"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p4_we","opcode":"core.literal@1"},{"config":{"path":"5.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_5"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_mcr","opcode":"core.literal@1"},{"config":{"path":"5.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pcr","opcode":"core.literal@1"},{"config":{"path":"5.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_5"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p5_we","opcode":"core.literal@1"},{"config":{"path":"6.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_6"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_mcr","opcode":"core.literal@1"},{"config":{"path":"6.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pcr","opcode":"core.literal@1"},{"config":{"path":"6.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_6"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p6_we","opcode":"core.literal@1"},{"config":{"path":"7.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_7"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_mcr","opcode":"core.literal@1"},{"config":{"path":"7.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pcr","opcode":"core.literal@1"},{"config":{"path":"7.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_7"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p7_we","opcode":"core.literal@1"},{"config":{"path":"8.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_8"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_mcr","opcode":"core.literal@1"},{"config":{"path":"8.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pcr","opcode":"core.literal@1"},{"config":{"path":"8.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_8"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p8_we","opcode":"core.literal@1"},{"config":{"path":"9.champion_image_url"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_ch","opcode":"core.data.get-field@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_cl","opcode":"core.math.clamp@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_d","opcode":"core.data.set-field@1"},{"config":{"value":{"limit":1,"select":["score"],"table":"player_scores"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_9"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_gr","opcode":"core.variable.get@1"},{"config":{"value":0},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_l0","opcode":"core.literal@1"},{"config":{"value":10},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_l10","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_lk","opcode":"core.data.list-at@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_mc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_mcr","opcode":"core.literal@1"},{"config":{"path":"9.summoner_name"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_nm","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pal","opcode":"core.variable.get@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pc","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"player_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pcr","opcode":"core.literal@1"},{"config":{"path":"9.player_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_pid","opcode":"core.data.get-field@1"},{"config":{"datasource":"ranking"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_q","opcode":"core.db.query@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_ro","opcode":"core.math.round@1"},{"config":{"path":"0.score"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sc","opcode":"core.data.get-field@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_9"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_sr","opcode":"core.variable.set@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf0","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_tf10","opcode":"core.cast.to-float@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w1","opcode":"core.data.list-append@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_w2","opcode":"core.data.list-append@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::p9_we","opcode":"core.literal@1"},{"config":{"path":"value"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_clause","opcode":"core.data.set-field@1"},{"config":{"value":{"column":"match_id","op":"="}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_cr","opcode":"core.literal@1"},{"config":{"path":"where"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_desc","opcode":"core.data.set-field@1"},{"config":{"value":{"joins":[{"on":["player_id","id"],"select":["summoner_name"],"table":"players"}],"select":["player_id","side","role","champion","champion_image_url"],"table":"match_player_champions"}},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_dl","opcode":"core.literal@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rost_rows"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_gr","opcode":"core.variable.get@1"},{"config":{"datasource":"truth"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_q","opcode":"core.db.query@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rost_rows"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_sr","opcode":"core.variable.set@1"},{"config":{"value":[]},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_we","opcode":"core.literal@1"},{"config":{},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rl_where","opcode":"core.data.list-append@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_latest","opcode":"core.variable.set@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_from_operator","opcode":"core.variable.set@1"},{"config":{"variable":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_id"},"id":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_get","opcode":"core.variable.get@1"}],"opcodes":[{"config":[],"id":"core.cast.to-float@1","inputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}],"kind":"pure","outputs":[{"kind":"data","name":"ok","required":true,"type":"core.primitive.boolean"},{"kind":"data","name":"result","required":true,"type":"core.primitive.float"}]},{"config":[{"kind":"data","name":"path","required":true,"type":"core.primitive.string"}],"id":"core.data.get-field@1","inputs":[{"kind":"data","name":"record","required":true,"type":"core.primitive.json"}],"kind":"pure","outputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}]},{"config":[],"id":"core.data.list-append@1","inputs":[{"kind":"data","name":"element","required":true,"type":"core.primitive.json"},{"kind":"data","name":"list","required":true,"type":"core.primitive.json"}],"kind":"pure","outputs":[{"kind":"data","name":"result","required":true,"type":"core.primitive.json"}]},{"config":[],"id":"core.data.list-at@1","inputs":[{"kind":"data","name":"index","required":true,"type":"core.primitive.integer"},{"kind":"data","name":"list","required":true,"type":"core.primitive.json"}],"kind":"pure","outputs":[{"kind":"data","name":"element","required":true,"type":"core.primitive.json"}]},{"config":[{"kind":"data","name":"path","required":true,"type":"core.primitive.string"}],"id":"core.data.set-field@1","inputs":[{"kind":"data","name":"record","required":true,"type":"core.primitive.json"},{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}],"kind":"pure","outputs":[{"kind":"data","name":"result","required":true,"type":"core.primitive.json"}]},{"config":[{"kind":"data","name":"datasource","required":true,"type":"core.primitive.string"}],"id":"core.db.query@1","inputs":[{"kind":"data","name":"descriptor","required":true,"type":"core.primitive.json"},{"kind":"data","name":"timeout_seconds","required":false,"type":"core.primitive.float"},{"kind":"exec","name":"exec_in","required":true,"type":"core.exec"}],"kind":"control","outputs":[{"kind":"data","name":"count","required":true,"type":"core.primitive.integer"},{"kind":"data","name":"elapsed_ms","required":true,"type":"core.primitive.integer"},{"kind":"data","name":"error","required":true,"type":"core.primitive.string"},{"kind":"data","name":"rows","required":true,"type":"core.primitive.json"},{"kind":"exec","name":"error","required":true,"type":"core.exec"},{"kind":"exec","name":"then","required":true,"type":"core.exec"}]},{"config":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}],"id":"core.literal@1","inputs":[],"kind":"pure","outputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}]},{"config":[],"id":"core.math.clamp@1","inputs":[{"kind":"data","name":"max","required":true,"type":"core.primitive.float"},{"kind":"data","name":"min","required":true,"type":"core.primitive.float"},{"kind":"data","name":"value","required":true,"type":"core.primitive.float"}],"kind":"pure","outputs":[{"kind":"data","name":"result","required":true,"type":"core.primitive.float"}]},{"config":[],"id":"core.math.round@1","inputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.float"}],"kind":"pure","outputs":[{"kind":"data","name":"result","required":true,"type":"core.primitive.integer"}]},{"config":[{"kind":"data","name":"entrypoint","required":true,"type":"core.primitive.string"},{"kind":"data","name":"ui","required":false,"type":"core.primitive.json"}],"id":"core.operator.on-call@1","inputs":[],"kind":"entrypoint","outputs":[{"kind":"data","name":"payload","required":true,"type":"core.primitive.json"},{"kind":"exec","name":"then","required":true,"type":"core.exec"}]},{"config":[{"kind":"data","name":"name","required":true,"type":"core.primitive.string"}],"id":"core.output@1","inputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}],"kind":"control","outputs":[]},{"config":[{"kind":"data","name":"variable","required":true,"type":"core.primitive.string"}],"id":"core.variable.get@1","inputs":[],"kind":"pure","outputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"}]},{"config":[{"kind":"data","name":"variable","required":true,"type":"core.primitive.string"}],"id":"core.variable.set@1","inputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"},{"kind":"exec","name":"in","required":true,"type":"core.exec"}],"kind":"control","outputs":[{"kind":"data","name":"value","required":true,"type":"core.primitive.json"},{"kind":"exec","name":"then","required":true,"type":"core.exec"}]}],"ordering":{"duplicate_event":"idempotent_same_digest","effect_completion":"explicit_fifo_event","event_inbox":"fifo_by_runtime_sequence","event_sequence_scope":"instance_per_origin","exec_fanout":"ascending_edge_sequence","sequence_gap":"reject","timer_tie_break":"due_at_then_timer_id"},"program_digest":"sha256:ca2f21db4459f616c0f996fb7c03b3cf61e2a81d48bbc870d671f8fbda327bfc","program_id":"sha256:ab452e35caf5ddd991a1b26a09a7f32faffa578889008fe1dc85ed7fefd781a1","requires":[],"runtime_abi":"blue-runtime-abi.v1","runtime_module":{"name":"blue-runtime-go","version":"0.1.0"},"schema_version":"blue.program.v1","source_revision":{"digest":"sha256:14bd3f4f299e60ca328674966b7a03f8ff4eff8bc94d57931ed221b85db4e3a3","id":"sha256:ab452e35caf5ddd991a1b26a09a7f32faffa578889008fe1dc85ed7fefd781a1","kind":"bundle.v1","revision":1},"state":{"outputs":[],"variables":[{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::league","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::mbl_rows","type":"core.primitive.json"},{"initial":["#B31A1A","#B33C1A","#B36B1A","#B3981A","#8EB31A","#26B326","#1AB360","#1AB398","#1A7FB3","#1A3EB3","#4D4DFF"],"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::palette","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::rost_rows","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::selected_match_id","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_0","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_1","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_2","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_3","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_4","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_5","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_6","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_7","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_8","type":"core.primitive.json"},{"initial":null,"name":"20d8ceaa-5766-4492-be94-8c58099519dc::5::sfp_9","type":"core.primitive.json"}]},"timers":[],"topics":[],"types":[{"id":"core.primitive.boolean","kind":"primitive","spec":{"base":"boolean"}},{"id":"core.primitive.bytes","kind":"primitive","spec":{"base":"string"}},{"id":"core.primitive.datetime","kind":"primitive","spec":{"base":"string"}},{"id":"core.primitive.float","kind":"primitive","spec":{"base":"number"}},{"id":"core.primitive.integer","kind":"primitive","spec":{"base":"integer"}},{"id":"core.primitive.json","kind":"primitive","spec":{"base":"json"}},{"id":"core.primitive.null","kind":"primitive","spec":{"base":"any"}},{"id":"core.primitive.string","kind":"primitive","spec":{"base":"string"}},{"id":"core.primitive.uuid","kind":"primitive","spec":{"base":"string"}}]} \ No newline at end of file diff --git a/internal/auth/identity.go b/internal/auth/identity.go index c7cf307b..64d177b1 100644 --- a/internal/auth/identity.go +++ b/internal/auth/identity.go @@ -10,11 +10,9 @@ // and injects the same headers, so Orion's WS handler reads the // same surface regardless of how the client authed. // -// The Validator wired in this package is for an extra defence in -// depth: when Orion is *handed* a show-token (e.g., received via -// query string at the ZabGate boundary), it re-checks revocation -// against ZabAuth's /tokens/{jti}/validate endpoint. Cache TTL is -// short (default 60 s) so a revoke propagates quickly. +// Embedded-local startup instead uses a loopback handshake. Native Solar +// authentication belongs to the shared receiver; Orion does not instantiate +// a separate, unused token validator. package auth import ( diff --git a/internal/auth/local_operator.go b/internal/auth/local_operator.go index b81e4fb5..cd5743f1 100644 --- a/internal/auth/local_operator.go +++ b/internal/auth/local_operator.go @@ -7,24 +7,6 @@ import ( "github.com/ZabLaboratory/Orion/internal/obs" ) -// LocalViewerQuery authenticates a browser WebSocket against the same local -// operator source without exposing the operator handshake in the URL. Prism -// verifies the random viewer token before this middleware injects the -// loopback-only handshake header into a cloned request. -func LocalViewerQuery(viewerToken, operatorSecret string, next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - provided := r.URL.Query().Get("local_viewer_token") - if viewerToken == "" || operatorSecret == "" || - subtle.ConstantTimeCompare([]byte(provided), []byte(viewerToken)) != 1 { - next.ServeHTTP(w, r) - return - } - clone := r.Clone(r.Context()) - clone.Header.Set(HandshakeHeader, operatorSecret) - next.ServeHTTP(w, clone) - }) -} - // HandshakeHeader is the request header carrying the Prism↔Orion shared // handshake secret (ADR 016 §3.2-2, §3.4). In the embedded-local profile // the Prism main process generates a high-entropy secret at sidecar spawn, diff --git a/internal/auth/service_token_manager.go b/internal/auth/service_token_manager.go index f2c7e11f..6175a559 100644 --- a/internal/auth/service_token_manager.go +++ b/internal/auth/service_token_manager.go @@ -195,13 +195,9 @@ type ServiceTokenManager struct { wg sync.WaitGroup } -func NewServiceTokenManager(ctx context.Context, databaseURL, refreshURL, seed, encryptionKey, staticToken string, logger *slog.Logger) (*ServiceTokenManager, error) { - return NewServiceTokenManagerWithStatePath(ctx, databaseURL, refreshURL, seed, encryptionKey, staticToken, "", logger) -} - // NewServiceTokenManagerWithStatePath adds encrypted file-backed state for -// Prism's embedded-local profile. Antenne callers retain the original -// constructor and remain Postgres-backed. +// Prism's embedded-local profile. The optional Postgres store remains available +// through this same constructor for explicit integration consumers. func NewServiceTokenManagerWithStatePath(ctx context.Context, databaseURL, refreshURL, seed, encryptionKey, staticToken, statePath string, logger *slog.Logger) (*ServiceTokenManager, error) { m := &ServiceTokenManager{ refreshURL: strings.TrimRight(refreshURL, "/"), diff --git a/internal/auth/validator.go b/internal/auth/validator.go deleted file mode 100644 index 0e40e0ae..00000000 --- a/internal/auth/validator.go +++ /dev/null @@ -1,122 +0,0 @@ -package auth - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net/http" - "strings" - "sync" - "time" -) - -// ValidationResult mirrors ZabAuth's -// `GET /auth/api/v1/tokens/{jti}/validate` response shape. -// Per the ZabAuth chantier brief: `{valid, role, paths, expires_at}`. -type ValidationResult struct { - Valid bool `json:"valid"` - Role Role `json:"role"` - Paths []string `json:"paths"` - ExpiresAt time.Time `json:"expires_at"` -} - -// Validator queries ZabAuth's /validate endpoint with a small -// in-memory cache. ZabGate already validated the token's signature on -// upgrade; this is the additional revocation/expiry probe Orion -// performs for show-tokens that came in via the WS query string. -type Validator struct { - endpoint string // e.g. http://zabgate:4000/auth/api/v1/tokens - serviceToken string // Orion's own service token, presented as Bearer - httpClient *http.Client - cacheTTL time.Duration - - mu sync.Mutex - cache map[string]cachedValidation - now func() time.Time // injected for tests -} - -type cachedValidation struct { - result ValidationResult - expiresAt time.Time // local cache expiry — distinct from ValidationResult.ExpiresAt -} - -// NewValidator builds a validator. endpoint should NOT include the -// `/{jti}/validate` suffix — Validator appends it per call. -func NewValidator(endpoint, serviceToken string, cacheTTL time.Duration) *Validator { - return &Validator{ - endpoint: strings.TrimRight(endpoint, "/"), - serviceToken: serviceToken, - httpClient: &http.Client{Timeout: 5 * time.Second}, - cacheTTL: cacheTTL, - cache: make(map[string]cachedValidation), - now: time.Now, - } -} - -// Validate calls /validate, caching successful results for cacheTTL. -// A failed validation is cached with a much shorter TTL (2 s) so a -// flapping ZabAuth doesn't either pin "invalid" forever or get -// hammered. -func (v *Validator) Validate(ctx context.Context, jti string) (ValidationResult, error) { - if jti == "" { - return ValidationResult{}, errors.New("auth: empty jti") - } - - now := v.now() - - v.mu.Lock() - if hit, ok := v.cache[jti]; ok && hit.expiresAt.After(now) { - v.mu.Unlock() - return hit.result, nil - } - v.mu.Unlock() - - res, err := v.fetch(ctx, jti) - if err != nil { - return ValidationResult{}, err - } - - ttl := v.cacheTTL - if !res.Valid { - // Short cache on negative answers so a fresh issuance picks up quickly. - ttl = 2 * time.Second - } - if ttl > 0 { - v.mu.Lock() - v.cache[jti] = cachedValidation{result: res, expiresAt: now.Add(ttl)} - v.mu.Unlock() - } - return res, nil -} - -func (v *Validator) fetch(ctx context.Context, jti string) (ValidationResult, error) { - url := fmt.Sprintf("%s/%s/validate", v.endpoint, jti) - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - return ValidationResult{}, err - } - if v.serviceToken != "" { - req.Header.Set("Authorization", "Bearer "+v.serviceToken) - } - req.Header.Set("Accept", "application/json") - - resp, err := v.httpClient.Do(req) - if err != nil { - return ValidationResult{}, fmt.Errorf("auth: validate: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode == http.StatusNotFound { - return ValidationResult{Valid: false}, nil - } - if resp.StatusCode != http.StatusOK { - return ValidationResult{}, fmt.Errorf("auth: validate: status %d", resp.StatusCode) - } - - var out ValidationResult - if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { - return ValidationResult{}, fmt.Errorf("auth: decode validate: %w", err) - } - return out, nil -} diff --git a/internal/bluehost/README.md b/internal/bluehost/README.md new file mode 100644 index 00000000..cc2270fe --- /dev/null +++ b/internal/bluehost/README.md @@ -0,0 +1,82 @@ +# Blue host surface + +Canvas owns functional validation of scene Blues. Orion executes the admitted +artifact and reports runtime/adapter errors; it has no business-output oracle. + +`host.go` owns the two independent scene slots, Preview and Program. The global +`rule_plane.go` owns one portable instance per enabled stream rule. All three +use the same providers, route resolver, effect dependencies and runtime ABI. + +`replacement.go` stages an unstepped candidate while retaining the exact old +instance. Calls, resolve, ticks and new platform events are blocked for that +slot during presentation. Rollback restores the old instance, including its +await/clock state; finalization releases it and opens the new execution gate. +The API coordinator owns the Solar/bridge/mirror transaction around this object. + +`scene_commit.go` additionally fences Program admission work against an explicit +native release and physical authority transfers. A released Program refuses +scene-intent admissions until `SwapAuthority` promotes the existing Preview. +The next Take neither loads nor starts a second copy. Preview leases and the +global rule plane remain independent. `program_release_test.go` covers this gate; +API/native cleanup is owned by `internal/api/program_release.go`. + +`effects.go` handles dedicated HTTP, DB, service and camera opcodes. +`effect_http.go` admits generic invocations and completes them explicitly; +`effect_local.go` reuses the same DB/service/camera operations and adds local +show events, overlays, LSML mutation and animation commands. Unsupported or +unconfigured generic adapters complete with a failure instead of staying pending. +`providers.Registry` is the capability owner, not a second opcode catalogue. + +`show_emit.go`, `effect_overlay.go` and `effect_animation.go` project the portable +runtime's cumulative side-effect bags once per node and causation identity. +Their history retains only the latest identity per node. `event_router.go` +queues nested scene/rule emissions with a 1024-event cascade bound. The same +router delivers to both active scene slots and every global rule. Rules that +do not declare a topic ignore it; invalid payloads and execution errors are +reported per rule without blocking other listeners. Fan-out snapshots targets +and releases the plane lock before runtime execution, including calls/ticks, +so nested emissions cannot deadlock a concurrent promotion/demotion. +Preview show emit and overlay set +do not write the Program control plane. Camera writes are forbidden in Preview. + +`core.lsml/mutate` accepts up to 128 atomic add/remove/replace/test operations +on layout, individual defaults and animations. `bluewire.Registry.Mutate` +routes to the slot's current native mirror, including static scenes without a +Blue ticker. Source identity, Blue pins and camera authority cannot be rewritten. +`core.animation/play` carries `{animation_id, command_id}` to a stable default +leaf; Solar executes the declared asset. A new invocation replays the animation. + +`GET /api/v1/runtime/host-surface` supplements the portable descriptor with +Orion adapters and configured availability. It does not certify that arbitrary +authoring extensions, undeclared apps or missing service routes exist. + +Global rule persistence and local process ownership belong to +[`streamcontrol`](../streamcontrol/README.md). Tests cover effect parity, +entrypoints, Preview policy, reentrant events, native mutations and actual Marker +launch. The real native/Marker tests are opt-in and report skips explicitly. + +`scene_interface.go` retains the operator declaration from admitted canonical +LSML, independently of an optional compatibility render bundle. Both cockpit +slots and exact-address `GET /scenes/{id}/operator-inputs?v={scene_digest}` +read this declaration; an empty source interface suppresses legacy controls. +The initial scene bridge executes one Step before periodic Ticks: Ticks alone +do not run Blue on-start entrypoints or arm initial operator awaits. + +Operator completion diagnostics separate `runtime_wait_ms` (host serialization) +from `runtime_ms` (the full portable call, including synchronous effects). +The DB completion diagnostic's `transport_ms` includes authorization and the +QueryMe round trip; it is not pure database execution time. These numeric fields +do not alter outputs, effect authority or runtime admission. + +Limits: declaration discovery does not add a parameter-write API or a global +rule parameter interface. Generic invocation adapters do not themselves create +user-authorable Blue editor nodes. Native scene mutations cannot change scene +identity; changing the selection of a scene still needs Orion admission. + +`authority.go` exchanges the same Preview/OnAir entries after both admission +leases and bridge joins. Blue PrepareAuthority validates both prospective modes +before either is committed. Static entries move with their scene interface and +bundle. No on-start replay or duplicate actor is introduced; unresolved async +effects refuse the handoff. `authority_test.go` covers exact handle identity and +replacement refusal. Consumers are api NativeLaneCommitter and the BlueWire +registry; their physical routing contract is in api/README.md. diff --git a/internal/bluehost/authority.go b/internal/bluehost/authority.go new file mode 100644 index 00000000..fd72e1a6 --- /dev/null +++ b/internal/bluehost/authority.go @@ -0,0 +1,49 @@ +package bluehost + +import ( + "errors" + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" +) + +// SwapAuthority moves admitted actors between roles under both admission leases. +// Caller pauses and joins both bridges first. No runtime Load/Start/Step occurs. +func (h *Host) SwapAuthority() error { + h.runtimeMu.Lock() + defer h.runtimeMu.Unlock() + h.mu.Lock() + defer h.mu.Unlock() + if h.transitions[SlotPreview] || h.transitions[SlotOnAir] { + return errors.New("LANE_COMMIT_BLUE_BUSY") + } + p, v := h.slots[SlotOnAir], h.slots[SlotPreview] + commits := []func(){} + for _, item := range []struct { + e *entry + mode blueruntime.Mode + }{{p, blueruntime.Preview}, {v, blueruntime.Execute}} { + if item.e == nil || item.e.instance == nil { + continue + } + commit, err := h.runtime.PrepareAuthority(item.e.instance, item.mode, NewEffectHandlers(h.effectDeps, item.mode)) + if err != nil { + return errors.New("LANE_COMMIT_BLUE_AUTHORITY_REFUSED") + } + commits = append(commits, commit) + } + for _, commit := range commits { + commit() + } + if v == nil { + delete(h.slots, SlotOnAir) + } else { + h.slots[SlotOnAir] = v + } + if p == nil { + delete(h.slots, SlotPreview) + } else { + h.slots[SlotPreview] = p + } + h.programAdmissionEpoch++ + h.programSuspended = v == nil + return nil +} diff --git a/internal/bluehost/authority_test.go b/internal/bluehost/authority_test.go new file mode 100644 index 00000000..52476e1c --- /dev/null +++ b/internal/bluehost/authority_test.go @@ -0,0 +1,41 @@ +package bluehost + +import "testing" + +func TestAuthoritySwapKeepsInstanceHandlesAndState(t *testing.T) { + h := NewHost() + program := fixture(t) + if err := h.Prepare(SlotPreview, "preview-actor", "scene-b", "digest-b", program, nil, nil, nil); err != nil { + t.Fatal(err) + } + if err := h.Take("program-actor", "scene-a", "digest-a", program, nil, nil, nil); err != nil { + t.Fatal(err) + } + _, _ = h.Step(SlotPreview) + _, _ = h.Step(SlotOnAir) + p, v := h.slots[SlotOnAir], h.slots[SlotPreview] + if err := h.SwapAuthority(); err != nil { + t.Fatal(err) + } + if h.slots[SlotOnAir] != v || h.slots[SlotPreview] != p { + t.Fatal("actors replaced") + } + if _, err := h.Step(SlotOnAir); err != nil { + t.Fatal(err) + } + if err := h.SwapAuthority(); err != nil { + t.Fatal(err) + } + if h.slots[SlotOnAir] != p || h.slots[SlotPreview] != v { + t.Fatal("round trip lost actors") + } +} +func TestAuthoritySwapRefusesSceneReplacementAndKeepsSlots(t *testing.T) { + h := NewHost() + _ = h.PreparePreviewStatic("scene-b", "v") + p := h.slots[SlotPreview] + h.transitions = map[Slot]bool{SlotOnAir: true} + if h.SwapAuthority() == nil || h.slots[SlotPreview] != p || h.slots[SlotOnAir] != nil { + t.Fatal("busy authority changed") + } +} diff --git a/internal/bluehost/effect_animation.go b/internal/bluehost/effect_animation.go new file mode 100644 index 00000000..a2d743f2 --- /dev/null +++ b/internal/bluehost/effect_animation.go @@ -0,0 +1,90 @@ +package bluehost + +import ( + "fmt" + "sort" + "strings" + + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "github.com/ZabLaboratory/Orion/internal/canonical" +) + +const animationBag = "__animation.play" + +type SceneMutationSink func(Slot, []map[string]any) error + +func (h *Host) SurfaceAvailability() (show, mutation, animation bool) { + h.mu.Lock() + defer h.mu.Unlock() + return h.showEmitSink != nil, h.sceneMutationSink != nil, h.sceneMutationSink != nil +} + +func (h *Host) SetSceneMutationSink(sink SceneMutationSink) { + h.mu.Lock() + defer h.mu.Unlock() + h.sceneMutationSink = sink +} + +func (h *Host) publishAnimation(slot Slot, id string, request map[string]any) error { + if id == "" || stringField(request, "animation_id") == "" { + return fmt.Errorf("ANIMATION_REQUEST_INVALID: animation_id is required") + } + h.mu.Lock() + sink := h.sceneMutationSink + h.mu.Unlock() + if sink == nil { + return fmt.Errorf("EFFECT_PROVIDER_UNAVAILABLE: animation sink is not configured") + } + value := map[string]any{} + for key, item := range request { + value[key] = item + } + if value["command_id"] == nil { + value["command_id"] = id + } + leaf := "__animation." + stringField(request, "animation_id") + leaf = strings.ReplaceAll(strings.ReplaceAll(leaf, "~", "~0"), "/", "~1") + return sink(slot, []map[string]any{{"op": "add", "path": "/defaults/" + leaf, "value": value}}) +} + +func (h *Host) dispatchAnimation(slot Slot, instance *blueruntime.InstanceHandle, variables map[string]any) { + bag, _ := variables[animationBag].(map[string]any) + ids := make([]string, 0, len(bag)) + for id := range bag { + ids = append(ids, id) + } + sort.Strings(ids) + for _, id := range ids { + record, _ := bag[id].(map[string]any) + digest, err := canonical.Digest(record) + if err != nil { + continue + } + h.mu.Lock() + e := h.slots[slot] + if e == nil || e.instance != instance || e.animationSeen[id] == digest { + h.mu.Unlock() + continue + } + h.mu.Unlock() + request := map[string]any{"command_id": digest} + for _, field := range []string{"config", "inputs"} { + values, _ := record[field].(map[string]any) + for key, value := range values { + request[key] = value + } + } + if err := h.publishAnimation(slot, id, request); err != nil { + h.logger.Error("Blue animation delivery failed", "node", id, "error", err) + continue + } + h.mu.Lock() + if h.slots[slot] == e { + if e.animationSeen == nil { + e.animationSeen = map[string]string{} + } + e.animationSeen[id] = digest + } + h.mu.Unlock() + } +} diff --git a/internal/bluehost/effect_http.go b/internal/bluehost/effect_http.go index 9a04a9cd..541fc40f 100644 --- a/internal/bluehost/effect_http.go +++ b/internal/bluehost/effect_http.go @@ -1,19 +1,7 @@ -// effect_http.go wires `core.effect.invoke@1` invocations whose capability -// is `core.http.request` (StepResult.Invocations, Blue PR #313 — the -// blue.effect.invocation.v1 / blue.effect.completion.v1 async protocol, -// runtime/go effects.go/runtime.go) to a real outbound HTTP call, and -// reports the outcome back to the portable runtime via Runtime.Complete. -// -// Any other capability is left pending — this adapter only owns -// core.http.request. A core.http.request invocation that cannot be dispatched -// because its bundle is incomplete is completed through the same protocol -// with EFFECT_PROVIDER_UNAVAILABLE; db.query@1/source.read@1 are explicitly -// out of scope for this pass (Orion #336). -// -// MODE GATE (ORION-PREVIEW-EFFECT-GATE): dispatchInvocations only dials for -// Execute-mode slots (the antenna). The direct Engine-B effect handlers own -// the read-only preview data path; this generic async admission surface stays -// silent in preview. +// Generic Blue effects share the same configured adapters as direct opcodes. +// HTTP uses the worker pool; local/data/scene adapters complete through Blue's +// invocation protocol. Unsupported invocations receive an explicit failure. +// The portable runtime synthesizes noop HTTP completion in Preview. package bluehost import ( @@ -45,6 +33,7 @@ func (h *Host) SetHTTPEffects(deps EffectDeps, logger *slog.Logger) { defer h.mu.Unlock() h.httpEgress = deps.Egress h.httpRunner = deps.Runner + h.effectDeps = deps if logger != nil { h.logger = logger } @@ -63,7 +52,16 @@ func (h *Host) dispatchInvocations(slot Slot, instance *blueruntime.InstanceHand if len(invocations) == 0 { return } - if modeFor(slot) != blueruntime.Execute { + httpInvocations := make([]map[string]any, 0, len(invocations)) + for _, invocation := range invocations { + if stringField(invocation, "capability") == httpEffectCapability { + httpInvocations = append(httpInvocations, invocation) + continue + } + h.completeHTTPEffect(slot, instance, invocation, h.runLocalInvocation(slot, invocation)) + } + invocations = httpInvocations + if modeFor(slot) != blueruntime.Execute || len(invocations) == 0 { return } h.mu.Lock() @@ -108,6 +106,15 @@ func (h *Host) dispatchInvocations(slot Slot, instance *blueruntime.InstanceHand // been Released/Take-superseded while the HTTP call was in flight (a stale // completion for a no-longer-current instance is dropped, not delivered). func (h *Host) completeHTTPEffect(slot Slot, instance *blueruntime.InstanceHandle, inv map[string]any, res effects.Result) { + // Report adapter execution independently of how the authored graph handles + // the completion. No request, result payload or business verdict is logged. + status := "succeeded" + if res.Err != "" { + status = "failed" + } + h.logger.Info("blue effect execution finished", "slot", slot, + "invocation_id", inv["invocation_id"], "capability", inv["capability"], + "operation", inv["operation"], "status", status, "error", res.Err) completion, err := buildHTTPCompletion(inv, res) if err != nil { h.logger.Error("bluehost: failed to build effect completion", "invocation_id", inv["invocation_id"], "err", err) diff --git a/internal/bluehost/effect_local.go b/internal/bluehost/effect_local.go new file mode 100644 index 00000000..bd65670a --- /dev/null +++ b/internal/bluehost/effect_local.go @@ -0,0 +1,109 @@ +package bluehost + +import ( + "context" + "encoding/json" + "fmt" + + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "github.com/ZabLaboratory/Orion/internal/effects" +) + +// runLocalInvocation implements the same local effectors for generic +// core.effect.invoke as for the dedicated show.emit/overlay-app.set opcodes. +// Preview receives a completion without mutating the Program control plane. +func (h *Host) runLocalInvocation(slot Slot, invocation map[string]any) effects.Result { + capability, operation := stringField(invocation, "capability"), stringField(invocation, "operation") + request, ok := invocation["request"].(map[string]any) + if !ok { + return effects.Result{Err: "EFFECT_REQUEST_INVALID: request must be an object"} + } + h.mu.Lock() + sink, mirror, mutate, deps := h.showEmitSink, h.overlayMirror, h.sceneMutationSink, h.effectDeps + h.mu.Unlock() + switch { + case capability == "core.db.query" && operation == "query", capability == "core.service.call" && operation == "call": + config, _ := request["config"].(map[string]any) + inputs, _ := request["inputs"].(map[string]any) + if inputs == nil { + inputs = request + } + opcode := capability + "@1" + mode := blueruntime.Execute + if slot != SlotOnAir { + mode = blueruntime.Preview + } + value, err := NewEffectHandlers(deps, mode)[opcode](config, inputs) + if err != nil { + return effects.Result{Err: err.Error()} + } + raw, err := json.Marshal(value) + if err != nil { + return effects.Result{Err: err.Error()} + } + return effects.Result{Value: raw} + case capability == "zabcam.slots" && (operation == "assign" || operation == "release"): + if slot != SlotOnAir { + return effects.Result{Err: "PREVIEW_WRITE_FORBIDDEN"} + } + var err error + if operation == "assign" { + err = deps.AssignCameraSlot(context.Background(), stringField(request, "slot_ref"), stringField(request, "peer_label")) + } else { + err = deps.ReleaseCameraSlot(context.Background(), stringField(request, "slot_ref")) + } + if err != nil { + return effects.Result{Err: err.Error()} + } + case capability == "core.lsml" && operation == "mutate": + if mutate == nil { + return effects.Result{Err: "EFFECT_PROVIDER_UNAVAILABLE: scene mutation sink is not configured"} + } + raw, err := json.Marshal(request["operations"]) + var operations []map[string]any + if err != nil || json.Unmarshal(raw, &operations) != nil || len(operations) == 0 { + return effects.Result{Err: "EFFECT_REQUEST_INVALID: operations are required"} + } + if err := mutate(slot, operations); err != nil { + return effects.Result{Err: err.Error()} + } + case capability == "core.animation" && operation == "play": + if err := h.publishAnimation(slot, stringField(invocation, "invocation_id"), request); err != nil { + return effects.Result{Err: err.Error()} + } + case capability == "core.show.emit" && operation == "emit": + topic := stringField(request, "topic") + if topic == "" { + return effects.Result{Err: "EFFECT_REQUEST_INVALID: topic is required"} + } + if slot == SlotOnAir { + if sink == nil { + return effects.Result{Err: "EFFECT_PROVIDER_UNAVAILABLE: show event sink is not configured"} + } + sink(topic, request["payload"]) + } + case capability == "core.overlay-app" && operation == "set": + appID, running, onAir, valid := overlayAppSetRecordFields(map[string]any{"inputs": request}) + if !valid { + return effects.Result{Err: "EFFECT_REQUEST_INVALID: app_id and a boolean running/on_air are required"} + } + if slot == SlotOnAir { + if mirror == nil { + return effects.Result{Err: "EFFECT_PROVIDER_UNAVAILABLE: overlay mirror is not configured"} + } + mirror.EmitOverlayApp(appID, running, onAir) + if status, ok := mirror.(interface{ Error() error }); ok { + if err := status.Error(); err != nil { + return effects.Result{Err: err.Error()} + } + } + } + default: + return effects.Result{Err: fmt.Sprintf("EFFECT_PROVIDER_UNAVAILABLE: unsupported capability/operation %s/%s", capability, operation)} + } + value, err := json.Marshal(map[string]any{"ok": true, "emulated": slot != SlotOnAir}) + if err != nil { + return effects.Result{Err: "EFFECT_RESPONSE_INVALID"} + } + return effects.Result{Value: value} +} diff --git a/internal/bluehost/effect_overlay.go b/internal/bluehost/effect_overlay.go index 669bd9c4..a9472e09 100644 --- a/internal/bluehost/effect_overlay.go +++ b/internal/bluehost/effect_overlay.go @@ -1,28 +1,17 @@ -// effect_overlay.go wires `core.overlay-app.set@1` to the real stream-level -// overlay-app wire effector (internal/lsdp.Wire.EmitOverlayApp) — the ENGINE- -// B-PARITY-ORION host mirror walker.go's fireLocalSideEffect defers to this -// package for. Its doc comment is explicit: "This portable core has no host -// mirror/effector to write into ... the write lands in a reserved namespaced -// ctx.variables bag instead". Unlike the 4 opcodes of full right (effects.go, -// NewEffectHandlers), the portable core NEVER calls back into a host-injected -// StartOptions.EffectHandlers entry for this opcode — walker.go's dispatch -// (`case "core.animation.play@1", "core.show.emit@1", "core.overlay-app.set@1": -// return w.fireLocalSideEffect(...)`) is unconditional, so an EffectHandlers -// map entry keyed "core.overlay-app.set@1" would simply never be called. The -// only surfaced signal is the reserved bag riding StepResult.Variables -// (runtime.go); dispatchOverlayAppSet reads it after every -// Step/Tick/Call/WritePlatformEvent/Resolve. -// -// `core.animation.play@1` and `core.show.emit@1` share the exact same bag -// mechanism but are deliberately OUT of scope here: no production stream-rule -// consumes them through Engine B yet, and wiring an effector nobody calls -// would be unverifiable dead code (ORION-OVERLAY-EFFECTOR-STREAM-RULE-PROOF). +// effect_overlay.go projects the portable runtime's cumulative +// core.overlay-app.set@1 bag after every Step/Tick/Call/event/Resolve. The +// dedicated opcode writes that bag rather than calling an EffectHandler. +// Generic invocations use the same mirror through effect_local.go. Production +// wiring sends both paths to streamcontrol.Controller for durable intent, +// local process ownership and native LSDP publication. Animation and show bags +// have their own effect_animation.go and show_emit.go dispatchers. package bluehost import ( "sort" blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "github.com/ZabLaboratory/Orion/internal/canonical" ) // overlayAppSetBag is the reserved ctx.variables key walker.go's @@ -44,14 +33,9 @@ type OverlayAppMirror interface { EmitOverlayApp(appID string, running, onAir *bool) } -// SetOverlayMirror wires the real stream-level overlay-app wire effector -// core.overlay-app.set@1 forwards to. Normally antenneWire -// (cmd/orion/main.go), the SAME lsdp.Wire Engine A's Show.mirrors drives. -// nil (unset, or the antenne LSDP wire never built — bespoke mode) drops -// every core.overlay-app.set@1 firing: the reserved ctx.variables bag -// walker.go still writes stays the only observable trace, the same -// fail-closed posture SetHTTPEffects' unconfigured egress/runner already -// applies. +// SetOverlayMirror installs the controller shared with legacy Show and global +// stream rules. An unset mirror leaves the dedicated opcode's bag observable +// but produces no host action; generic invocation reports it as unavailable. func (h *Host) SetOverlayMirror(m OverlayAppMirror) { h.mu.Lock() defer h.mu.Unlock() @@ -72,15 +56,13 @@ func (h *Host) SetOverlayMirror(m OverlayAppMirror) { // cumulative across the instance's whole lifetime, not a per-step delta // (runtime.go's `Variables: cloneMap(instance.variables)` on every // Step/Tick/Call/WritePlatformEvent/Resolve) — so every previously-fired -// node's record reappears on every subsequent call. lumencast-go's -// server.Server.SetOverlayApps has no dedup of its own (it unconditionally -// fans out the full show-level overlay_apps snapshot to every live -// subscriber on every call), so re-dispatching an unchanged record here would -// re-broadcast forever on every Tick. entry.overlaySeen (host.go, one map per +// node's record reappears on every subsequent call. Re-dispatching an unchanged +// record would repeat persistence/process reconciliation on every Tick. +// entry.overlaySeen (host.go, one map per // Host slot ENTRY — replaced wholesale on Prepare/Take, never explicitly // invalidated) is the edge-detector: a node id is only (re-)dispatched when // its resolved (app_id, running, on_air) digest changed since the last -// dispatch this same instance produced. +// dispatch this same instance produced, including the firing's causation. // // instance identifies which entry produced variables, so a result racing a // concurrent Take/Release that has already superseded slot's entry is @@ -114,7 +96,12 @@ func (h *Host) dispatchOverlayAppSet(slot Slot, instance *blueruntime.InstanceHa if !ok { continue } - digest := overlayAppSetDigest(appID, running, onAir) + // The same value is a new command when fired by a different call or + // event. Value-only dedup breaks ON/OFF/ON across two authored nodes. + digest, err := canonical.Digest(record) + if err != nil { + continue + } h.mu.Lock() e, live := h.slots[slot] @@ -189,21 +176,3 @@ func boolPtrField(m map[string]any, key string) *bool { } return &v } - -// overlayAppSetDigest encodes (appID, running, onAir) into a short -// comparable string: "?" per dimension = unset (untouched), "T"/"F" = the -// resolved value. Cheap deliberately — this runs once per overlay-app.set -// node per Step/Tick, not a hot allocation-sensitive path. -func overlayAppSetDigest(appID string, running, onAir *bool) string { - return appID + "|" + boolPtrDigest(running) + boolPtrDigest(onAir) -} - -func boolPtrDigest(v *bool) string { - if v == nil { - return "?" - } - if *v { - return "T" - } - return "F" -} diff --git a/internal/bluehost/effects.go b/internal/bluehost/effects.go index e081df70..394eace8 100644 --- a/internal/bluehost/effects.go +++ b/internal/bluehost/effects.go @@ -50,8 +50,8 @@ type EffectDeps struct { // StepResult.Variables. Host.SetOverlayMirror (not this struct) is // what actually wires a Host to read it; this field only carries the // dependency from cmd/orion/main.go through to that call. Normally - // antenneWire (*lsdp.Wire — it implements EmitOverlayApp directly, the - // SAME show-level wire Engine A's Show.mirrors drives). nil = every + // the Orion stream controller persists desired intent, owns configured + // local processes and forwards native overlay control. nil = every // core.overlay-app.set@1 firing is dropped (bag write still happens), // same unwired-seam-still-fires-then posture as every other field here. OverlayMirror OverlayAppMirror @@ -164,12 +164,14 @@ func NewEffectHandlers(deps EffectDeps, mode blueruntime.Mode) map[string]blueru // Preview must use the same data path as on-air so Engine B can produce // the real match-driven LSML delta instead of acknowledging a no-op // against an invented empty result set. + started := time.Now() result, err := doDBQuery(context.Background(), deps.DB, deps.DataSources, config, inputs) if deps.Logger != nil { if err != nil { deps.Logger.Error("engine b db query failed", "datasource", strOf(config["datasource"]), "err", err) } else { - deps.Logger.Info("engine b db query completed", "datasource", strOf(config["datasource"]), "count", result["count"], "rows_type", fmt.Sprintf("%T", result["rows"])) + deps.Logger.Info("engine b db query completed", "datasource", strOf(config["datasource"]), "count", result["count"], "rows_type", fmt.Sprintf("%T", result["rows"]), + "transport_ms", float64(time.Since(started).Microseconds())/1000) } } return result, err diff --git a/internal/bluehost/event_router.go b/internal/bluehost/event_router.go new file mode 100644 index 00000000..9b5b5fd6 --- /dev/null +++ b/internal/bluehost/event_router.go @@ -0,0 +1,50 @@ +package bluehost + +import "sync" + +// NewShowEventRouter drains reentrant scene emissions without recursive calls. +// One cascade is bounded; exceeding it reports an error rather than wedging Orion. +func NewShowEventRouter(deliver ShowEmitSink, onOverflow func()) ShowEmitSink { + type event struct { + topic string + payload any + } + var mu sync.Mutex + var queue []event + draining := false + return func(topic string, payload any) { + mu.Lock() + if len(queue) >= 1024 { + mu.Unlock() + if onOverflow != nil { + onOverflow() + } + return + } + queue = append(queue, event{topic, payload}) + if draining { + mu.Unlock() + return + } + draining = true + for count := 0; len(queue) > 0; count++ { + if count >= 1024 { + queue = nil + draining = false + mu.Unlock() + if onOverflow != nil { + onOverflow() + } + return + } + next := queue[0] + queue = queue[1:] + mu.Unlock() + deliver(next.topic, next.payload) + mu.Lock() + } + queue = nil + draining = false + mu.Unlock() + } +} diff --git a/internal/bluehost/host.go b/internal/bluehost/host.go index 777bcbde..a9d53a5b 100644 --- a/internal/bluehost/host.go +++ b/internal/bluehost/host.go @@ -17,6 +17,7 @@ import ( "fmt" "log/slog" "sync" + "time" blueruntime "github.com/ZabLaboratory/Blue/runtime/go" "github.com/ZabLaboratory/Orion/internal/effects" @@ -40,7 +41,7 @@ var ( const maxCachedProgramHandles = 64 -var blueWireSideEffectVariableProjection = [...]string{showEmitBag, overlayAppSetBag} +var blueWireSideEffectVariableProjection = [...]string{showEmitBag, overlayAppSetBag, animationBag} // entry pairs a running instance with the program handle it was started // from, so Step/Stop never need the caller to keep the handle around. @@ -64,6 +65,7 @@ type entry struct { digest string // scene_digest this slot is serving (for a no-program ref: the bundle hash, #398 Decision A); see Serving artifactSetDigest string // attested artifact_set_digest associated with this slot admission bundle []byte // optional LSML render-bundle bytes for this slot, set via SetBundle + operatorInputs []byte // source LSML interface; non-nil, including [], overrides legacy bundle awaitTypes map[string]string // compiler-declared operator.await value types // overlaySeen dedupes core.overlay-app.set@1 dispatch (effect_overlay.go) @@ -73,7 +75,8 @@ type entry struct { // fresh instance from Prepare/Take starts with a clean slate for free — // the old entry, and its stale seen-set, is simply discarded, never // explicitly invalidated. - overlaySeen map[string]string + overlaySeen map[string]string + animationSeen map[string]string // showEmitOrigin and showEmitSequence scope topic-event ordering to the // current slot generation. showEmitSeen deduplicates the cumulative Blue @@ -81,7 +84,7 @@ type entry struct { // dispatches. showEmitOrigin string showEmitSequence uint64 - showEmitSeen map[string]struct{} + showEmitSeen map[string]string triggers []TriggerDecl // declared core.operator.on-call@1 entrypoints (operator rail, #335) awaits []AwaitDecl // declared core.operator.await-value@1 suspend points (operator rail, #335) @@ -95,7 +98,11 @@ type entry struct { // Release first, keeping "no on-air effect before commit" structurally // true: there is never a moment with two live on-air instances. type Host struct { - mu sync.Mutex + mu sync.Mutex + sceneCommits map[Slot]chan struct{} + transitions map[Slot]bool + programAdmissionEpoch uint64 + programSuspended bool // runtimeMu serializes calls into Blue's stateful InstanceHandle. It is // deliberately separate from mu: direct EffectHandlers may perform I/O, @@ -117,7 +124,7 @@ type Host struct { // Invocations + Runtime.Complete) to a real outbound HTTP executor for // `core.http.request` invocations — see effect_http.go. Both nil by // default: HTTP invocations receive an explicit provider-unavailable - // completion, while unsupported capabilities remain pending. Set once via + // completion, and unsupported capabilities fail explicitly. Set once via // SetHTTPEffects. httpEgress *effects.EgressPolicy httpRunner *effects.Runner @@ -133,7 +140,9 @@ type Host struct { // showEmitSink is the Engine-B host seam for core.show.emit@1. Blue's // portable runtime records local side effects in StepResult.Variables; // Orion projects that record into the active scene-intent slot. - showEmitSink ShowEmitSink + showEmitSink ShowEmitSink + effectDeps EffectDeps + sceneMutationSink SceneMutationSink } // NewHost builds an empty Host. One Host per Orion process — it is the @@ -141,6 +150,7 @@ type Host struct { // grants Orion. func NewHost() *Host { return &Host{ + sceneCommits: map[Slot]chan struct{}{SlotPreview: make(chan struct{}, 1), SlotOnAir: make(chan struct{}, 1)}, runtime: blueruntime.NewRuntime(), slots: map[Slot]*entry{}, programHandles: map[string]blueruntime.ProgramHandle{}, @@ -481,6 +491,10 @@ func (h *Host) StepProjected(slot Slot) (blueruntime.StepResult, error) { func (h *Host) step(slot Slot, projected bool) (blueruntime.StepResult, error) { h.mu.Lock() + if h.transitions[slot] { + h.mu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } e, ok := h.slots[slot] if !ok || e.instance == nil { // nil instance: static occupation (#398), nothing to step h.mu.Unlock() @@ -490,6 +504,10 @@ func (h *Host) step(slot Slot, projected bool) (blueruntime.StepResult, error) { h.mu.Unlock() h.runtimeMu.Lock() + if h.executionBlocked(slot, instance) { + h.runtimeMu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } var result blueruntime.StepResult var err error if projected { @@ -505,6 +523,7 @@ func (h *Host) step(slot Slot, projected bool) (blueruntime.StepResult, error) { h.dispatchInvocations(slot, instance, result.Invocations) h.dispatchShowEmit(slot, instance, result.Variables) h.dispatchOverlayAppSet(slot, instance, result.Variables) + h.dispatchAnimation(slot, instance, result.Variables) return result, nil } @@ -604,6 +623,10 @@ func (h *Host) TickProjected(slot Slot, deltaSeconds float64) (blueruntime.StepR func (h *Host) tick(slot Slot, deltaSeconds float64, projected bool) (blueruntime.StepResult, error) { h.mu.Lock() + if h.transitions[slot] { + h.mu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } e, ok := h.slots[slot] if !ok || e.instance == nil { // nil instance: static occupation (#398), nothing to step h.mu.Unlock() @@ -613,6 +636,10 @@ func (h *Host) tick(slot Slot, deltaSeconds float64, projected bool) (blueruntim h.mu.Unlock() h.runtimeMu.Lock() + if h.executionBlocked(slot, instance) { + h.runtimeMu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } var result blueruntime.StepResult var err error if projected { @@ -628,6 +655,7 @@ func (h *Host) tick(slot Slot, deltaSeconds float64, projected bool) (blueruntim h.dispatchInvocations(slot, instance, result.Invocations) h.dispatchShowEmit(slot, instance, result.Variables) h.dispatchOverlayAppSet(slot, instance, result.Variables) + h.dispatchAnimation(slot, instance, result.Variables) return result, nil } @@ -638,6 +666,10 @@ func (h *Host) tick(slot Slot, deltaSeconds float64, projected bool) (blueruntim // returns ErrNotLoaded, never a silent no-op. func (h *Host) Call(slot Slot, callID string, payload any) (blueruntime.StepResult, error) { h.mu.Lock() + if h.transitions[slot] { + h.mu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } e, ok := h.slots[slot] if !ok || e.instance == nil { // nil instance: static occupation (#398), nothing to step h.mu.Unlock() @@ -646,19 +678,29 @@ func (h *Host) Call(slot Slot, callID string, payload any) (blueruntime.StepResu instance := e.instance h.mu.Unlock() + waitStarted := time.Now() h.runtimeMu.Lock() + waitDuration := time.Since(waitStarted) + if h.executionBlocked(slot, instance) { + h.runtimeMu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } + executionStarted := time.Now() result, err := h.runtime.Call(instance, callID, payload) + executionDuration := time.Since(executionStarted) h.runtimeMu.Unlock() if err != nil { return result, err } result = normalizeRuntimeOutputs(result) if h.logger != nil { - h.logger.Info("blue runtime operator call completed", "slot", slot, "call_id", callID, "status", result.Status, "output_count", len(result.Outputs)) + h.logger.Info("blue runtime operator call completed", "slot", slot, "call_id", callID, "status", result.Status, "output_count", len(result.Outputs), + "runtime_wait_ms", float64(waitDuration.Microseconds())/1000, "runtime_ms", float64(executionDuration.Microseconds())/1000) } h.dispatchInvocations(slot, instance, result.Invocations) h.dispatchShowEmit(slot, instance, result.Variables) h.dispatchOverlayAppSet(slot, instance, result.Variables) + h.dispatchAnimation(slot, instance, result.Variables) return result, nil } @@ -681,6 +723,10 @@ func (h *Host) WritePlatformEventProjected(slot Slot, leaf string, payload any) func (h *Host) writePlatformEvent(slot Slot, leaf string, payload any, projected bool) (blueruntime.StepResult, error) { h.mu.Lock() + if h.transitions[slot] { + h.mu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } e, ok := h.slots[slot] if !ok || e.instance == nil { // nil instance: static occupation (#398), nothing to step h.mu.Unlock() @@ -690,6 +736,10 @@ func (h *Host) writePlatformEvent(slot Slot, leaf string, payload any, projected h.mu.Unlock() h.runtimeMu.Lock() + if h.executionBlocked(slot, instance) { + h.runtimeMu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } var result blueruntime.StepResult var err error if projected { @@ -705,6 +755,7 @@ func (h *Host) writePlatformEvent(slot Slot, leaf string, payload any, projected h.dispatchInvocations(slot, instance, result.Invocations) h.dispatchShowEmit(slot, instance, result.Variables) h.dispatchOverlayAppSet(slot, instance, result.Variables) + h.dispatchAnimation(slot, instance, result.Variables) return result, nil } @@ -713,6 +764,10 @@ func (h *Host) writePlatformEvent(slot Slot, leaf string, payload any, projected // `POST /operator/resolve/{await_name}` (Blue ADR 008 §3.3). func (h *Host) Resolve(slot Slot, awaitName string, value any) (blueruntime.StepResult, error) { h.mu.Lock() + if h.transitions[slot] { + h.mu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } e, ok := h.slots[slot] if !ok || e.instance == nil { // nil instance: static occupation (#398), nothing to step h.mu.Unlock() @@ -736,6 +791,10 @@ func (h *Host) Resolve(slot Slot, awaitName string, value any) (blueruntime.Step } h.runtimeMu.Lock() + if h.executionBlocked(slot, instance) { + h.runtimeMu.Unlock() + return blueruntime.StepResult{}, ErrSceneChanging + } result, err := h.runtime.Resolve(instance, awaitName, value) h.runtimeMu.Unlock() if err != nil { @@ -745,6 +804,7 @@ func (h *Host) Resolve(slot Slot, awaitName string, value any) (blueruntime.Step h.dispatchInvocations(slot, instance, result.Invocations) h.dispatchShowEmit(slot, instance, result.Variables) h.dispatchOverlayAppSet(slot, instance, result.Variables) + h.dispatchAnimation(slot, instance, result.Variables) return result, nil } diff --git a/internal/bluehost/marker_process_test.go b/internal/bluehost/marker_process_test.go new file mode 100644 index 00000000..68e7c48d --- /dev/null +++ b/internal/bluehost/marker_process_test.go @@ -0,0 +1,113 @@ +package bluehost + +import ( + "context" + "encoding/json" + "image/png" + "log/slog" + "os" + "path/filepath" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/lsdpreception" + "github.com/ZabLaboratory/Orion/internal/streamcontrol" +) + +func TestRealMarkerRuleLaunchAndLSMLIntent(t *testing.T) { + executable, address, capture := os.Getenv("ORION_TEST_MARKER_EXE"), os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), os.Getenv("ORION_TEST_MARKER_CAPTURE") + if executable == "" || address == "" || capture == "" { + t.Skip("requires actual Marker executable, native receiver and explicit capture path") + } + // Marker owns its real Electron window/capture implementation. No image fixture. + t.Setenv("MARKER_SMOKE", "1") + t.Setenv("MARKER_SMOKE_OUT", capture) + t.Setenv("MARKER_DEMO_CAPTURE", "1") + root := os.Getenv("ORION_TEST_MARKER_ROOT") + raw, _ := json.Marshal(map[string]streamcontrol.Command{markerAppID: {Executable: executable, Args: []string{root}, Directory: root}}) + directory := t.TempDir() + manifest := filepath.Join(directory, "apps.json") + if err := os.WriteFile(manifest, raw, 0600); err != nil { + t.Fatal(err) + } + store, err := streamcontrol.Open(filepath.Join(directory, "control.lsml")) + if err != nil { + t.Fatal(err) + } + apps, err := streamcontrol.NewApps(manifest) + if err != nil { + t.Fatal(err) + } + defer apps.Close() + ctx, cancel := context.WithTimeout(context.Background(), 25*time.Second) + defer cancel() + reception, err := lsdpreception.New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + producer := lsdpreception.NewProducer(ctx, reception) + defer producer.Close() + hub := lsdpreception.NewHub(producer, slog.Default()) + control := streamcontrol.NewController(store, apps, hub.Lane("program")) + plane := NewRulePlane(nil, nil, EffectDeps{OverlayMirror: control}, 60, nil) + defer plane.Stop() + plane.SetStore(store) + program := markerOverlayProgram(t) + if err := plane.Promote("marker-rule", "marker-native-proof", program); err != nil { + t.Fatal(err) + } + activated := time.Now() + if _, err := plane.Call("marker-rule", "marker_overlay_on", nil); err != nil { + t.Fatal(err) + } + if err := control.Error(); err != nil { + t.Fatal(err) + } + if err := producer.Flush(ctx); err != nil { + t.Fatal(err) + } + status := control.Status()[markerAppID] + if !status.Running || status.PID == 0 || !store.Snapshot().Apps[markerAppID].Running { + t.Fatalf("enabled intent without process: %+v", status) + } + deadline := time.Now().Add(15 * time.Second) + for { + if info, err := os.Stat(capture); err == nil && info.Size() > 1000 && !info.ModTime().Before(activated) { + break + } + if time.Now().After(deadline) { + t.Fatal("real Marker capture missing") + } + time.Sleep(100 * time.Millisecond) + } + file, err := os.Open(capture) + if err != nil { + t.Fatal(err) + } + image, err := png.Decode(file) + file.Close() + if err != nil { + t.Fatal(err) + } + if image.Bounds().Dx() < 400 || image.Bounds().Dy() < 200 { + t.Fatal("Marker surface incomplete") + } + if _, err := plane.Call("marker-rule", "marker_overlay_off", nil); err != nil { + t.Fatal(err) + } + if err := producer.Flush(ctx); err != nil { + t.Fatal(err) + } + if control.Status()[markerAppID].Running || store.Snapshot().Apps[markerAppID].Running { + t.Fatal("Marker OFF left process/intent on") + } + // Reopening Orion's LSML restores the same rule without an upstream compile. + restored, err := streamcontrol.Open(filepath.Join(directory, "control.lsml")) + if err != nil { + t.Fatal(err) + } + if len(restored.Snapshot().Rules) != 1 || restored.Snapshot().Apps[markerAppID].Running { + t.Fatal("restart intent differs") + } + t.Logf("REAL_MARKER_PROOF pid=%d capture=%s pixels=%dx%d native_ack=true persistent_rule=true off=true", status.PID, capture, image.Bounds().Dx(), image.Bounds().Dy()) +} diff --git a/internal/bluehost/program_release_test.go b/internal/bluehost/program_release_test.go new file mode 100644 index 00000000..c48308bb --- /dev/null +++ b/internal/bluehost/program_release_test.go @@ -0,0 +1,31 @@ +package bluehost + +import "testing" + +func TestProgramAdmissionReleaseFenceAndNextPhysicalStart(t *testing.T) { + h := NewHost() + old, allowed := h.ProgramAdmissionToken() + if !allowed { + t.Fatal("initial compatibility admission refused") + } + h.SuspendProgramAdmissions() + if h.ProgramAdmissionValid(old) { + t.Fatal("in-flight admission survived release") + } + if _, allowed = h.ProgramAdmissionToken(); allowed { + t.Fatal("released Program admits scenes") + } + if err := h.PreparePreviewStatic("preview", "version"); err != nil { + t.Fatal(err) + } + if err := h.SwapAuthority(); err != nil { + t.Fatal(err) + } + current, allowed := h.ProgramAdmissionToken() + if !allowed || !h.ProgramAdmissionValid(current) || h.ProgramAdmissionValid(old) || !h.Serving(SlotOnAir, "preview", "version") { + t.Fatal("physical start did not transfer the existing Preview") + } + if h.Digest(SlotPreview) != "" { + t.Fatal("empty outgoing Program became an active Preview") + } +} diff --git a/internal/bluehost/replacement.go b/internal/bluehost/replacement.go new file mode 100644 index 00000000..96e6607c --- /dev/null +++ b/internal/bluehost/replacement.go @@ -0,0 +1,109 @@ +package bluehost + +import ( + "errors" + "fmt" + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" +) + +var ErrSceneChanging = errors.New("bluehost: scene transition in progress") + +// Replacement retains the exact previous instance, including await/clock state. +// Preparing never steps the candidate and never replays the previous on-start. +type Replacement struct { + host *Host + slot Slot + previous, next *entry + committed, closed bool +} + +func (h *Host) StageReplacement(slot Slot, instanceID, sceneID, digest string, program []byte, + providers []map[string]any, policy blueruntime.CapabilityPolicy, handlers map[string]blueruntime.EffectFunc) (*Replacement, error) { + h.runtimeMu.Lock() + defer h.runtimeMu.Unlock() + h.mu.Lock() + defer h.mu.Unlock() + if h.transitions == nil { + h.transitions = map[Slot]bool{} + } + if h.transitions[slot] { + return nil, ErrSceneChanging + } + candidate := &entry{sceneID: sceneID, digest: digest} + if len(program) > 0 { + handle, err := h.loadProgram(program) + if err != nil { + return nil, err + } + mode := blueruntime.Preview + if slot == SlotOnAir { + mode = blueruntime.Execute + } + instance, err := h.runtime.Start(handle, blueruntime.StartOptions{InstanceID: instanceID, Mode: mode, Providers: providers, Policy: policy, EffectHandlers: handlers}) + if err != nil { + return nil, err + } + metadata := h.metadataForProgram(program) + candidate.instance = instance + candidate.showEmitOrigin = showEmitOrigin(instanceID, slot) + candidate.awaitTypes = metadata.awaitTypes + candidate.triggers = metadata.triggers + candidate.awaits = metadata.awaits + } + h.transitions[slot] = true + return &Replacement{host: h, slot: slot, previous: h.slots[slot], next: candidate}, nil +} +func (r *Replacement) Commit() error { + h := r.host + h.mu.Lock() + defer h.mu.Unlock() + if r.closed || r.committed || h.slots[r.slot] != r.previous { + return fmt.Errorf("bluehost: stale replacement") + } + h.slots[r.slot] = r.next + r.committed = true + return nil +} +func (r *Replacement) Rollback() error { return r.finish(false) } +func (r *Replacement) Finalize() error { return r.finish(true) } +func (r *Replacement) finish(commit bool) error { + h := r.host + h.runtimeMu.Lock() + defer h.runtimeMu.Unlock() + h.mu.Lock() + if r.closed { + h.mu.Unlock() + return nil + } + if commit && !r.committed { + h.mu.Unlock() + return errors.New("bluehost: replacement not committed") + } + if r.committed && h.slots[r.slot] != r.next { + h.mu.Unlock() + return errors.New("bluehost: replacement superseded") + } + stopped := r.previous + if !commit { + stopped = r.next + if r.previous == nil { + delete(h.slots, r.slot) + } else { + h.slots[r.slot] = r.previous + } + } + delete(h.transitions, r.slot) + r.closed = true + h.mu.Unlock() + if stopped != nil && stopped.instance != nil { + return h.runtime.Stop(stopped.instance, "scene-transition") + } + return nil +} + +func (h *Host) executionBlocked(slot Slot, instance *blueruntime.InstanceHandle) bool { + h.mu.Lock() + defer h.mu.Unlock() + e := h.slots[slot] + return h.transitions[slot] || e == nil || e.instance != instance +} diff --git a/internal/bluehost/replacement_test.go b/internal/bluehost/replacement_test.go new file mode 100644 index 00000000..f2ce3798 --- /dev/null +++ b/internal/bluehost/replacement_test.go @@ -0,0 +1,87 @@ +package bluehost + +import ( + "errors" + "testing" +) + +func TestReplacementRetainsExactInstanceAndBlocksNewExecutions(t *testing.T) { + h := NewHost() + program := fixture(t) + if err := h.Take("old", "scene-old", "old-digest", program, nil, nil, nil); err != nil { + t.Fatal(err) + } + if err := h.PreparePreview("preview", "preview", "preview-digest", program, nil, nil, nil); err != nil { + t.Fatal(err) + } + if _, err := h.Step(SlotOnAir); err != nil { + t.Fatal(err) + } + previous := h.slots[SlotOnAir] + replacement, err := h.StageReplacement(SlotOnAir, "new", "scene-new", "new-digest", program, nil, nil, nil) + if err != nil { + t.Fatal(err) + } + if h.slots[SlotOnAir] != previous { + t.Fatal("preparation replaced the active instance") + } + if _, err = h.Step(SlotOnAir); !errors.Is(err, ErrSceneChanging) { + t.Fatalf("staged candidate stepped: %v", err) + } + if _, err = h.Call(SlotOnAir, "anything", nil); !errors.Is(err, ErrSceneChanging) { + t.Fatalf("operator raced transition: %v", err) + } + if _, err = h.Step(SlotPreview); err != nil { + t.Fatalf("other lane blocked: %v", err) + } + if err = replacement.Commit(); err != nil { + t.Fatal(err) + } + if err = replacement.Rollback(); err != nil { + t.Fatal(err) + } + if h.slots[SlotOnAir] != previous { + t.Fatal("rollback recreated the old instance") + } + if _, err = h.Step(SlotOnAir); err != nil { + t.Fatalf("retained instance no longer usable: %v", err) + } + if err := h.Release(SlotOnAir, "test"); err != nil { + t.Fatal(err) + } + if err := h.Release(SlotPreview, "test"); err != nil { + t.Fatal(err) + } +} + +func TestReplacementFinalizationAndFailedProgramPreserveLane(t *testing.T) { + h := NewHost() + if err := h.TakeStatic("old", "old-version"); err != nil { + t.Fatal(err) + } + if _, err := h.StageReplacement(SlotOnAir, "bad", "bad", "bad", []byte(`{}`), nil, nil, nil); err == nil { + t.Fatal("invalid program admitted") + } + if !h.Serving(SlotOnAir, "old", "old-version") { + t.Fatal("failed load displaced old slot") + } + replacement, err := h.StageReplacement(SlotOnAir, "new", "new", "version", nil, nil, nil, nil) + if err != nil { + t.Fatal(err) + } + if err = replacement.Finalize(); err == nil { + t.Fatal("uncommitted stage finalized") + } + if err = replacement.Commit(); err != nil { + t.Fatal(err) + } + if err = replacement.Finalize(); err != nil { + t.Fatal(err) + } + if !h.Serving(SlotOnAir, "new", "version") { + t.Fatal("new scene missing") + } + if err = replacement.Rollback(); err != nil { + t.Fatal("closed transaction was not idempotent") + } +} diff --git a/internal/bluehost/rule_plane.go b/internal/bluehost/rule_plane.go index 0fc9d5ab..f47b85aa 100644 --- a/internal/bluehost/rule_plane.go +++ b/internal/bluehost/rule_plane.go @@ -27,6 +27,11 @@ type ruleInstance struct { digest string } +type ruleTarget struct { + id string + host *Host +} + // RulePlane owns the process-local stream-rule runtime. It is deliberately // orthogonal to Host's preview/on-air scene slots: a promoted rule has one // long-lived Engine B instance whose effects apply to the show-level overlay @@ -34,17 +39,19 @@ type ruleInstance struct { // inside each private child Host is only the portable Execute-mode adapter; // it is not a third scene slot and is never exposed through the scene API. // -// The plane has no durable store. Prism owns intent and replays it after an -// Orion restart; Orion owns only reconstructible runtime state and therefore -// remains stateless in the platform sense. +// An optional Orion-owned LSML store preserves published rule programs and +// enabled intent. Engine instances remain reconstructible runtime state. type RulePlane struct { - mu sync.RWMutex - rules map[string]*ruleInstance - providers []map[string]any - policy blueruntime.CapabilityPolicy - effects EffectDeps - logger *slog.Logger - showEmitSink ShowEmitSink + opMu sync.Mutex + store RuleStore + mu sync.RWMutex + rules map[string]*ruleInstance + providers []map[string]any + policy blueruntime.CapabilityPolicy + effects EffectDeps + logger *slog.Logger + showEmitSink ShowEmitSink + sceneMutationSink SceneMutationSink stopOnce sync.Once stop chan struct{} @@ -52,7 +59,14 @@ type RulePlane struct { interval time.Duration } -// NewRulePlane constructs and starts a volatile stream-rule plane. tickHz is +type RuleStore interface { + SetRule(string, string, []byte) error + RemoveRule(string) error +} + +func (p *RulePlane) SetStore(store RuleStore) { p.opMu.Lock(); defer p.opMu.Unlock(); p.store = store } + +// NewRulePlane constructs and starts a stream-rule plane. tickHz is // shared with the scene runtime so on-tick/delay entrypoints advance at the // same cadence. A non-positive value uses the production default of 60 Hz. func NewRulePlane(providers []map[string]any, policy blueruntime.CapabilityPolicy, effects EffectDeps, tickHz int, logger *slog.Logger) *RulePlane { @@ -119,9 +133,12 @@ func (p *RulePlane) Promote(ruleID, digest string, program []byte) error { if ruleID == "" || digest == "" || len(program) == 0 { return errors.New("bluehost: stream rule requires id, digest and program") } + p.opMu.Lock() + defer p.opMu.Unlock() p.mu.RLock() current := p.rules[ruleID] + mutationSink := p.sceneMutationSink if current != nil && current.digest == digest { p.mu.RUnlock() return nil @@ -132,6 +149,7 @@ func (p *RulePlane) Promote(ruleID, digest string, program []byte) error { host.SetHTTPEffects(p.effects, p.logger) host.SetOverlayMirror(p.effects.OverlayMirror) host.SetShowEmitSink(p.emitShowEvent) + host.SetSceneMutationSink(mutationSink) if err := host.Take( "stream-rule:"+ruleID, ruleID, @@ -143,11 +161,18 @@ func (p *RulePlane) Promote(ruleID, digest string, program []byte) error { ); err != nil { return fmt.Errorf("bluehost: promote stream rule %s: %w", ruleID, err) } + if _, err := host.Step(SlotOnAir); err != nil { _ = host.Release(SlotOnAir, "stream-rule-start-failed") return fmt.Errorf("bluehost: start stream rule %s: %w", ruleID, err) } + if p.store != nil { + if err := p.store.SetRule(ruleID, digest, program); err != nil { + _ = host.Release(SlotOnAir, "stream-rule-persist-failed") + return err + } + } p.mu.Lock() current = p.rules[ruleID] if current != nil && current.digest == digest { @@ -168,8 +193,8 @@ func (p *RulePlane) Promote(ruleID, digest string, program []byte) error { // SetShowEmitSink wires the stream rule's core.show.emit@1 output to the // embedding's active scene-intent targets. Existing rules are updated and -// future promotions inherit the same seam. The rule plane remains stateless; -// the caller owns which slots are active and how the event is admitted. +// future promotions inherit the same seam. The caller owns which slots are +// active and how the event is admitted. func (p *RulePlane) SetShowEmitSink(sink ShowEmitSink) { if p == nil { return @@ -203,6 +228,13 @@ func (p *RulePlane) Demote(ruleID string) error { if p == nil { return nil } + p.opMu.Lock() + defer p.opMu.Unlock() + if p.store != nil { + if err := p.store.RemoveRule(ruleID); err != nil { + return err + } + } p.mu.Lock() rule := p.rules[ruleID] delete(p.rules, ruleID) @@ -282,8 +314,8 @@ func (p *RulePlane) Call(ruleID, callID string, payload any) (blueruntime.StepRe return blueruntime.StepResult{}, ErrRuleNotActive } p.mu.RLock() - defer p.mu.RUnlock() rule := p.rules[ruleID] + p.mu.RUnlock() if rule == nil { return blueruntime.StepResult{}, ErrRuleNotActive } @@ -310,14 +342,45 @@ func (p *RulePlane) Resolve(ruleID, awaitName string, value any) (blueruntime.St return blueruntime.StepResult{}, ErrRuleNotActive } p.mu.RLock() - defer p.mu.RUnlock() rule := p.rules[ruleID] + p.mu.RUnlock() if rule == nil { return blueruntime.StepResult{}, ErrRuleNotActive } return rule.host.Resolve(SlotOnAir, awaitName, value) } +// activeRules snapshots the target set in deterministic order. Runtime calls +// can emit back into the plane, so no plane lock may surround those calls. +func (p *RulePlane) activeRules() []ruleTarget { + p.mu.RLock() + defer p.mu.RUnlock() + rules := make([]ruleTarget, 0, len(p.rules)) + for id, rule := range p.rules { + rules = append(rules, ruleTarget{id, rule.host}) + } + sort.Slice(rules, func(i, j int) bool { return rules[i].id < rules[j].id }) + return rules +} + +// EmitEvent admits a show topic independently into each enabled global rule. +// Undeclared topics are irrelevant to a rule, not a fault. Rejected payloads +// and execution errors remain visible and cannot stop other listeners. +func (p *RulePlane) EmitEvent(topic string, payload any) { + if p == nil { + return + } + for _, rule := range p.activeRules() { + if err := rule.host.EmitEvent(SlotOnAir, topic, payload); err != nil { + var runtimeErr *blueruntime.Error + if errors.Is(err, ErrNotLoaded) || (errors.As(err, &runtimeErr) && runtimeErr.Code == "EVENT_TOPIC_UNKNOWN") { + continue + } + p.logger.Warn("stream rule topic event failed", "rule_id", rule.id, "topic", topic, "err", err) + } + } +} + // WritePlatformEvent fans one canonical platform leaf to every global rule. // The plane is independent of scene membership, so a scene flip cannot alter // this target set. Callers retain admission/order ownership. @@ -325,11 +388,9 @@ func (p *RulePlane) WritePlatformEvent(leaf string, payload any) { if p == nil { return } - p.mu.RLock() - defer p.mu.RUnlock() - for id, rule := range p.rules { + for _, rule := range p.activeRules() { if _, err := rule.host.WritePlatformEvent(SlotOnAir, leaf, payload); err != nil { - p.logger.Warn("stream rule platform event failed", "rule_id", id, "err", err) + p.logger.Warn("stream rule platform event failed", "rule_id", rule.id, "err", err) } } } @@ -340,11 +401,20 @@ func (p *RulePlane) TickAll(deltaSeconds float64) { if p == nil { return } - p.mu.RLock() - defer p.mu.RUnlock() - for id, rule := range p.rules { + for _, rule := range p.activeRules() { if _, err := rule.host.Tick(SlotOnAir, deltaSeconds); err != nil && !errors.Is(err, ErrNotLoaded) { - p.logger.Warn("stream rule tick failed", "rule_id", id, "err", err) + p.logger.Warn("stream rule tick failed", "rule_id", rule.id, "err", err) } } } + +func (p *RulePlane) SetSceneMutationSink(sink SceneMutationSink) { + p.opMu.Lock() + defer p.opMu.Unlock() + p.mu.Lock() + defer p.mu.Unlock() + p.sceneMutationSink = sink + for _, rule := range p.rules { + rule.host.SetSceneMutationSink(sink) + } +} diff --git a/internal/bluehost/rule_plane_test.go b/internal/bluehost/rule_plane_test.go index b247cd2a..63257897 100644 --- a/internal/bluehost/rule_plane_test.go +++ b/internal/bluehost/rule_plane_test.go @@ -157,4 +157,15 @@ func TestRulePlane_MarkerOnOffAcrossSceneSlots(t *testing.T) { if len(calls) != 2 || calls[1].appID != markerAppID || calls[1].running == nil || *calls[1].running || calls[1].onAir == nil || *calls[1].onAir { t.Fatalf("Marker OFF mirror calls = %#v", calls) } + if _, err := plane.Call(markerRuleID, "marker_overlay_on", nil); err != nil { + t.Fatalf("marker_overlay_on repeated: %v", err) + } + calls = mirror.snapshot() + if len(calls) != 3 || calls[2].running == nil || !*calls[2].running || calls[2].onAir == nil || !*calls[2].onAir { + t.Fatalf("Marker ON after OFF = %#v", calls) + } + plane.TickAll(1) + if got := len(mirror.snapshot()); got != 3 { + t.Fatalf("idle tick replayed cumulative effects: %d calls", got) + } } diff --git a/internal/bluehost/rule_store_test.go b/internal/bluehost/rule_store_test.go new file mode 100644 index 00000000..726155be --- /dev/null +++ b/internal/bluehost/rule_store_test.go @@ -0,0 +1,58 @@ +package bluehost + +import ( + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/streamcontrol" + "path/filepath" + "testing" +) + +func TestRulePlaneRestoresCachedProgramAndDurablyDemotes(t *testing.T) { + path := filepath.Join(t.TempDir(), "stream-control.lsml") + store, err := streamcontrol.Open(path) + if err != nil { + t.Fatal(err) + } + program := markerOverlayProgram(t) + var identity struct { + ProgramDigest string `json:"program_digest"` + } + if err = json.Unmarshal(program, &identity); err != nil { + t.Fatal(err) + } + first := NewRulePlane(nil, nil, EffectDeps{}, 60, nil) + first.SetStore(store) + if err = first.Promote(markerRuleID, identity.ProgramDigest, program); err != nil { + t.Fatal(err) + } + first.Stop() + restored, err := streamcontrol.Open(path) + if err != nil { + t.Fatal(err) + } + mirror := &lockedOverlayMirror{} + second := NewRulePlane(nil, nil, EffectDeps{OverlayMirror: mirror}, 60, nil) + defer second.Stop() + second.SetStore(restored) + for id, rule := range restored.Snapshot().Rules { + if err = second.Promote(id, rule.Digest, rule.Program); err != nil { + t.Fatal(err) + } + } + if _, err = second.Call(markerRuleID, "marker_overlay_on", nil); err != nil { + t.Fatal(err) + } + if len(mirror.snapshot()) != 1 { + t.Fatal("restored published rule cannot execute") + } + if err = second.Demote(markerRuleID); err != nil { + t.Fatal(err) + } + next, err := streamcontrol.Open(path) + if err != nil { + t.Fatal(err) + } + if len(next.Snapshot().Rules) != 0 { + t.Fatal("demotion lost at restart") + } +} diff --git a/internal/bluehost/rule_topics_test.go b/internal/bluehost/rule_topics_test.go new file mode 100644 index 00000000..d31c8db6 --- /dev/null +++ b/internal/bluehost/rule_topics_test.go @@ -0,0 +1,158 @@ +package bluehost + +import ( + "bytes" + "encoding/json" + "log/slog" + "strings" + "sync" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/canonical" +) + +func topicRuleProgram(t *testing.T, payloadType string, emitter bool) []byte { + t.Helper() + kind, opcode, extra := "topic", "core.event.on-event@1", map[string]any{"topic": "show_changed"} + if emitter { + kind, opcode, extra = "call", "core.operator.on-call@1", nil + } + raw := buildEntrypointProgram(t, kind, opcode, "payload", extra) + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + var document map[string]any + if err := decoder.Decode(&document); err != nil { + t.Fatal(err) + } + document["topics"] = []any{map[string]any{"name": "show_changed", "payload_type": payloadType}} + if emitter { + port := func(name, kind, typ string) map[string]any { + return map[string]any{"name": name, "kind": kind, "type": typ, "required": true} + } + document["opcodes"] = append(document["opcodes"].([]any), map[string]any{ + "id": "core.show.emit@1", "kind": "control", + "config": []any{port("topic", "data", "core.string")}, + "inputs": []any{port("payload", "data", "core.json"), port("in", "exec", "core.exec")}, + "outputs": []any{port("then", "exec", "core.exec")}, + }) + for _, raw := range document["nodes"].([]any) { + node := raw.(map[string]any) + if node["id"] == "mark" { + node["opcode"], node["config"] = "core.show.emit@1", map[string]any{"topic": "show_changed"} + } + } + document["data_edges"].([]any)[0].(map[string]any)["to_port"] = "payload" + sortByID(document["opcodes"].([]any)) + } + delete(document, "program_digest") + digest, err := canonical.Digest(document) + if err != nil { + t.Fatal(err) + } + document["program_digest"] = digest + out, err := json.Marshal(document) + if err != nil { + t.Fatal(err) + } + return out +} + +func promoteTopicRule(t *testing.T, plane *RulePlane, id string, raw []byte) *Host { + t.Helper() + var identity struct { + Digest string `json:"program_digest"` + } + if err := json.Unmarshal(raw, &identity); err != nil { + t.Fatal(err) + } + if err := plane.Promote(id, identity.Digest, raw); err != nil { + t.Fatal(err) + } + return plane.rules[id].host +} + +func topicResult(t *testing.T, host *Host) any { + t.Helper() + result, err := host.Tick(SlotOnAir, 0) + if err != nil { + t.Fatal(err) + } + return result.Outputs["result"] +} + +func TestRulePlane_TopicFanoutIsolatesRejectionsAndDemotion(t *testing.T) { + logs := &topicLogWriter{} + plane := NewRulePlane(nil, nil, EffectDeps{}, 1, slog.New(slog.NewJSONHandler(logs, nil))) + defer plane.Stop() + // Capture errors separately: a wrong payload is reported, an unrelated + // undeclared topic is ignored without weakening runtime admission. + bad := promoteTopicRule(t, plane, "a-string", topicRuleProgram(t, "core.string", false)) + first := promoteTopicRule(t, plane, "b-json", topicRuleProgram(t, "core.json", false)) + second := promoteTopicRule(t, plane, "c-json", topicRuleProgram(t, "core.json", false)) + plane.EmitEvent("show_changed", map[string]any{"league": "LEC"}) + for _, host := range []*Host{first, second} { + if value, ok := topicResult(t, host).(map[string]any); !ok || value["league"] != "LEC" { + t.Fatalf("listener did not execute: %#v", topicResult(t, host)) + } + } + if topicResult(t, bad) != nil || !strings.Contains(logs.String(), "EVENT_PAYLOAD_TYPE_MISMATCH") { + t.Fatalf("invalid listener not isolated/reported: %s", logs.String()) + } + logs.Reset() + plane.EmitEvent("unrelated", nil) + if logs.String() != "" { + t.Fatalf("irrelevant topic logged as fault: %s", logs.String()) + } + if err := plane.Demote("c-json"); err != nil { + t.Fatal(err) + } + plane.EmitEvent("show_changed", "LCK") + if topicResult(t, bad) != "LCK" || topicResult(t, first) != "LCK" { + t.Fatal("rejected event consumed admission sequence") + } + if second.Digest(SlotOnAir) != "" { + t.Fatal("demoted listener still active") + } +} + +func TestRulePlane_CallEmitReentersAndCanDemoteWithoutPlaneLock(t *testing.T) { + plane := NewRulePlane(nil, nil, EffectDeps{}, 1, nil) + defer plane.Stop() + listener := promoteTopicRule(t, plane, "listener", topicRuleProgram(t, "core.json", false)) + promoteTopicRule(t, plane, "emitter", topicRuleProgram(t, "core.json", true)) + var demoteErr error + router := NewShowEventRouter(func(topic string, payload any) { + plane.EmitEvent(topic, payload) + demoteErr = plane.Demote("emitter") + }, func() { t.Error("unexpected cascade overflow") }) + plane.SetShowEmitSink(router) + done := make(chan error, 1) + go func() { _, err := plane.Call("emitter", "arm", "LEC"); done <- err }() + select { + case err := <-done: + if err != nil || demoteErr != nil { + t.Fatalf("call=%v demote=%v", err, demoteErr) + } + case <-time.After(3 * time.Second): + t.Fatal("reentrant rule emit deadlocked") + } + if topicResult(t, listener) != "LEC" || plane.Digest("emitter") != "" { + t.Fatal("global topic did not reach listener/demote emitter") + } +} + +// A synchronized writer keeps diagnostics safe if the ticker ever overlaps a +// test event; tests do not replace the plane's running logger after startup. +type topicLogWriter struct { + mu sync.Mutex + output bytes.Buffer +} + +func (w *topicLogWriter) Write(data []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.output.Write(data) +} +func (w *topicLogWriter) String() string { w.mu.Lock(); defer w.mu.Unlock(); return w.output.String() } +func (w *topicLogWriter) Reset() { w.mu.Lock(); defer w.mu.Unlock(); w.output.Reset() } diff --git a/internal/bluehost/scene_commit.go b/internal/bluehost/scene_commit.go new file mode 100644 index 00000000..2699024a --- /dev/null +++ b/internal/bluehost/scene_commit.go @@ -0,0 +1,48 @@ +package bluehost + +import ( + "context" + "errors" +) + +// ProgramAdmissionToken fences work started before release or a physical Take. +// A released Program can only be enabled by a confirmed physical role swap. +func (h *Host) ProgramAdmissionToken() (uint64, bool) { + h.mu.Lock() + defer h.mu.Unlock() + return h.programAdmissionEpoch, !h.programSuspended +} +func (h *Host) ProgramAdmissionValid(epoch uint64) bool { + h.mu.Lock() + defer h.mu.Unlock() + return !h.programSuspended && h.programAdmissionEpoch == epoch +} +func (h *Host) SuspendProgramAdmissions() { + h.mu.Lock() + defer h.mu.Unlock() + h.programAdmissionEpoch++ + h.programSuspended = true +} + +// AcquireSceneCommit serializes all admission callers for the same host lane. +// It is separate from runtimeMu: callbacks can execute Blue and publish LSDP +// while holding this admission lease. Different lanes retain independent leases. +func (h *Host) AcquireSceneCommit(ctx context.Context, slot Slot) (func(), error) { + if err := ctx.Err(); err != nil { + return nil, err + } + gate, ok := h.sceneCommits[slot] + if !ok { + return nil, errors.New("UNKNOWN_SCENE_SLOT") + } + select { + case <-ctx.Done(): + return nil, ctx.Err() + case gate <- struct{}{}: + if err := ctx.Err(); err != nil { + <-gate + return nil, err + } + return func() { <-gate }, nil + } +} diff --git a/internal/bluehost/scene_interface.go b/internal/bluehost/scene_interface.go new file mode 100644 index 00000000..2d2b55ff --- /dev/null +++ b/internal/bluehost/scene_interface.go @@ -0,0 +1,71 @@ +package bluehost + +import "encoding/json" + +// SetSceneInterface attaches only the operator declaration from admitted LSML. +// It neither compiles nor retains a second copy of the scene/assets. An absent +// declaration in canonical LSML is authoritative: it clears legacy controls. +// Non-LSML compatibility callers continue to use SetBundle. +func (h *Host) SetSceneInterface(slot Slot, source []byte) { + var document struct { + LSML string `json:"lsml"` + OperatorInputs json.RawMessage `json:"operator_inputs"` + } + if json.Unmarshal(source, &document) != nil || document.LSML == "" { + return + } + inputs := document.OperatorInputs + if len(inputs) == 0 || string(inputs) == "null" { + inputs = json.RawMessage(`[]`) + } + h.mu.Lock() + defer h.mu.Unlock() + if e := h.slots[slot]; e != nil { + e.operatorInputs = append([]byte(nil), inputs...) + } +} + +// OperatorInputs returns an owned copy of the current slot's declaration. +// Compatibility bundles are consulted only when no LSML interface was attached. +func (h *Host) OperatorInputs(slot Slot) json.RawMessage { + h.mu.Lock() + defer h.mu.Unlock() + e := h.slots[slot] + if e == nil { + return nil + } + return entryOperatorInputs(e) +} + +// SceneOperatorInputs resolves the exact scene/program address atomically, +// with Program precedence when both slots serve the same scene. It also serves +// source-only/static scenes, whose compatibility bundle is deliberately absent. +func (h *Host) SceneOperatorInputs(sceneID, digest string) (json.RawMessage, bool) { + if sceneID == "" || digest == "" { + return nil, false + } + h.mu.Lock() + defer h.mu.Unlock() + for _, slot := range []Slot{SlotOnAir, SlotPreview} { + if e := h.slots[slot]; e != nil && e.sceneID == sceneID && e.digest == digest { + return entryOperatorInputs(e), true + } + } + return nil, false +} + +func entryOperatorInputs(e *entry) json.RawMessage { + inputs := e.operatorInputs + if inputs == nil { + var document struct { + OperatorInputs json.RawMessage `json:"operator_inputs"` + } + if json.Unmarshal(e.bundle, &document) == nil { + inputs = document.OperatorInputs + } + } + if len(inputs) == 0 { + return json.RawMessage(`[]`) + } + return append(json.RawMessage(nil), inputs...) +} diff --git a/internal/bluehost/scene_interface_test.go b/internal/bluehost/scene_interface_test.go new file mode 100644 index 00000000..fc54bc75 --- /dev/null +++ b/internal/bluehost/scene_interface_test.go @@ -0,0 +1,53 @@ +package bluehost + +import ( + "strings" + "testing" +) + +func TestHostSceneInterface_SourceAuthorityCopiesAndLifetime(t *testing.T) { + h := NewHost() + if err := h.TakeStatic("scene-live", "live-v1"); err != nil { + t.Fatal(err) + } + if err := h.PreparePreviewStatic("scene-preview", "preview-v1"); err != nil { + t.Fatal(err) + } + h.SetBundle(SlotOnAir, []byte(`{"operator_inputs":[{"path":"legacy","type":"text"}]}`)) + if !strings.Contains(string(h.OperatorInputs(SlotOnAir)), "legacy") { + t.Fatal("legacy interface lost") + } + source := []byte(`{"lsml":"1.1","operator_inputs":[{"path":"league","type":"text","writable_by":["operator"]}]}`) + h.SetSceneInterface(SlotOnAir, source) + source[0] = 'x' + inputs, ok := h.SceneOperatorInputs("scene-live", "live-v1") + if !ok || !strings.Contains(string(inputs), `"writable_by"`) || !strings.Contains(string(inputs), "league") { + t.Fatalf("source interface: %s %v", inputs, ok) + } + inputs[0] = 'x' + if got := h.OperatorInputs(SlotOnAir); got[0] != '[' { + t.Fatal("caller mutated live declaration") + } + for _, address := range [][2]string{{"", "live-v1"}, {"scene-live", ""}, {"scene-preview", "live-v1"}, {"scene-live", "old"}} { + if _, ok := h.SceneOperatorInputs(address[0], address[1]); ok { + t.Fatalf("wrong address resolved: %v", address) + } + } + h.SetSceneInterface(SlotPreview, []byte(`{"lsml":"1.1"}`)) + if got := string(h.OperatorInputs(SlotPreview)); got != "[]" { + t.Fatalf("empty Preview: %s", got) + } + h.SetSceneInterface(SlotOnAir, []byte(`{"lsml":"1.1"}`)) + if got := string(h.OperatorInputs(SlotOnAir)); got != "[]" { + t.Fatalf("legacy controls leaked: %s", got) + } + if err := h.TakeStatic("scene-next", "next-v1"); err != nil { + t.Fatal(err) + } + if _, ok := h.SceneOperatorInputs("scene-live", "live-v1"); ok { + t.Fatal("old scene interface still addressable") + } + if got := string(h.OperatorInputs(SlotOnAir)); got != "[]" { + t.Fatalf("interface survived scene switch: %s", got) + } +} diff --git a/internal/bluehost/show_emit.go b/internal/bluehost/show_emit.go index d9aa7c03..4a147a9e 100644 --- a/internal/bluehost/show_emit.go +++ b/internal/bluehost/show_emit.go @@ -33,21 +33,29 @@ func (h *Host) SetShowEmitSink(sink ShowEmitSink) { // adapters.Inbox.EmitToActive path: the event is admitted with the canonical // blue.runtime.event.v1 envelope, then the slot's own runtime consumes it. func (h *Host) EmitEvent(slot Slot, topic string, payload any) error { + _, err := h.EmitEventProjected(slot, topic, payload) + return err +} + +// EmitEventProjected admits and consumes the event, returning its output for +// the scene bridge. The caller must forward this result before acknowledging +// the command; a later idle tick cannot stand in for this projection. +func (h *Host) EmitEventProjected(slot Slot, topic string, payload any) (blueruntime.StepResult, error) { if strings.TrimSpace(topic) == "" { - return fmt.Errorf("bluehost: show.emit topic is empty") + return blueruntime.StepResult{}, fmt.Errorf("bluehost: show.emit topic is empty") } h.mu.Lock() e, ok := h.slots[slot] if !ok || e.instance == nil { h.mu.Unlock() - return fmt.Errorf("%w: %s", ErrNotLoaded, slot) + return blueruntime.StepResult{}, fmt.Errorf("%w: %s", ErrNotLoaded, slot) } sequence := e.showEmitSequence + 1 raw, err := buildShowEmitEvent(e.showEmitOrigin, topic, sequence, payload) if err != nil { h.mu.Unlock() - return err + return blueruntime.StepResult{}, err } instance := e.instance @@ -55,7 +63,7 @@ func (h *Host) EmitEvent(slot Slot, topic string, payload any) error { if _, err := h.runtime.Dispatch(instance, raw); err != nil { h.runtimeMu.Unlock() h.mu.Unlock() - return err + return blueruntime.StepResult{}, err } // Reserve the source sequence only after admission succeeds. A scene may // legitimately not declare every topic emitted by a promoted rule (for @@ -69,13 +77,14 @@ func (h *Host) EmitEvent(slot Slot, topic string, payload any) error { result, err := h.runtime.Step(instance) h.runtimeMu.Unlock() if err != nil { - return err + return blueruntime.StepResult{}, err } result = normalizeRuntimeOutputs(result) h.dispatchInvocations(slot, instance, result.Invocations) h.dispatchShowEmit(slot, instance, result.Variables) h.dispatchOverlayAppSet(slot, instance, result.Variables) - return nil + h.dispatchAnimation(slot, instance, result.Variables) + return result, nil } func showEmitOrigin(instanceID string, slot Slot) string { @@ -135,7 +144,7 @@ func (h *Host) dispatchShowEmit(slot Slot, instance *blueruntime.InstanceHandle, return } if e.showEmitSeen == nil { - e.showEmitSeen = map[string]struct{}{} + e.showEmitSeen = map[string]string{} } nodeIDs := make([]string, 0, len(bag)) for nodeID := range bag { @@ -149,11 +158,10 @@ func (h *Host) dispatchShowEmit(slot Slot, instance *blueruntime.InstanceHandle, if !ok { continue } - key := nodeID + "\x00" + identity - if _, seen := e.showEmitSeen[key]; seen { + if e.showEmitSeen[nodeID] == identity { continue } - e.showEmitSeen[key] = struct{}{} + e.showEmitSeen[nodeID] = identity calls = append(calls, showEmitCall{topic: topic, payload: payload}) } h.mu.Unlock() diff --git a/internal/bluehost/show_emit_test.go b/internal/bluehost/show_emit_test.go index 5e37d452..c2d53bd5 100644 --- a/internal/bluehost/show_emit_test.go +++ b/internal/bluehost/show_emit_test.go @@ -9,7 +9,7 @@ import ( func TestDispatchShowEmitUsesCausationIdentityAndPreservesIdenticalPayloads(t *testing.T) { h := NewHost() instance := &blueruntime.InstanceHandle{} - h.slots[SlotOnAir] = &entry{instance: instance, showEmitSeen: map[string]struct{}{}} + h.slots[SlotOnAir] = &entry{instance: instance, showEmitSeen: map[string]string{}} var calls []showEmitCall h.SetShowEmitSink(func(topic string, payload any) { calls = append(calls, showEmitCall{topic: topic, payload: payload}) diff --git a/internal/bluehost/surface_test.go b/internal/bluehost/surface_test.go new file mode 100644 index 00000000..74a252b9 --- /dev/null +++ b/internal/bluehost/surface_test.go @@ -0,0 +1,62 @@ +package bluehost + +import ( + blueruntime "github.com/ZabLaboratory/Blue/runtime/go" + "testing" +) + +func TestShowEventRouterBoundsReentrantCycles(t *testing.T) { + var router ShowEmitSink + count, overflow := 0, 0 + router = NewShowEventRouter(func(topic string, payload any) { count++; router(topic, payload) }, func() { overflow++ }) + router("cycle", true) + if count != 1024 || overflow != 1 { + t.Fatalf("count=%d overflow=%d", count, overflow) + } + // A failed cascade does not poison subsequent unrelated delivery. + count = 0 + router("again", false) + if count != 1024 || overflow != 2 { + t.Fatalf("router did not recover") + } +} +func TestLocalInvocationsRouteMutationsToTheirOwnSlot(t *testing.T) { + host := NewHost() + var slots []Slot + host.SetSceneMutationSink(func(slot Slot, _ []map[string]any) error { slots = append(slots, slot); return nil }) + for _, slot := range []Slot{SlotPreview, SlotOnAir} { + result := host.runLocalInvocation(slot, map[string]any{"capability": "core.lsml", "operation": "mutate", "request": map[string]any{"operations": []any{map[string]any{"op": "add", "path": "/layout/children/-", "value": map[string]any{"kind": "frame"}}}}}) + if result.Err != "" { + t.Fatal(result.Err) + } + } + if len(slots) != 2 || slots[0] != SlotPreview || slots[1] != SlotOnAir { + t.Fatalf("crossed slots: %v", slots) + } + result := host.runLocalInvocation(SlotPreview, map[string]any{"capability": "zabcam.slots", "operation": "release", "request": map[string]any{"slot_ref": "one"}}) + if result.Err != "PREVIEW_WRITE_FORBIDDEN" { + t.Fatalf("preview camera write admitted: %v", result) + } +} +func TestAnimationDispatchReplaysOnlyNewCausation(t *testing.T) { + host := NewHost() + instance := &blueruntime.InstanceHandle{} + host.slots[SlotPreview] = &entry{instance: instance} + count := 0 + host.SetSceneMutationSink(func(slot Slot, _ []map[string]any) error { + if slot != SlotPreview { + t.Fatal("wrong slot") + } + count++ + return nil + }) + record := map[string]any{"causation_event_id": "one", "config": map[string]any{"animation_id": "reveal"}, "inputs": map[string]any{}} + variables := map[string]any{animationBag: map[string]any{"play": record}} + host.dispatchAnimation(SlotPreview, instance, variables) + host.dispatchAnimation(SlotPreview, instance, variables) + record["causation_event_id"] = "two" + host.dispatchAnimation(SlotPreview, instance, variables) + if count != 2 { + t.Fatalf("animation count=%d", count) + } +} diff --git a/internal/bluehost/validate.go b/internal/bluehost/validate.go index 0e3026bb..5ee6e0ef 100644 --- a/internal/bluehost/validate.go +++ b/internal/bluehost/validate.go @@ -38,6 +38,9 @@ const ( defaultValidateMaxWall time.Duration = 5 * time.Second ) +// Historical name: Canvas requests these isolated execution diagnostics. +// Canvas owns the scene/Blue validation decision; activation never calls this +// probe, and no expected business result is interpreted here. // ValidateProgram reports whether Orion's Engine B can actually RUN program // — the C2 contre-validation surface (ADR-BLUE-012 R6 §6.3/§4.3, scope // widened per the porteur: "il faut qu'on puisse vraiment tout valider, diff --git a/internal/blueproject/project.go b/internal/blueproject/project.go index bc2561a6..2d39f174 100644 --- a/internal/blueproject/project.go +++ b/internal/blueproject/project.go @@ -57,13 +57,22 @@ type StepOutputs struct { // Solar client never sees a divergent legality rule depending on which // path produced the frame. func Project(step StepOutputs, sceneDigest, instanceID, renderRevision, correlationID string, target Target) Projection { + return project(step, sceneDigest, instanceID, renderRevision, correlationID, target, false) +} + +// ProjectNative preserves structured JSON bound by an LSML repeat/object. +// The native document protocol has no LSDP/1 scalar-leaf restriction. +func ProjectNative(step StepOutputs, sceneDigest, instanceID, renderRevision, correlationID string, target Target) Projection { + return project(step, sceneDigest, instanceID, renderRevision, correlationID, target, true) +} +func project(step StepOutputs, sceneDigest, instanceID, renderRevision, correlationID string, target Target, native bool) Projection { patches := make(map[string]json.RawMessage, len(step.Outputs)) for path, val := range step.Outputs { raw, err := json.Marshal(val) if err != nil { continue } - if !isWireLegal(raw) { + if !native && !isWireLegal(raw) { continue } patches[path] = raw diff --git a/internal/blueproject/project_test.go b/internal/blueproject/project_test.go index b46ff2d3..ffdd5d94 100644 --- a/internal/blueproject/project_test.go +++ b/internal/blueproject/project_test.go @@ -54,6 +54,14 @@ func TestProject_EmptyOutputsYieldsEmptyPatches(t *testing.T) { } } +func TestProjectNativePreservesStructuredRenderableValues(t *testing.T) { + step := StepOutputs{Outputs: map[string]any{"rows": []any{map[string]any{"name": "GIDEON", "score": 3}}, "object": map[string]any{"color": "orange"}}} + p := ProjectNative(step, "sha256:source", "native-instance", "rev", "intent", TargetProgram) + if len(p.Patches) != 2 || string(p.Patches["rows"]) != `[{"name":"GIDEON","score":3}]` { + t.Fatalf("structured projection: %+v", p.Patches) + } +} + func TestProject_ArrayOfArraysStillLegal(t *testing.T) { step := StepOutputs{Outputs: map[string]any{"grid": []any{[]any{1.0, 2.0}, []any{3.0}}}} p := Project(step, "sha256:abc", "instance-1", "rev-1", "corr-1", TargetPreview) diff --git a/internal/bluewire/README.md b/internal/bluewire/README.md new file mode 100644 index 00000000..4e70f0f5 --- /dev/null +++ b/internal/bluewire/README.md @@ -0,0 +1,10 @@ +# Blue projection bridges + +Orion owns the per-slot bridge registry here. Bridge projects Blue outputs onto +an existing SceneMirror; Registry owns the paced loops, operator forwarding and +native LSML mutation seam. Host owns execution, Hub owns physical lane routing. +`authority.go` joins both loops then reuses their bridge, sequence, actor and +mirror identities in their new logical role. No StepOnce or startup gate replay +occurs. Admission leases fence operator/platform consumers across this exchange. +Tests beside Bridge/Registry cover projection, ordering, lifecycle and authority. +The native receipt contract is documented in [api](../api/README.md). diff --git a/internal/bluewire/authority.go b/internal/bluewire/authority.go new file mode 100644 index 00000000..d60bc74b --- /dev/null +++ b/internal/bluewire/authority.go @@ -0,0 +1,63 @@ +package bluewire + +import ( + "context" + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/blueproject" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +// PauseRoleSwap joins both loops while retaining their exact bridge/projection +// identity. finish(true) retargets those same bridges after the host/hub commit; +// finish(false) restores them. It never runs StepOnce or an on-start callback. +func (r *Registry) PauseRoleSwap() func(bool) { + r.opMu.Lock() + r.mu.Lock() + p, v := r.running[bluehost.SlotOnAir], r.running[bluehost.SlotPreview] + pm, vm := r.scenes[bluehost.SlotOnAir], r.scenes[bluehost.SlotPreview] + r.running = map[bluehost.Slot]*bridgeRun{} + r.scenes = map[bluehost.Slot]runtime.SceneMirror{} + for _, run := range []*bridgeRun{p, v} { + if run != nil { + run.cancel() + } + } + r.mu.Unlock() + for _, run := range []*bridgeRun{p, v} { + if run != nil { + <-run.done + } + } + return func(commit bool) { + if commit { + p, v = v, p + pm, vm = vm, pm + } + r.mu.Lock() + for _, item := range []struct { + slot bluehost.Slot + run *bridgeRun + mirror runtime.SceneMirror + }{{bluehost.SlotOnAir, p, pm}, {bluehost.SlotPreview, v, vm}} { + if item.mirror != nil { + r.scenes[item.slot] = item.mirror + } + if item.run == nil { + continue + } + b := item.run.bridge + b.slot = item.slot + if item.slot == bluehost.SlotOnAir { + b.target = blueproject.TargetProgram + } else { + b.target = blueproject.TargetPreview + } + ctx, cancel := context.WithCancel(context.Background()) + run := &bridgeRun{cancel: cancel, done: make(chan struct{}), bridge: b, interval: item.run.interval, onError: item.run.onError} + r.running[item.slot] = run + go func() { defer close(run.done); b.Run(ctx, run.interval, run.onError) }() + } + r.mu.Unlock() + r.opMu.Unlock() + } +} diff --git a/internal/bluewire/authority_test.go b/internal/bluewire/authority_test.go new file mode 100644 index 00000000..41ee028c --- /dev/null +++ b/internal/bluewire/authority_test.go @@ -0,0 +1,25 @@ +package bluewire + +import ( + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/blueproject" + "testing" + "time" +) + +func TestRoleSwapRetainsBridgeAndProjectionIdentity(t *testing.T) { + r := NewRegistry() + b := &Bridge{steps: &fakeSteps{}, slot: bluehost.SlotPreview, mirror: &fakeMirror{}, target: blueproject.TargetPreview, instanceID: "prepared", lastRuntimeSequence: 32, lastOutputSequence: 12} + r.Start(bluehost.SlotPreview, b, time.Hour, nil) + finish := r.PauseRoleSwap() + finish(true) + defer r.StopAll() + if r.Current(bluehost.SlotOnAir) != b || r.Current(bluehost.SlotPreview) != nil || b.slot != bluehost.SlotOnAir || b.target != blueproject.TargetProgram || b.instanceID != "prepared" || b.lastRuntimeSequence != 32 || b.lastOutputSequence != 12 { + t.Fatal("bridge recreated") + } + finish = r.PauseRoleSwap() + finish(false) + if r.Current(bluehost.SlotOnAir) != b { + t.Fatal("compensation lost bridge") + } +} diff --git a/internal/bluewire/bridge.go b/internal/bluewire/bridge.go index 7e19204a..ea252d0c 100644 --- a/internal/bluewire/bridge.go +++ b/internal/bluewire/bridge.go @@ -163,7 +163,14 @@ func (b *Bridge) cancelStartup() { // An empty projection (no wire-legal outputs this step) is a no-op — // mirrors the legacy path's zero-patch-delta drop (ADR 002 §6). func (b *Bridge) StepOnce() error { - return b.step(0) + if b.steps == nil { + return errors.New("bluewire: no step source") + } + result, err := b.steps.Step(b.slot) + if err != nil { + return err + } + return b.ForwardResult(result) } // TickOnce advances the production host clock by deltaSeconds and forwards @@ -185,12 +192,12 @@ func (b *Bridge) step(deltaSeconds float64) error { // ForwardResult projects a result already produced by the hosted runtime // onto the same LSDP mirror as the bridge ticker. Operator calls are // synchronous in Engine B: waiting for the next Tick would let a successful -// LEC trigger return 202 while leaving the scene unchanged until an unrelated +// command return 202 while leaving the scene unchanged until an unrelated // clock step (or forever when the runtime emits no tick output). // Keeping this method on Bridge guarantees that immediate calls and periodic // ticks share sequence, deduplication, projection and metadata rules. func (b *Bridge) ForwardResult(result StepResult) error { - proj := blueproject.Project( + proj := blueproject.ProjectNative( blueproject.StepOutputs{RuntimeSequence: result.RuntimeSequence, Outputs: result.Outputs}, b.sceneDigest, b.instanceID, b.renderRevision, b.correlationID, b.target, ) diff --git a/internal/bluewire/bridge_test.go b/internal/bluewire/bridge_test.go index dd71bd14..a39c91be 100644 --- a/internal/bluewire/bridge_test.go +++ b/internal/bluewire/bridge_test.go @@ -221,6 +221,25 @@ func TestBridge_StepOnce_ForwardsDelta(t *testing.T) { } } +func TestBridge_InitialStepIsDistinctFromPeriodicTick(t *testing.T) { + steps := &fakeSteps{results: []StepResult{{Outputs: map[string]any{"a": "start"}}}} + ticks := &fakeSteps{results: []StepResult{{Outputs: map[string]any{"a": "tick"}}}} + mirror := &fakeMirror{} + bridge := &Bridge{steps: steps, ticks: ticks, slot: bluehost.SlotOnAir, mirror: mirror, sceneID: "scene-1", target: blueproject.TargetProgram} + if err := bridge.StepOnce(); err != nil { + t.Fatal(err) + } + if steps.callCount() != 1 || ticks.callCount() != 0 || mirror.count() != 1 { + t.Fatal("initial on-start transition was replaced by a tick") + } + if err := bridge.TickOnce(0.1); err != nil { + t.Fatal(err) + } + if steps.callCount() != 1 || ticks.callCount() != 1 || mirror.count() != 2 { + t.Fatal("periodic tick reran the initial step") + } +} + func TestBridge_ForwardResult_ForwardsImmediateOperatorMutation(t *testing.T) { mirror := &fakeMirror{} b := &Bridge{ diff --git a/internal/bluewire/registry.go b/internal/bluewire/registry.go index 70d5e6cd..a1abfe47 100644 --- a/internal/bluewire/registry.go +++ b/internal/bluewire/registry.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/runtime" ) // Registry tracks the running Bridge, if any, for each bluehost.Slot and @@ -36,17 +37,20 @@ type Registry struct { mu sync.Mutex opMu sync.Mutex running map[bluehost.Slot]*bridgeRun + scenes map[bluehost.Slot]runtime.SceneMirror } type bridgeRun struct { - cancel context.CancelFunc - done chan struct{} - bridge *Bridge + cancel context.CancelFunc + done chan struct{} + bridge *Bridge + interval time.Duration + onError func(error) } // NewRegistry builds an empty Registry. func NewRegistry() *Registry { - return &Registry{running: map[bluehost.Slot]*bridgeRun{}} + return &Registry{running: map[bluehost.Slot]*bridgeRun{}, scenes: map[bluehost.Slot]runtime.SceneMirror{}} } // Start stops whatever bridge currently owns slot (if any) and starts @@ -81,9 +85,10 @@ func (r *Registry) Start(slot bluehost.Slot, bridge *Bridge, interval time.Durat } ctx, cancel := context.WithCancel(context.Background()) - run := &bridgeRun{cancel: cancel, done: make(chan struct{}), bridge: bridge} + run := &bridgeRun{cancel: cancel, done: make(chan struct{}), bridge: bridge, interval: interval, onError: onError} r.mu.Lock() r.running[slot] = run + r.scenes[slot] = bridge.mirror r.mu.Unlock() go func() { defer close(run.done) @@ -102,6 +107,7 @@ func (r *Registry) Stop(slot bluehost.Slot) { r.mu.Lock() run := r.running[slot] delete(r.running, slot) + delete(r.scenes, slot) if run != nil { run.bridge.cancelStartup() run.cancel() @@ -147,12 +153,33 @@ func (r *Registry) Forward(slot bluehost.Slot, result StepResult) error { return bridge.ForwardResult(result) } +func (r *Registry) Mutate(slot bluehost.Slot, operations []map[string]any) error { + r.mu.Lock() + mirror := r.scenes[slot] + r.mu.Unlock() + if mirror == nil { + return fmt.Errorf("bluewire: no running scene for slot %s", slot) + } + mutable, ok := mirror.(interface{ ApplyLSML([]map[string]any) error }) + if !ok { + return fmt.Errorf("bluewire: native LSML mutation is unavailable") + } + return mutable.ApplyLSML(operations) +} + +func (r *Registry) SetSceneMirror(slot bluehost.Slot, mirror runtime.SceneMirror) { + r.mu.Lock() + defer r.mu.Unlock() + r.scenes[slot] = mirror +} + // StopAll stops every running bridge. Intended for process shutdown. func (r *Registry) StopAll() { r.opMu.Lock() defer r.opMu.Unlock() r.mu.Lock() + clear(r.scenes) runs := make([]*bridgeRun, 0, len(r.running)) for slot, run := range r.running { runs = append(runs, run) @@ -165,3 +192,36 @@ func (r *Registry) StopAll() { <-run.done } } + +// Pause joins the ticker but retains the bridge and its mirror for compensation. +// Resuming does not call StepOnce/on-start again. Caller owns the lane commit lease. +func (r *Registry) Pause(slot bluehost.Slot) func(bool) { + r.opMu.Lock() + r.mu.Lock() + run := r.running[slot] + mirror := r.scenes[slot] + delete(r.running, slot) + delete(r.scenes, slot) + if run != nil { + run.cancel() + } + r.mu.Unlock() + if run != nil { + <-run.done + } + r.opMu.Unlock() + return func(restore bool) { + if !restore { + if run != nil { + run.bridge.cancelStartup() + } + return + } + r.Stop(slot) + if run != nil { + r.Start(slot, run.bridge, run.interval, run.onError) + } else if mirror != nil { + r.SetSceneMirror(slot, mirror) + } + } +} diff --git a/internal/compiler/exec_partition_probe_test.go b/internal/compiler/exec_partition_probe_test.go index 81e84e5e..de8eec5b 100644 --- a/internal/compiler/exec_partition_probe_test.go +++ b/internal/compiler/exec_partition_probe_test.go @@ -1,6 +1,6 @@ package compiler -// Probe tests for the exec-partition lift (ADR 006 §3.1/§3.2, issue #103). +// Probe tests for the exec-partition lift (ADR 006 §3.1/§3.2, issue #103). // These complement Forge's exec_partition_test.go without rewriting it. // Each case is independently reproducible and asserts a real invariant. // @@ -12,18 +12,15 @@ package compiler // 3. Pure byte-identical: a pure-dataflow scene produces no exec_programs key. // 4. Determinism: N compiles of a complex exec scene are byte-identical. // 5. EXEC_OP_UNMAPPED: compile-level fail-loud, not a crash. -// 6. Multi-blueprint: 2 exec blueprints → 2 programs, key order deterministic. -// 7. on-event config key contract: Blue uses "event_name" not "event" — defect. -// 8. Dormant: scenes_push.go does not call InstallExec or LoadExec. +// 6. Multi-blueprint: 2 exec blueprints → 2 programs, key order deterministic. +// 7. on-event config key contract: Blue uses "event_name" not "event" — defect. +// Admission now belongs to api/scene_intent*.go. Signature, unattested program +// and artifact digest refusals are exercised there, not by a retired push-file scan. import ( "context" "encoding/json" "errors" - "os" - "path/filepath" - "runtime" - "strings" "testing" ) @@ -58,7 +55,7 @@ func compileExecScene(t *testing.T, bp *BlueprintGraph) (*Graph, error) { } // --------------------------------------------------------------------------- -// 1. Silent-skip closed — is_pure:true exec-pin nodes leave the data graph +// 1. Silent-skip closed — is_pure:true exec-pin nodes leave the data graph // --------------------------------------------------------------------------- // TestPartitionProbe_PureExecNodes_NotInDataGraph exercises each exec-pin @@ -132,7 +129,7 @@ func TestPartitionProbe_PureExecNodes_NotInDataGraph(t *testing.T) { } // The exec node must NOT appear in the data graph. if _, ok := graphNodeByID(g, "node"); ok { - t.Fatalf("%s: exec node leaked into data GraphNode list — silent-skip NOT closed", tc.name) + t.Fatalf("%s: exec node leaked into data GraphNode list — silent-skip NOT closed", tc.name) } // The entry (on-start) must NOT appear in data graph. if _, ok := graphNodeByID(g, "start"); ok { @@ -155,8 +152,8 @@ func TestPartitionProbe_PureExecNodes_NotInDataGraph(t *testing.T) { // 2a. Round-trip: sequence nested inside branch // --------------------------------------------------------------------------- -// TestPartitionProbe_SequenceInBranch: on-start → branch → [true: sequence -// → {then_0: set1, then_1: set2}]. Proves sequence ops with multiple then_N +// TestPartitionProbe_SequenceInBranch: on-start → branch → [true: sequence +// → {then_0: set1, then_1: set2}]. Proves sequence ops with multiple then_N // pins and branch exec edges all route to the exec program, with correct Next. func TestPartitionProbe_SequenceInBranch(t *testing.T) { bp := &BlueprintGraph{ @@ -209,7 +206,7 @@ func TestPartitionProbe_SequenceInBranch(t *testing.T) { p := decodeProgram(t, g.ExecPrograms[0]) - // branch wired: Next["true"] → seq. + // branch wired: Next["true"] → seq. br, ok := p.Nodes["br"] if !ok { t.Fatal("branch node missing from exec program") @@ -217,7 +214,7 @@ func TestPartitionProbe_SequenceInBranch(t *testing.T) { if tgt, ok := br.Next["true"]; !ok || tgt.Node != "seq" { t.Fatalf("branch Next[true] = %+v, want seq", br.Next) } - // sequence has Next[then_0] → set1, Next[then_1] → set2. + // sequence has Next[then_0] → set1, Next[then_1] → set2. seq, ok := p.Nodes["seq"] if !ok { t.Fatal("sequence node missing from exec program") @@ -234,7 +231,7 @@ func TestPartitionProbe_SequenceInBranch(t *testing.T) { // 2b. Round-trip: for-loop with exec-producer data out (index pin) // --------------------------------------------------------------------------- -// TestPartitionProbe_ForLoopIndexPin: on-start → for-loop → body: print. +// TestPartitionProbe_ForLoopIndexPin: on-start → for-loop → body: print. // The print node's value is fed from the loop's index pin (exec-producer data // out). Confirms ExecDataInput.FromPort is carried verbatim and the From is // NOT key-prefixed (exec-producer is within the program). @@ -249,14 +246,14 @@ func TestPartitionProbe_ForLoopIndexPin(t *testing.T) { Inputs: []BlueprintPort{execIn("exec_in")}, Outputs: []BlueprintPort{execOut("body"), execOut("completed"), dataIn("index")}}, {ID: "pr", Compute: "core.print@1", - Config: map[string]json.RawMessage{"message": json.RawMessage(`"i"`)}, - Inputs: []BlueprintPort{execIn("exec_in"), dataIn("value")}, + Config: map[string]json.RawMessage{"message": json.RawMessage(`"i"`)}, + Inputs: []BlueprintPort{execIn("exec_in"), dataIn("value")}, Outputs: []BlueprintPort{execOut("then")}}, }, Edges: []BlueprintEdge{ {FromNode: "start", FromPort: "then", ToNode: "loop", ToPort: "exec_in"}, {FromNode: "loop", FromPort: "body", ToNode: "pr", ToPort: "exec_in"}, - // data edge: loop's "index" output (exec-producer data out) → print's "value" input. + // data edge: loop's "index" output (exec-producer data out) → print's "value" input. {FromNode: "loop", FromPort: "index", ToNode: "pr", ToPort: "value"}, }, } @@ -302,9 +299,9 @@ func TestPartitionProbe_MultipleOnEvent(t *testing.T) { bp := &BlueprintGraph{ ID: "bp-1", Nodes: []BlueprintNode{ - // on-event "goal" → set1. + // on-event "goal" → set1. // Use BOTH keys so the test passes regardless of which key - // the compiler currently reads (the correct key is "event_name" — + // the compiler currently reads (the correct key is "event_name" — // see TestPartitionProbe_OnEvent_ConfigKeyContract). { ID: "ev_goal", @@ -319,7 +316,7 @@ func TestPartitionProbe_MultipleOnEvent(t *testing.T) { Config: map[string]json.RawMessage{"name": json.RawMessage(`"goals"`)}, Inputs: []BlueprintPort{execIn("exec_in"), dataIn("value")}, Outputs: []BlueprintPort{execOut("then")}}, - // on-event "assist" → set2. + // on-event "assist" → set2. { ID: "ev_assist", Compute: "core.event.on-event@1", @@ -384,7 +381,7 @@ func TestPartitionProbe_MultipleOnEvent(t *testing.T) { // 2d. Round-trip: delay node config verbatim // --------------------------------------------------------------------------- -// TestPartitionProbe_DelayConfigVerbatim: on-start → delay (seconds=2.5) → +// TestPartitionProbe_DelayConfigVerbatim: on-start → delay (seconds=2.5) → // set. Confirms delay is routed to exec program, config carried verbatim, // and Next["then"] wires to set. func TestPartitionProbe_DelayConfigVerbatim(t *testing.T) { @@ -558,17 +555,17 @@ func TestPartitionProbe_Determinism_Complex(t *testing.T) { continue } if string(raw) != string(first) { - t.Fatalf("compile %d produced a different artefact — not byte-identical\ngot: %s\nwant: %s", i, raw, first) + t.Fatalf("compile %d produced a different artefact — not byte-identical\ngot: %s\nwant: %s", i, raw, first) } } } // --------------------------------------------------------------------------- -// 5. EXEC_OP_UNMAPPED — fail-loud, not a crash +// 5. EXEC_OP_UNMAPPED — fail-loud, not a crash // --------------------------------------------------------------------------- // TestPartitionProbe_ExecOpUnmapped_NotCrash: a node with exec pins whose -// manifest entry maps to no op → compile returns EXEC_OP_UNMAPPED (not nil +// manifest entry maps to no op → compile returns EXEC_OP_UNMAPPED (not nil // err, not a panic, not a silent omission from the program). func TestPartitionProbe_ExecOpUnmapped_NotCrash(t *testing.T) { bp := &BlueprintGraph{ @@ -600,13 +597,13 @@ func TestPartitionProbe_ExecOpUnmapped_NotCrash(t *testing.T) { } // --------------------------------------------------------------------------- -// 6. Multi-blueprint: 2 exec blueprints → 2 programs, deterministic key order +// 6. Multi-blueprint: 2 exec blueprints → 2 programs, deterministic key order // --------------------------------------------------------------------------- // TestPartitionProbe_MultiBlueprint_TwoExecPrograms: two blueprints both // carrying exec nodes produce exactly 2 ExecPrograms. Their order in // graph.ExecPrograms follows the stable blueprint-key sort order (ADR 001 -// §3.2), and each program's BlueprintKey is its scene-local key. +// §3.2), and each program's BlueprintKey is its scene-local key. func TestPartitionProbe_MultiBlueprint_TwoExecPrograms(t *testing.T) { bpAlpha := &BlueprintGraph{ ID: "bp-alpha", @@ -614,8 +611,8 @@ func TestPartitionProbe_MultiBlueprint_TwoExecPrograms(t *testing.T) { {ID: "start", Compute: "core.event.on-start@1", Outputs: []BlueprintPort{execOut("then")}}, {ID: "pr", Compute: "core.print@1", - Config: map[string]json.RawMessage{"message": json.RawMessage(`"alpha"`)}, - Inputs: []BlueprintPort{execIn("exec_in")}, + Config: map[string]json.RawMessage{"message": json.RawMessage(`"alpha"`)}, + Inputs: []BlueprintPort{execIn("exec_in")}, Outputs: []BlueprintPort{execOut("then")}}, }, Edges: []BlueprintEdge{ @@ -644,7 +641,7 @@ func TestPartitionProbe_MultiBlueprint_TwoExecPrograms(t *testing.T) { }, manifest: fullExecManifest(), } - // Push with keys "alpha" < "zeta" — authored out of order to exercise sorting. + // Push with keys "alpha" < "zeta" — authored out of order to exercise sorting. g, _, _, err := Compile(context.Background(), "scene-1", PushEnvelope{CanvasVersion: "v1", Blueprints: []BlueprintRef{ {Key: "zeta", ID: "bp-zeta"}, // authored out of sort order @@ -688,7 +685,7 @@ func TestPartitionProbe_MultiBlueprint_TwoExecPrograms(t *testing.T) { } // TestPartitionProbe_MultiBlueprint_Deterministic: same 2-blueprint scene, -// 5 compiles → byte-identical artefact each time. +// 5 compiles → byte-identical artefact each time. func TestPartitionProbe_MultiBlueprint_Deterministic(t *testing.T) { bpAlpha := &BlueprintGraph{ ID: "bp-alpha", @@ -735,13 +732,13 @@ func TestPartitionProbe_MultiBlueprint_Deterministic(t *testing.T) { continue } if string(raw) != string(first) { - t.Fatalf("multi-blueprint compile %d diverged — not byte-identical", i) + t.Fatalf("multi-blueprint compile %d diverged — not byte-identical", i) } } } // --------------------------------------------------------------------------- -// 7. on-event config key — DEFECT cross-repo contract divergence +// 7. on-event config key — DEFECT cross-repo contract divergence // --------------------------------------------------------------------------- // TestPartitionProbe_OnEvent_ConfigKeyContract verifies the cross-repo contract @@ -761,7 +758,7 @@ func TestPartitionProbe_OnEvent_ConfigKeyContract(t *testing.T) { { ID: "ev", Compute: "core.event.on-event@1", - // Only "event_name" — the Blue canonical key (stdlib_seeder.py:122). + // Only "event_name" — the Blue canonical key (stdlib_seeder.py:122). Config: map[string]json.RawMessage{"event_name": json.RawMessage(`"goal"`)}, Outputs: []BlueprintPort{execOut("then")}, }, @@ -777,7 +774,7 @@ func TestPartitionProbe_OnEvent_ConfigKeyContract(t *testing.T) { g, err := compileExecScene(t, bp) if err != nil { - t.Fatalf("compile error: %v — execEntryEventConfigKey must be \"event_name\" to match Blue contract (stdlib_seeder.py:122)", err) + t.Fatalf("compile error: %v — execEntryEventConfigKey must be \"event_name\" to match Blue contract (stdlib_seeder.py:122)", err) } p := decodeProgram(t, g.ExecPrograms[0]) @@ -790,54 +787,9 @@ func TestPartitionProbe_OnEvent_ConfigKeyContract(t *testing.T) { t.Fatalf("entry.Kind = %q, want \"on-event\"", entry.Kind) } if entry.Event != "goal" { - t.Fatalf("entry.Event = %q, want \"goal\" — config.event_name not read correctly", entry.Event) + t.Fatalf("entry.Event = %q, want \"goal\" — config.event_name not read correctly", entry.Event) } if entry.Target.Node != "set" { t.Fatalf("entry.Target.Node = %q, want \"set\"", entry.Target.Node) } } - -// --------------------------------------------------------------------------- -// 8. R9 lift (issue #106): scenes_push.go installs exec ONLY via execForAir -// --------------------------------------------------------------------------- - -// TestPartitionProbe_PushInstallsExecThroughGate: a structural source-level -// check that, post-R9-lift (ADR 006 §3.4, issue #106), the production -// scenes_push.go handler installs exec — but ONLY through the gated seam -// execForAir, never by resolving programs itself (ExecProgramsFromGraph) -// and never by handing programs to LoadExec down a path that skips the -// validation gate. The invariant is: every install is keyed on the #87 -// validation record, which execForAir is the single composer of. -// -// This SUPERSEDES the pre-lift dormancy guard (exec was dormant until -// #106): the lift's whole point is that a VALIDATED scene installs its -// exec. The guard now protects the franchissement's safety property — no -// bypass of the gate — rather than its dormancy. -// -// The source is read at test run time from the adjacent api/ package using -// runtime.Caller to anchor the path correctly regardless of test working dir. -func TestPartitionProbe_PushInstallsExecThroughGate(t *testing.T) { - _, thisFile, _, ok := runtime.Caller(0) - if !ok { - t.Skip("runtime.Caller failed — cannot locate scenes_push.go") - } - // thisFile is .../internal/compiler/exec_partition_probe_test.go - // scenes_push.go is at .../internal/api/scenes_push.go - pushPath := filepath.Join(filepath.Dir(thisFile), "..", "api", "scenes_push.go") - src, err := os.ReadFile(pushPath) - if err != nil { - t.Skipf("cannot read scenes_push.go (%v) — gate check skipped", err) - } - content := string(src) - - // The lift requires the push path to install exec through execForAir. - if !strings.Contains(content, "execForAir") { - t.Error("scenes_push.go no longer calls execForAir — the R9 lift's gated install seam is missing (ADR 006 §3.4)") - } - // The push handler must NEVER resolve programs itself: that would be a - // path around the validation gate. ExecProgramsFromGraph is only legal - // INSIDE execForAir (gate.go), which gates it on the validation record. - if strings.Contains(content, "ExecProgramsFromGraph") { - t.Error("scenes_push.go calls ExecProgramsFromGraph directly — exec install must go through execForAir, never around the #87 gate") - } -} diff --git a/internal/compiler/graph.go b/internal/compiler/graph.go index 659aa351..3d45f50a 100644 --- a/internal/compiler/graph.go +++ b/internal/compiler/graph.go @@ -103,6 +103,9 @@ type GraphInput struct { // RenderBundle is the Solar-facing artefact. Same shape as ADR 003 § 3. type RenderBundle struct { + // SourceLSML retains original authored bytes for native reception. It never + // enters the compatibility render bundle or its content hash. + SourceLSML []byte `json:"-"` SceneVersion string `json:"scene_version"` Root LayoutNode `json:"root"` OperatorInputs []OperatorInput `json:"operator_inputs"` diff --git a/internal/compiler/static_bundle.go b/internal/compiler/static_bundle.go index f7200d3a..6b527ff0 100644 --- a/internal/compiler/static_bundle.go +++ b/internal/compiler/static_bundle.go @@ -59,6 +59,12 @@ func CompileStaticRenderBundle(raw []byte, _ string, sceneVersion, assetBaseURL bundle.Defaults[path] = bytes.Clone(value) } } + var source struct { + LSML string `json:"lsml"` + } + if json.Unmarshal(raw, &source) == nil && source.LSML != "" { + bundle.SourceLSML = bytes.Clone(raw) + } return bundle, defaults, nil } diff --git a/internal/config/config.go b/internal/config/config.go index 140d033e..418a9096 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -76,12 +76,18 @@ func (p Profile) IsAntenne() bool { return p == ProfileAntenne } // Config is the typed view of Orion's environment. Every field maps to // a single env var; empty defaults are filled in by Load. type Config struct { - ListenAddr string - InternalAddr string - PublicBaseURL string - DatabaseURL string - AssetRoot string - SolarRoot string + NativeLSDPAddress string + NativeLSDPResource string + StreamIntentPath string + SceneControlPath string + SceneCachePath string + OverlayAppsPath string + ListenAddr string + InternalAddr string + PublicBaseURL string + DatabaseURL string + AssetRoot string + SolarRoot string // CompilerCacheDir roots the compiler's content-addressed disk cache for // immutable upstream fetches (Canvas layout + pinned Blue blueprint // graph), ORION_COMPILER_CACHE_DIR. Empty disables the cache (every push @@ -89,7 +95,6 @@ type Config struct { // no eviction / TTL; a changed artefact carries a new key. CompilerCacheDir string ZabAuthValidateURL string - AuthCacheTTL time.Duration ServiceToken string ServicePaths []string QuasarBaseURL string @@ -275,6 +280,12 @@ func Load() (Config, error) { var problems []string cfg := Config{ + NativeLSDPAddress: strings.TrimSpace(os.Getenv("ORION_LSDP_NATIVE_ADDRESS")), + NativeLSDPResource: getenv("ORION_LSDP_NATIVE_RESOURCE", "orion/state"), + StreamIntentPath: strings.TrimSpace(os.Getenv("ORION_STREAM_INTENT_PATH")), + SceneControlPath: strings.TrimSpace(os.Getenv("ORION_SCENE_CONTROL_PATH")), + SceneCachePath: strings.TrimSpace(os.Getenv("ORION_SCENE_CACHE_PATH")), + OverlayAppsPath: strings.TrimSpace(os.Getenv("ORION_OVERLAY_APPS_PATH")), ListenAddr: getenv("ORION_LISTEN_ADDR", "127.0.0.1:4007"), InternalAddr: getenv("ORION_INTERNAL_ADDR", "127.0.0.1:4017"), PublicBaseURL: strings.TrimRight(getenv("ORION_PUBLIC_BASE_URL", ""), "/"), @@ -380,14 +391,6 @@ func Load() (Config, error) { cfg.PushTimeout = time.Duration(v) * time.Second } - if v, err := getInt("ORION_AUTH_CACHE_TTL_S", 60); err != nil { - problems = append(problems, err.Error()) - } else if v < 0 { - problems = append(problems, "ORION_AUTH_CACHE_TTL_S must be >= 0") - } else { - cfg.AuthCacheTTL = time.Duration(v) * time.Second - } - // Phase-3 async-effect config (issue #85). Parsed fail-closed: the // egress allowlist defaults to empty (deny-all), https-only. cfg.HTTPEgressAllowHosts = splitCSV(getenv("ORION_HTTP_EGRESS_ALLOW_HOSTS", "")) diff --git a/internal/lsdp/bound_leaves_lsml.go b/internal/lsdp/bound_leaves_lsml.go index 0ebac494..588d1fb1 100644 --- a/internal/lsdp/bound_leaves_lsml.go +++ b/internal/lsdp/bound_leaves_lsml.go @@ -94,8 +94,9 @@ func (b boundLeafSet) bootstrapState() map[string]any { // decode where one field's type mismatch fails the whole node and silently // drops its entire subtree: // -// - `bind` (map[string]LeafPath, cf. lsml/validate.go's `node["bind"]`) -// — the node's own leaf-path bindings. +// - `bind`, `bindStyle`, `bindUniversal`, `bindAnimate` (leaf-path maps) +// — authored scalar, style and editable wrapper bindings; decode each +// independently so a malformed group cannot suppress another group. // - `children` ([]Node) — stack/grid/frame's ordered child list. // - `template` (Node, singular — NOT an array) — a `repeat` node's item // template (lsml/capture.go's CheckZabCaptureNodes walks the exact @@ -113,7 +114,11 @@ func collectBoundLeavesLSML(raw json.RawMessage, dst map[string]struct{}) { return } - if bindRaw, ok := fields["bind"]; ok { + for _, field := range []string{"bind", "bindStyle", "bindUniversal", "bindAnimate"} { + bindRaw, ok := fields[field] + if !ok { + continue + } var bind map[string]json.RawMessage if err := json.Unmarshal(bindRaw, &bind); err == nil { for _, v := range bind { diff --git a/internal/lsdp/native_surface.go b/internal/lsdp/native_surface.go new file mode 100644 index 00000000..38088aab --- /dev/null +++ b/internal/lsdp/native_surface.go @@ -0,0 +1,11 @@ +package lsdp + +import "log/slog" + +// RenderSurface shares the authored binding contract with native reception. +// Native JSON permits object rows, so only the binding gate is reused; the +// retired LSDP/1 scalar restriction does not apply to native document values. +func RenderSurface(sceneID string, source []byte, logger *slog.Logger) func(string) bool { + bound := boundLeavesFromLSML(sceneID, source, logger) + return func(path string) bool { return !bound.active() || bound.renderable(path) } +} diff --git a/internal/lsdp/native_surface_test.go b/internal/lsdp/native_surface_test.go new file mode 100644 index 00000000..b6aebb73 --- /dev/null +++ b/internal/lsdp/native_surface_test.go @@ -0,0 +1,15 @@ +package lsdp + +import "testing" + +func TestNativeSurfaceIncludesAllAuthoredBindingGroups(t *testing.T) { + surface := RenderSurface("draft", []byte(`{"layout":{"kind":"frame","bind":{"value":"text"},"bindStyle":{"fill":"colour"},"bindUniversal":{"width":"width"},"bindAnimate":{"transform.translate":"position"},"children":[{"bindStyle":{"weight":"weight"}}],"template":{"bind":{"src":"image"}}}}`), nil) + for _, path := range []string{"text", "colour", "width", "position", "weight", "image"} { + if !surface(path) { + t.Fatalf("declared %s was filtered", path) + } + } + if surface("internal.compute") { + t.Fatal("unbound compute must remain filtered") + } +} diff --git a/internal/lsdp/viewer_arming.go b/internal/lsdp/viewer_arming.go index b80cac75..7e63cf9e 100644 --- a/internal/lsdp/viewer_arming.go +++ b/internal/lsdp/viewer_arming.go @@ -99,6 +99,7 @@ type CredsFetcher interface { // mu; the goroutine is the only writer of lastEmit/rooms. type viewerArmer struct { wire *Wire + sink interface{ EmitViewerPayload(string) } fetch CredsFetcher refresh time.Duration logger *slog.Logger @@ -231,11 +232,30 @@ func (a *viewerArmer) rearm() { // emit writes the serialised payload onto the active kit scene (the live // endpoint). No active scene yet ⇒ stored only; the next SetActive replays it. func (a *viewerArmer) emit(js string) { - if sc := a.wire.srv.ActiveScene(); sc != nil { + if a.sink != nil { + a.sink.EmitViewerPayload(js) + return + } + a.wire.EmitViewerPayload(js) +} + +func (w *Wire) EmitViewerPayload(js string) { + if sc := w.srv.ActiveScene(); sc != nil { _ = sc.Emit(map[string]any{viewerLeaf: js}) } } +// ViewerCredentials reuses room resolution, deduplication and token rotation +// for native sinks without constructing an LSDP/1 server. +type ViewerCredentials struct{ armer *viewerArmer } + +func NewViewerCredentials(ctx context.Context, fetch CredsFetcher, refresh time.Duration, logger *slog.Logger, sink interface{ EmitViewerPayload(string) }) *ViewerCredentials { + a := &viewerArmer{sink: sink, fetch: fetch, refresh: refresh, logger: logger, ctx: ctx, dirty: make(chan struct{}, 1), peers: map[string]struct{}{}} + go a.loop() + return &ViewerCredentials{armer: a} +} +func (v *ViewerCredentials) SetPeers(labels []string) { v.armer.setPeers(labels) } + // replay re-applies the last-emitted payload onto a freshly-activated scene so // the viewer creds persist across a scene switch (called from SetActive after // the kit migrates subscribers, like the slot mirror). diff --git a/internal/lsdpreception/README.md b/internal/lsdpreception/README.md new file mode 100644 index 00000000..dbc424a9 --- /dev/null +++ b/internal/lsdpreception/README.md @@ -0,0 +1,126 @@ +# Native scene production and shared reception + +Prism owns the local native Rust server and passes ORION_LSDP_NATIVE_ADDRESS plus +ORION_LSDP_NATIVE_RESOURCE=orion/state. Orion performs a real native handshake and +resource read before serving. Its readiness endpoint rechecks that dependency and +returns 503 if unavailable. Orion never launches a duplicate receiver. + +`producer.go` serializes publication off the scene/Blue goroutine. Full desired +documents use the receiver's state route: Rust computes its own Merkle diff. +Authored output leaves use atomic application transactions with the acknowledged +tree hash. A proven stale base is reread and the intended leaves rebased; unknown +transport outcomes replay the same transaction identity. Queue overflow or +unrecoverable delivery invalidates `/ready` instead of dropping an output. + +Transport interruptions retain queued outputs and replay the same transaction +until the receiver responds or Orion shuts down. A verified success clears the +transient readiness error. An established socket failure gets one immediate +reconnect with the identical request; subsequent failures and initial dial +failure use the bounded 250 ms backoff. Idle expiry therefore does not add a +mandatory delay to the next edit. No scene/timer traffic is added to keep a socket +alive. `idle_recovery_test.go` checks immediate replay and outage backoff; +`idle_recovery_native_test.go` checks actual application after a private socket +loss. Failed dials never replace the live client: the native binding may return +a typed nil through its interface on cancellation; shutdown/retry must not call +Close on that value. The same regression suite covers cancelled real dials. +An uncertain commit followed by BASE_MISMATCH is +terminal: it is never rebased into a potentially duplicated insertion. +The native router retains each full assignment and its replay payload until its +owner releases the completed record. Both `Producer` and `Reception.Replace` +validate the exact completed route ID, then call `route.forget` with `force:false`. +After completion, a lost release receipt retries only the release; `unknown` is +an idempotent success. Replaying an already forgotten assignment could overwrite +a newer edit. Unconfirmed/rejected routes are never released. This bounds retained +router memory without increasing native quotas or removing another writer's records. +`/runtime/host-surface.native_delivery` exposes backlog/reconnect/delivery counts. +See `docs/runbooks/native-recovery.md` for process-restart limits. + +Editable scene resources include `x-solar-authoring` (`solar.authoring/1`): +the immutable base, content-addressed non-font assets and font digests arrive by LSDP. +Font bytes remain in the installation/host font bank; scene changes do not resend them. +Only live root defaults change on edits; the base is preserved. Solar presentation +feedback also returns through the native `orion/state` resource. No Orion–Solar +HTTP source endpoint is registered. + +`mirror.go` retains the original LSML, including geometry/styles/assets. It +projects runtime Blue output values only onto authored bindings, using the +existing render-surface gate and preserving structured JSON. Provenance travels +under `x-orion` in the same atomic mutation. Program and Preview are independent +resources. Immutable generation entries are keyed by SHA-256(scene ID + NUL + +admitted artifact-set digest), with bounded retention and writer leases so a delayed +Preview tick cannot overwrite a taken generation. Camera slots and viewer +credentials follow their lane and seed newly armed generations. +The native document preserves the source's LSML `scene_version` for Solar's +exact source acquisition. `x-orion-artifact-set` carries the separate admitted +generation identity; neither overwrites the other. Missing source identity is +an explicit delivery error. `producer_test.go` covers this boundary. + +`session.go` publishes isolated test clones under their actual API session ID; +closing a session removes its entry and rejects late forwards. `orion/state` +carries rosters and overlay running/on-air control for Prism's native subscriber. +The executable no longer registers the old LSDP/1 rendering endpoints. The +legacy adapter package remains for explicit compatibility consumers and its +conformance tests; it is not instantiated by production startup. + +Native test sessions start with a five-minute lease, renewed through the +operator-only URL returned by the open API and explicitly closed by its DELETE +URL. A periodic sweep reclaims abandoned clones and removes their native entry; +native subscriptions do not keep an Orion clone alive implicitly. + +Scene-intent success waits for the native application ACK. Editable inputs first +cross the scene inbox and publish to their mirrors, then operator HTTP/WS +responses wait for the producer barrier. Camera projection uses the same ACK +boundary after the durable slot authority has accepted the change. +Operator calls and resolved awaits project their immediate runtime result through +the same bridge as ticks, then wait for native application. A later tick is not +required to publish an arbitrary command's immediate output. + +The byte-pinned Go client is the unchanged optional Lumencast binding in +third_party/lsdpnative/client.go. Orion's `subscription.go` extends its existing +framing for control subscriptions; the pinned file remains unchanged. No native +server code is copied or modified. + +`control.go` owns fragmented native control reads, CAS leaf assignments and +reconnecting subscriptions. Its `WriteLeavesFromState` builder recomputes only +state-dependent leaves after proven stale-base rejection, so Program retirement +preserves concurrent Preview desired selections. `program_identity.go` reads a +physical authority head; `program_release.go` pins its runtime/Take epoch, freezes +late mirror publications, reuses `Lane.Drop` and keeps a bounded 64-command replay +history. The native resource becomes null; the Lane identity and Preview document +stay intact. `program_release_test.go` checks empty-Program start, stale authority +refusal, retirement and late publication. Staged presentation uses idempotent full assignments +with the same identity across transport retries. `Lane.BeginTransition` freezes +Blue/camera projection until the coordinator restores or accepts the scene, then +publishes the latest camera authority. Control/scene lifecycle contracts belong +to [API admission](../api/README.md). + +Checks: `go test ./...`, `go vet ./...`; `TestRealSharedNative` and +`TestRealNativeProducers` require `ORION_TEST_LSDP_NATIVE_ADDRESS` plus a real +`ORION_TEST_LSML_PATH`. The latter owns disposable native resources. The offline +CEF proof also runs a real validated Blue output program through `bluewire` and +the actual Rust receiver. Unit checks alone do not prove CEF or authenticated +Prism startup. +`TestRealNativeRouteRetention` requires `ORION_TEST_ROUTE_RETENTION_ADDRESS` for an +owned disposable node with a 128 KiB routing budget. It first proves `ROUTE_BYTES` +without release, then verifies 2,048 producer and 128 control replacements in the +same budget. It must never run against the shared development receiver. +`internal/api/TestRealNativeOperatorVisual` also invokes LEC and LCK using the +unaltered program published for the real scene, with actual read-only ZabTruth +and ZabRanking responses. The CEF report checks each roster, the native receipt, +submitted Vision frame, full-scene screenshots and retained physical camera. + +## Persistent physical lanes + +When the native receiver advertises both `solar/lane-a` and `solar/lane-b`, +startup enables physical routing. Logical Program/Preview Lane handles are stable; +their targets, active writers and camera/viewer authority permute only on a +validated `orion.lane-commit.v1` receipt. The Mirror and document remain on their +physical resource. Commit publishes no full LSML assignment; camera changes are +absolute leaf transactions. New Preview selection replaces only the outgoing +physical lane. Legacy resources remain available for older explicit consumers. + +`lane_roles.go` owns correlation, revision/role validation, bounded exact replay, +conflict/stale/runtime/busy refusal and source identities. `lane_roles_test.go` +checks writer continuity and camera isolation. `api/lane_commit_native_test.go` +checks receipts and untouched documents with a disposable Rust receiver. Actual +Solar engine identity and rendered frames require Prism integration evidence. diff --git a/internal/lsdpreception/animation_native_test.go b/internal/lsdpreception/animation_native_test.go new file mode 100644 index 00000000..6e7dd335 --- /dev/null +++ b/internal/lsdpreception/animation_native_test.go @@ -0,0 +1,99 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "log/slog" + "os" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/providers" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +// Opt-in CEF proof seam. Uses the complete real scene, never saves its mutation. +func TestRealNativeBlueAnimation(t *testing.T) { + address, path, phase := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), os.Getenv("ORION_TEST_LSML_PATH"), os.Getenv("ORION_TEST_ANIMATION_PHASE") + if address == "" || path == "" || phase == "" { + t.Skip("requires real native receiver, source and animation phase") + } + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + client, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer client.Close() + var document map[string]any + if phase == "seed" { + raw, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if err = json.Unmarshal(raw, &document); err != nil { + t.Fatal(err) + } + children := document["layout"].(map[string]any)["children"].([]any) + panel := children[1].(map[string]any)["children"].([]any)[1].(map[string]any)["children"].([]any)[0].(map[string]any) + panel["id"] = "cef-animation-panel" + asset := func(start, end map[string]any) any { + start["at"] = 0 + end["at"] = 1 + return map[string]any{"target": "cef-animation-panel", "keyframes": map[string]any{"duration_ms": 120, "easing": "linear", "steps": []any{start, end}}} + } + document["animations"] = map[string]any{"hide": asset(map[string]any{"opacity": 1}, map[string]any{"opacity": 0}), "reveal": asset(map[string]any{"opacity": 0}, map[string]any{"opacity": 1}), "move": asset(map[string]any{"translateX": 0}, map[string]any{"translateX": 40})} + } else { + raw, err := client.Exchange(ctx, map[string]any{"kind": "state.read", "target": "solar/program"}) + if err != nil { + t.Fatal(err) + } + var snapshot struct{ State map[string]any } + if err = json.Unmarshal(raw, &snapshot); err != nil { + t.Fatal(err) + } + document = snapshot.State + } + raw, err := json.Marshal(document) + if err != nil { + t.Fatal(err) + } + reception, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + producer := NewProducer(ctx, reception) + defer producer.Close() + lane := NewHub(producer, slog.Default()).Lane("program") + mirror := lane.MirrorForLSML(document["scene_id"].(string), document["scene_version"].(string), raw).(*Mirror) + lane.SetActive(document["scene_id"].(string)) + if err = producer.Flush(ctx); err != nil { + t.Fatal(err) + } + if phase != "seed" { + host := bluehost.NewHost() + host.SetSceneMutationSink(func(slot bluehost.Slot, ops []map[string]any) error { + if slot != bluehost.SlotOnAir { + t.Fatal("wrong lane") + } + return mirror.ApplyLSML(ops) + }) + program := nativeEffectProgram(t, "core.animation", "play", map[string]any{"animation_id": phase}) + if err = host.Take("animation-"+phase, document["scene_id"].(string), document["scene_version"].(string), program, providers.Registry(), providers.Policy(false), nil); err != nil { + t.Fatal(err) + } + defer func() { + if err := host.Release(bluehost.SlotOnAir, "proof-end"); err != nil { + t.Error(err) + } + }() + if _, err = host.Step(bluehost.SlotOnAir); err != nil { + t.Fatal(err) + } + if err = producer.Flush(ctx); err != nil { + t.Fatal(err) + } + } + t.Logf("REAL_BLUE_ANIMATION phase=%s native_ack=true source_saved=false", phase) +} diff --git a/internal/lsdpreception/blue_native_test.go b/internal/lsdpreception/blue_native_test.go new file mode 100644 index 00000000..fa182746 --- /dev/null +++ b/internal/lsdpreception/blue_native_test.go @@ -0,0 +1,171 @@ +package lsdpreception + +import ( + "bytes" + "context" + "encoding/json" + "io" + "log/slog" + "os" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/blueproject" + "github.com/ZabLaboratory/Orion/internal/bluewire" + "github.com/ZabLaboratory/Orion/internal/canonical" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +// Execute an actual validated blue.program.v1, derived from the repository's +// minimal opcode fixture. The visual scene is always the full original LSML. +func outputProgram(t *testing.T, path string, value any) []byte { + t.Helper() + raw, err := os.ReadFile("../bluespike/testdata/01-minimal.program.json") + if err != nil { + t.Fatal(err) + } + var program map[string]any + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + if err = decoder.Decode(&program); err != nil { + t.Fatal(err) + } + data := func(name, kind string, required bool) map[string]any { + return map[string]any{"name": name, "kind": "data", "type": kind, "required": required} + } + exec := func(name string) map[string]any { + return map[string]any{"name": name, "kind": "exec", "type": "core.exec", "required": true} + } + program["opcodes"] = append(program["opcodes"].([]any), map[string]any{"id": "core.output@1", "kind": "pure", "config": []any{data("name", "core.string", true)}, "inputs": []any{data("value", "core.json", true), exec("in")}, "outputs": []any{data("value", "core.json", false), exec("then")}}) + program["nodes"] = append(program["nodes"].([]any), map[string]any{"id": "mark", "opcode": "core.output@1", "config": map[string]any{"name": path}}) + program["exec_edges"] = []any{map[string]any{"from_node": "entry", "from_port": "then", "to_node": "mark", "to_port": "in", "sequence": json.Number("0")}} + program["data_literals"] = []any{map[string]any{"node_id": "mark", "port": "value", "value": value}} + program["state"] = map[string]any{"variables": []any{}, "outputs": []any{}} + delete(program, "program_digest") + // Normalize numeric literals into the canonicalizer's verified JSON model. + raw, _ = json.Marshal(program) + decoder = json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + if err := decoder.Decode(&program); err != nil { + t.Fatal(err) + } + digest, err := canonical.Digest(program) + if err != nil { + t.Fatal(err) + } + program["program_digest"] = digest + raw, err = json.Marshal(program) + if err != nil { + t.Fatal(err) + } + return raw +} + +func TestRealNativeVisual(t *testing.T) { + phase := os.Getenv("ORION_TEST_NATIVE_PHASE") + if phase == "" { + t.Skip("driven by the offline CEF visual proof") + } + address, path := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), os.Getenv("ORION_TEST_LSML_PATH") + source, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var original map[string]any + if err = json.Unmarshal(source, &original); err != nil { + t.Fatal(err) + } + id, version := original["scene_id"].(string), original["scene_version"].(string) + key := GenerationKey(id, version) + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + r, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + p := NewProducer(ctx, r) + defer p.Close() + h := NewHub(p, slog.New(slog.NewTextHandler(io.Discard, nil))) + if phase == "seed" || phase == "restore" { + h.Lane("program").MirrorForLSML(id, version, source) + h.Lane("program").SetActive(id) + h.MirrorForLSML(id, version, "on-air", source) + } else { + c, e := native.Dial(ctx, address, "", nil) + if e != nil { + t.Fatal(e) + } + raw, e := c.Exchange(ctx, map[string]any{"kind": "state.read", "target": "solar/generations"}) + c.Close() + if e != nil { + t.Fatal(e) + } + var snapshot struct{ State map[string]map[string]any } + if e = json.Unmarshal(raw, &snapshot); e != nil { + t.Fatal(e) + } + doc := snapshot.State[key] + if doc == nil { + t.Fatal("visual generation was not seeded") + } + if phase == "document" { + doc["layout"].(map[string]any)["children"].([]any)[1].(map[string]any)["background"] = "#203248" + } + switch phase { + case "patch": + raw, _ = json.Marshal(doc) + mirror := h.MirrorForLSML(id, version, "on-air", raw) + host := bluehost.NewHost() + if e = host.Take("cef-blue-instance", id, "sha256:cef-blue-test", outputProgram(t, "__lit.text.text_msxz43eh_1", "Orion + Blue + LSDP natif"), nil, nil, nil); e != nil { + t.Fatal(e) + } + defer func() { + if err := host.Release(bluehost.SlotOnAir, "visual-test-end"); err != nil { + t.Error(err) + } + }() + bridge := bluewire.NewBridge(host, bluehost.SlotOnAir, mirror, id, "sha256:cef-blue-test", "cef-blue-instance", blueproject.TargetProgram, "local-source-only", "cef-native-proof") + if e = bridge.TickOnce(0); e != nil { + t.Fatal(e) + } + case "document": + // Send the complete desired state to the real native state route. + // Rust computes the structural diff, preserving unrelated generations. + p.Replace("solar/generations", snapshot.State) + default: + t.Fatal("unknown visual phase") + } + } + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + c, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer c.Close() + raw, err := c.Exchange(ctx, map[string]any{"kind": "state.read", "target": "solar/generations"}) + if err != nil { + t.Fatal(err) + } + var snapshot struct{ State map[string]map[string]any } + if err = json.Unmarshal(raw, &snapshot); err != nil { + t.Fatal(err) + } + doc := snapshot.State[key] + if doc == nil { + t.Fatal("generation absent after native ACK") + } + if phase == "patch" && (doc["defaults"].(map[string]any)["__lit.text.text_msxz43eh_1"] != "Orion + Blue + LSDP natif" || doc["x-orion"].(map[string]any)["runtime_instance_id"] != "cef-blue-instance") { + t.Fatal("actual Blue output or provenance absent after native ACK") + } + if phase == "document" && doc["layout"].(map[string]any)["children"].([]any)[1].(map[string]any)["background"] != "#203248" { + t.Fatal("full-document native diff absent after ACK") + } + untouched, err := os.ReadFile(path) + if err != nil || !bytes.Equal(untouched, source) { + t.Fatal("original LSML was modified") + } + t.Logf("native visual phase=%s generation=%s; original LSML unchanged", phase, key) +} diff --git a/internal/lsdpreception/control.go b/internal/lsdpreception/control.go new file mode 100644 index 00000000..2febdd64 --- /dev/null +++ b/internal/lsdpreception/control.go @@ -0,0 +1,246 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "errors" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" + "time" +) + +func (r *Reception) Read(ctx context.Context, target string) (any, error) { + client, err := native.Dial(ctx, r.Address, "", nil) + if err != nil { + return nil, err + } + defer client.Close() + raw, err := client.Exchange(ctx, map[string]any{"kind": "state.read", "target": target}) + if err != nil { + return nil, err + } + var snapshot struct { + Target string + State any + } + err = json.Unmarshal(raw, &snapshot) + if snapshot.Target != target { + return nil, errors.New("NATIVE_CONTROL_TARGET_INVALID") + } + return snapshot.State, err +} + +// WriteLeaf preserves every other writer's fields and rebases only after a +// proven BASE_MISMATCH rejection. The operation is an absolute assignment. +func (r *Reception) WriteLeaf(ctx context.Context, target, path string, value any) error { + return r.WriteLeaves(ctx, target, []any{map[string]any{"op": "add", "path": path, "value": value}}) +} + +// WriteLeaves applies related absolute observations in one native transaction. +func (r *Reception) WriteLeaves(ctx context.Context, target string, operations []any) error { + return r.WriteLeavesFromState(ctx, target, func(any) ([]any, error) { return operations, nil }) +} + +// WriteLeavesFromState rebases state-dependent operations only after a proven +// BASE_MISMATCH refusal. The builder is pure and may be called again. +func (r *Reception) WriteLeavesFromState(ctx context.Context, target string, build func(any) ([]any, error)) error { + for attempt := 0; attempt < 8; attempt++ { + before, err := r.Read(ctx, target) + if err != nil { + return err + } + operations, err := build(before) + if err != nil { + return err + } + client, err := native.Dial(ctx, r.Address, "", nil) + if err != nil { + return err + } + id, err := native.NewID() + if err != nil { + client.Close() + return err + } + raw, err := client.Exchange(ctx, map[string]any{"format": "lsdp.apply/1", "id": id, "target": target, "beforeHash": treeHash(before), "operations": operations, "require": "applied"}) + client.Close() + if err == nil { + var receipt struct{ Level, Target, TransactionID string } + if json.Unmarshal(raw, &receipt) != nil || receipt.Level != "applied" || receipt.Target != target || receipt.TransactionID != id { + return errors.New("NATIVE_CONTROL_NOT_APPLIED") + } + return nil + } + var wireError *native.WireError + if !errors.As(err, &wireError) || wireError.Code != "BASE_MISMATCH" { + return err + } + } + return errors.New("NATIVE_CONTROL_BUSY") +} + +// Watch reconnects with a fresh authoritative snapshot. No polling of a large +// state document and no unbounded event queue: callback is synchronous. +func (r *Reception) Watch(ctx context.Context, target string, onState func(any), onError func(error)) { + for ctx.Err() == nil { + err := r.watchOnce(ctx, target, onState) + if ctx.Err() != nil { + return + } + onError(err) + timer := time.NewTimer(250 * time.Millisecond) + select { + case <-ctx.Done(): + timer.Stop() + return + case <-timer.C: + } + } +} +func (r *Reception) watchOnce(ctx context.Context, target string, onState func(any)) error { + client, err := native.Dial(ctx, r.Address, "", nil) + if err != nil { + return err + } + defer client.Close() + raw, err := client.Exchange(ctx, map[string]any{"kind": "state.read", "target": target}) + if err != nil { + return err + } + var snapshot struct{ State any } + if err = json.Unmarshal(raw, &snapshot); err != nil { + return err + } + state := snapshot.State + hash := treeHash(state) + onState(state) + if err = client.Subscribe(ctx, target, hash); err != nil { + return err + } + var sequence uint64 + for ctx.Err() == nil { + err = client.Next(ctx, target, func(raw json.RawMessage) error { + var event struct { + Kind string + Sequence uint64 + Mutation struct { + Format, ID, Target, BeforeHash, AfterHash string + Operations []map[string]any + } + Receipt struct{ Target, TransactionID, StateHash string } + } + if err := json.Unmarshal(raw, &event); err != nil { + return err + } + application := event.Kind == "applied_change" + if !application && event.Kind != "change" || event.Sequence <= sequence || event.Mutation.Target != target || event.Receipt.Target != target || event.Receipt.TransactionID != event.Mutation.ID || event.Mutation.BeforeHash != hash { + return errors.New("NATIVE_CONTROL_RESYNC_REQUIRED") + } + format := "lsdp.tree/1" + if application { + format = "lsdp.apply/1" + } + if event.Mutation.Format != format { + return errors.New("NATIVE_CONTROL_FORMAT_INVALID") + } + next, err := applyObjectOperations(state, event.Mutation.Operations) + if err != nil { + return err + } + nextHash := treeHash(next) + if !application && (nextHash != event.Mutation.AfterHash || nextHash != event.Receipt.StateHash) { + return errors.New("NATIVE_CONTROL_INTEGRITY_FAILED") + } + state = next + hash = nextHash + sequence = event.Sequence + onState(state) + return nil + }) + if err != nil { + return err + } + } + return ctx.Err() +} + +func (r *Reception) Replace(ctx context.Context, target string, document any) error { + // Full assignments are idempotent. Retry their identical identity/payload + // across a receiver restart, bounded by the caller's deadline. + id, err := native.NewID() + if err != nil { + return err + } + completed := false + for ctx.Err() == nil { + completed, err = r.replaceOnce(ctx, id, target, document, completed) + if err == nil { + return nil + } + var wireError *native.WireError + if errors.As(err, &wireError) { + return err + } + timer := time.NewTimer(250 * time.Millisecond) + select { + case <-ctx.Done(): + timer.Stop() + return ctx.Err() + case <-timer.C: + } + } + return ctx.Err() +} +func (r *Reception) replaceOnce(ctx context.Context, id, target string, document any, completed bool) (bool, error) { + client, err := native.Dial(ctx, r.Address, "", nil) + if err != nil { + return completed, err + } + defer client.Close() + kind := "orion.state/1" + if isSolarSceneTarget(target) { + kind = "solar.lsml/1" + } + if !completed { + raw, err := client.SendPort(ctx, id, target, kind, document) + if err != nil { + return false, err + } + if err = completedRoute(raw, id); err != nil { + return false, err + } + completed = true + } + // After the route ACK is known, a lost release receipt can retry only the + // release. Replaying a forgotten full assignment could overwrite a newer edit. + return completed, forgetCompletedRoute(func(request any) (json.RawMessage, error) { + return client.Exchange(ctx, request) + }, id) +} + +func completedRoute(raw json.RawMessage, id string) error { + if err := native.Completed(raw); err != nil { + return err + } + var receipt struct { + ID string `json:"id"` + } + if json.Unmarshal(raw, &receipt) != nil || receipt.ID != id { + return errors.New("NATIVE_ROUTE_RECEIPT_ID_INVALID") + } + return nil +} + +// Routing retains full payload/packet memory for replay until its owner +// explicitly releases the record. Only call after this exact route completed. +func forgetCompletedRoute(exchange func(any) (json.RawMessage, error), id string) error { + raw, err := exchange(map[string]any{"kind": "route.forget", "id": id, "force": false}) + if err != nil { + return err + } + var receipt struct{ ID, Status string } + if json.Unmarshal(raw, &receipt) != nil || + (receipt.Status != "unknown" && (receipt.Status != "forgotten" || receipt.ID != id)) { + return errors.New("NATIVE_ROUTE_RELEASE_NOT_ACKNOWLEDGED") + } + return nil +} diff --git a/internal/lsdpreception/idle_recovery_native_test.go b/internal/lsdpreception/idle_recovery_native_test.go new file mode 100644 index 00000000..a8dd86fb --- /dev/null +++ b/internal/lsdpreception/idle_recovery_native_test.go @@ -0,0 +1,66 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "os" + "sync" + "testing" + "time" + + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +// The receiver remains alive: only this test's producer socket is closed. +// This distinguishes recovery backoff from cold state/hash processing. +func TestIdleSocketRecoveryNative(t *testing.T) { + address := os.Getenv("ORION_TEST_PRIVATE_LANE_ADDRESS") + if address == "" { + t.Skip("requires disposable native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + r, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + p := NewProducer(ctx, r) + defer p.Close() + var mu sync.Mutex + var socket *native.Client + p.dial = func(ctx context.Context) (producerClient, error) { + c, err := native.Dial(ctx, address, "", nil) + mu.Lock() + socket = c + mu.Unlock() + return c, err + } + p.Replace("solar/lane-b", map[string]any{"lsml": "1.2", "scene_id": "idle-recovery", "scene_version": "test", "layout": map[string]any{"kind": "shape"}, "defaults": map[string]any{"opacity": 1}}) + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + mu.Lock() + err = socket.Close() + mu.Unlock() + if err != nil { + t.Fatal(err) + } + for i := 0; i < 2; i++ { + start := time.Now() + p.Apply("solar/lane-b", []map[string]any{{"op": "add", "path": "/defaults/opacity", "value": float64(i+1) / 10}}) + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + elapsed := time.Since(start) + state, err := r.Read(ctx, "solar/lane-b") + if err != nil || state.(map[string]any)["defaults"].(map[string]any)["opacity"] != float64(i+1)/10 { + t.Fatal("mutation missing after recovered ACK", err) + } + status := p.Status() + if status.Reconnects != 1 || status.Terminal || status.Recovering { + t.Fatal(status) + } + proof, _ := json.Marshal(map[string]any{"step": i, "producer_ack_ms": float64(elapsed.Microseconds()) / 1000, "configured_backoff_ms": p.retryDelay.Milliseconds(), "status": status, "native_value_verified": true}) + t.Log("CLOSED_SOCKET_TIMING " + string(proof)) + } +} diff --git a/internal/lsdpreception/idle_recovery_test.go b/internal/lsdpreception/idle_recovery_test.go new file mode 100644 index 00000000..69d7e1ab --- /dev/null +++ b/internal/lsdpreception/idle_recovery_test.go @@ -0,0 +1,85 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "io" + "testing" + "time" + + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +func TestFailedDialDoesNotRetainTypedNilClient(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + p := NewProducer(ctx, &Reception{Address: "127.0.0.1:1"}) + defer p.Close() + cancel() + // The production adapter returns a typed nil through producerClient on + // a cancelled real native Dial. No network mutation is performed. + p.dial = func(ctx context.Context) (producerClient, error) { + return native.Dial(ctx, p.reception.Address, "", nil) + } + var client producerClient + _, _, err := p.exchange(&client, map[string]any{"kind": "capabilities"}) + if err == nil || client != nil { + t.Fatal("failed Dial retained an unusable client", err) + } +} + +func TestRecoveryRetriesClosedConnectionImmediately(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + p := NewProducer(ctx, &Reception{}) + defer p.Close() + p.retryDelay = time.Hour // waiting for backoff would outlive this test + request := map[string]any{"id": "same-id", "format": "lsdp.apply/1", "operations": []any{map[string]any{"op": "add", "path": "/items/0", "value": 1}}} + wanted, _ := json.Marshal(request) + var first []byte + client := producerClient(recoveryClient{exchange: func(request any) (json.RawMessage, error) { first, _ = json.Marshal(request); return nil, io.EOF }}) + p.dial = func(context.Context) (producerClient, error) { + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + raw, _ := json.Marshal(request) + if string(raw) != string(first) || string(raw) != string(wanted) { + t.Error("recovery changed transaction identity/payload") + } + return json.RawMessage(`{"level":"applied"}`), nil + }}, nil + } + _, replayed, err := p.exchange(&client, request) + if err != nil || !replayed || p.Status().Reconnects != 1 || p.Status().Recovering { + t.Fatal("healthy replacement connection waited for backoff", err, p.Status()) + } +} + +func TestImmediateRecoveryStillBacksOffAfterFailedReconnect(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + p := NewProducer(ctx, &Reception{}) + defer p.Close() + p.retryDelay = time.Hour + attempts := make(chan struct{}, 4) + p.dial = func(context.Context) (producerClient, error) { attempts <- struct{}{}; return nil, io.EOF } + client := producerClient(recoveryClient{exchange: func(any) (json.RawMessage, error) { return nil, io.EOF }}) + done := make(chan error, 1) + go func() { _, _, err := p.exchange(&client, map[string]any{"id": "same-id"}); done <- err }() + select { + case <-attempts: + case <-ctx.Done(): + t.Fatal("first reconnect was not immediate") + } + select { + case <-attempts: + t.Fatal("failed reconnect spun without backoff") + case <-time.After(30 * time.Millisecond): + } + cancel() + select { + case err := <-done: + if err == nil { + t.Fatal("cancelled recovery succeeded") + } + case <-time.After(time.Second): + t.Fatal("recovery did not stop on shutdown") + } +} diff --git a/internal/lsdpreception/lane_roles.go b/internal/lsdpreception/lane_roles.go new file mode 100644 index 00000000..c2ac8589 --- /dev/null +++ b/internal/lsdpreception/lane_roles.go @@ -0,0 +1,191 @@ +package lsdpreception + +import ( + "encoding/json" + "strings" +) + +type RoleMap struct { + OnAir string `json:"on_air"` + Preview string `json:"preview"` +} +type LaneRevisions struct { + Program uint64 `json:"program"` + Preview uint64 `json:"preview"` + RoleMap uint64 `json:"role_map"` +} +type LaneCommit struct { + Schema string `json:"schema"` + RuntimeInstanceID string `json:"runtime_instance_id"` + PrepareCommandID string `json:"prepare_command_id"` + TakeCommandID string `json:"take_command_id"` + IntentID string `json:"intent_id"` + FrameID uint64 `json:"frame_id"` + PtsNs uint64 `json:"pts_ns"` + ServerSeq uint64 `json:"server_seq"` + PreviousRoleMap RoleMap `json:"previous_role_map"` + RoleMap RoleMap `json:"role_map"` + PreviousRevisions LaneRevisions `json:"previous_revisions"` + Revisions LaneRevisions `json:"revisions"` + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` +} +type LaneCommitReceipt struct { + LaneCommit + Status string `json:"status"` + Reason string `json:"reason,omitempty"` + Targets map[string]string `json:"targets,omitempty"` + Replayed bool `json:"replayed,omitempty"` + Sources map[string]LaneSource `json:"sources,omitempty"` +} + +type LaneSource struct { + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + ArtifactSet string `json:"artifact_set"` +} + +func (c LaneCommit) Valid() bool { + for _, s := range []string{c.RuntimeInstanceID, c.PrepareCommandID, c.TakeCommandID, c.IntentID, c.SceneID, c.SceneVersion} { + if s == "" || len(s) > 256 { + return false + } + } + validMap := func(r RoleMap) bool { + return r.OnAir != r.Preview && (r.OnAir == "A" || r.OnAir == "B") && (r.Preview == "A" || r.Preview == "B") + } + return c.Schema == "orion.lane-commit.v1" && c.FrameID > 0 && c.PtsNs > 0 && c.ServerSeq > 0 && validMap(c.RoleMap) && validMap(c.PreviousRoleMap) && + c.RoleMap.OnAir == c.PreviousRoleMap.Preview && c.RoleMap.Preview == c.PreviousRoleMap.OnAir && + c.Revisions.RoleMap == c.PreviousRevisions.RoleMap+1 && c.Revisions.Program == c.PreviousRevisions.Program+1 && c.Revisions.Preview == c.PreviousRevisions.Preview +} + +// EnablePhysicalLanes is a boot-only operation, before any Lane is acquired. +func (h *Hub) EnablePhysicalLanes() { + h.mu.Lock() + defer h.mu.Unlock() + if len(h.lanes) != 0 { + panic("physical lanes must be enabled before acquisition") + } + h.physical = true + h.roles = RoleMap{OnAir: "A", Preview: "B"} +} +func physicalTarget(id string) string { + if id == "A" { + return "solar/lane-a" + } + return "solar/lane-b" +} +func (l *Lane) Target() string { l.hub.mu.Lock(); defer l.hub.mu.Unlock(); return l.target } + +func (h *Hub) ReplayCommit(c LaneCommit) (LaneCommitReceipt, bool) { + h.mu.Lock() + defer h.mu.Unlock() + return h.replayCommit(c) +} +func (h *Hub) replayCommit(c LaneCommit) (LaneCommitReceipt, bool) { + cached, ok := h.commitCache[c.RuntimeInstanceID+"\x00"+c.TakeCommandID] + if !ok { + return LaneCommitReceipt{}, false + } + b1, _ := json.Marshal(c) + b2, _ := json.Marshal(cached.LaneCommit) + if string(b1) != string(b2) { + return LaneCommitReceipt{LaneCommit: c, Status: "refused", Reason: "LANE_COMMIT_CONFLICT"}, true + } + r := cached + r.Replayed = true + return r, true +} + +// CommitRoles changes authority only. The same Mirror objects and documents stay +// on the same physical resource. before commits paused host actors and must not +// publish LSDP or acquire a Lane lock. A replay never invokes it again. +func (h *Hub) CommitRoles(c LaneCommit, before func() error) LaneCommitReceipt { + h.mu.Lock() + defer h.mu.Unlock() + r := LaneCommitReceipt{LaneCommit: c, Status: "refused"} + refuse := func(reason string) LaneCommitReceipt { r.Reason = reason; return r } + if !h.physical || !c.Valid() { + return refuse("LANE_COMMIT_INVALID") + } + if replay, ok := h.replayCommit(c); ok { + return replay + } + if h.lastCommit != nil { + if c.RuntimeInstanceID != h.lastCommit.RuntimeInstanceID { + return refuse("LANE_COMMIT_FOREIGN_RUNTIME") + } + if c.ServerSeq <= h.lastCommit.ServerSeq || c.FrameID <= h.lastCommit.FrameID || c.PtsNs <= h.lastCommit.PtsNs || c.PreviousRevisions.RoleMap != h.lastCommit.Revisions.RoleMap || c.PreviousRevisions.Program != h.lastCommit.Revisions.Program || c.PreviousRevisions.Preview < h.lastCommit.Revisions.Preview { + return refuse("LANE_COMMIT_STALE") + } + } + if c.PreviousRoleMap != h.roles { + return refuse("LANE_COMMIT_ROLE_MISMATCH") + } + p, v := h.lanes["program"], h.lanes["preview"] + if p == nil || v == nil || p.transitioning || v.transitioning { + return refuse("LANE_COMMIT_BUSY") + } + if v.active == nil || v.active.sceneID != c.SceneID || v.active.document["scene_version"] != c.SceneVersion { + return refuse("LANE_COMMIT_PREVIEW_MISMATCH") + } + if before != nil { + if err := before(); err != nil { + return refuse(err.Error()) + } + } + p.target, v.target = v.target, p.target + p.active, v.active = v.active, p.active + p.scenes, v.scenes = v.scenes, p.scenes + for _, l := range []*Lane{p, v} { + for _, m := range l.scenes { + m.lane = l + } + // Camera/viewer authority follows the logical role. Absolute leaves + // update the retained document; no scene assignment or source acquisition. + if l.active != nil { + ops := []map[string]any{} + defaults := l.active.document["defaults"].(map[string]any) + for key := range defaults { + if strings.HasPrefix(key, "__cam.") { + if _, ok := l.reserved[key]; !ok { + defaults[key] = nil + ops = append(ops, map[string]any{"op": "add", "path": "/defaults/" + pointer(key), "value": nil}) + } + } + } + for key, value := range l.reserved { + l.active.document["defaults"].(map[string]any)[key] = value + ops = append(ops, map[string]any{"op": "add", "path": "/defaults/" + pointer(key), "value": value}) + } + if len(ops) > 0 { + h.producer.Apply(l.target, ops) + } + } + } + h.roles = c.RoleMap + r.Status = "committed" + r.Targets = map[string]string{"program": p.target, "preview": v.target} + r.Sources = map[string]LaneSource{} + for _, l := range []*Lane{p, v} { + if l.active != nil { + r.Sources[l.role] = LaneSource{SceneID: l.active.sceneID, SceneVersion: l.active.document["scene_version"].(string), ArtifactSet: l.active.version} + } + } + h.lastCommit = &r + if h.commitCache == nil { + h.commitCache = map[string]LaneCommitReceipt{} + } + key := c.RuntimeInstanceID + "\x00" + c.TakeCommandID + h.commitCache[key] = r + h.commitOrder = append(h.commitOrder, key) + if len(h.commitOrder) > 64 { + delete(h.commitCache, h.commitOrder[0]) + h.commitOrder = h.commitOrder[1:] + } + return r +} + +func isSolarSceneTarget(target string) bool { + return target == "solar/program" || target == "solar/preview" || target == "solar/lane-a" || target == "solar/lane-b" +} diff --git a/internal/lsdpreception/lane_roles_test.go b/internal/lsdpreception/lane_roles_test.go new file mode 100644 index 00000000..7ce4b83e --- /dev/null +++ b/internal/lsdpreception/lane_roles_test.go @@ -0,0 +1,114 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/protocol" + "log/slog" + "testing" +) + +func roleFixture(t *testing.T) (*Hub, *Producer, *Mirror, *Mirror) { + t.Helper() + p := &Producer{ctx: context.Background(), queue: make(chan delivery, 64)} + h := NewHub(p, slog.Default()) + h.EnablePhysicalLanes() + source := func(id string) []byte { + return []byte(`{"lsml":"1.2","scene_id":"` + id + `","scene_version":"source-v1","defaults":{"score":0},"layout":{"type":"text","text":{"$bind":"score"}}}`) + } + a := h.Lane("program").MirrorForLSML("scene-a", "artifact-a", source("scene-a")).(*Mirror) + b := h.Lane("preview").MirrorForLSML("scene-b", "artifact-b", source("scene-b")).(*Mirror) + h.Lane("program").SetActive("scene-a") + h.Lane("preview").SetActive("scene-b") + for len(p.queue) > 0 { + <-p.queue + } + return h, p, a, b +} +func roleCommit() LaneCommit { + return LaneCommit{Schema: "orion.lane-commit.v1", RuntimeInstanceID: "native-runtime", PrepareCommandID: "prepare", TakeCommandID: "take", IntentID: "intent", FrameID: 12, PtsNs: 1234, ServerSeq: 4, PreviousRoleMap: RoleMap{"A", "B"}, RoleMap: RoleMap{"B", "A"}, PreviousRevisions: LaneRevisions{0, 1, 0}, Revisions: LaneRevisions{1, 1, 1}, SceneID: "scene-b", SceneVersion: "source-v1"} +} +func TestPhysicalRoleCommitKeepsMirrorsDocumentsAndWritesNewPreviewToOutgoingLane(t *testing.T) { + h, p, a, b := roleFixture(t) + c := roleCommit() + called := 0 + if r := h.CommitRoles(c, func() error { called++; return nil }); r.Status != "committed" { + t.Fatal(r) + } + if len(p.queue) != 0 || h.Lane("program").active != b || h.Lane("preview").active != a || b.lane.target != "solar/lane-b" { + t.Fatal("commit reassigned a document or replaced mirror") + } + if r := h.CommitRoles(c, func() error { called++; return nil }); r.Status != "committed" || !r.Replayed || called != 1 { + t.Fatal("replay changed authority", r) + } + // The incoming new Preview cannot drop the retained Program writer. + h.Lane("preview").Drop("scene-a") + <-p.queue + b.surface = func(string) bool { return true } + b.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: "score", Value: json.RawMessage(`42`)}}}) + job := <-p.queue + if job.target != "solar/lane-b" || job.document != nil { + t.Fatal("retained Program crossed to Preview", job) + } + if b.document["defaults"].(map[string]any)["score"] != float64(42) { + t.Fatal("Program delta lost") + } +} +func TestPhysicalRoleCommitFailClosed(t *testing.T) { + for _, tc := range []struct { + name string + mutate func(*Hub, *LaneCommit) + reason string + }{ + {"invalid", func(_ *Hub, c *LaneCommit) { c.PtsNs = 0 }, "LANE_COMMIT_INVALID"}, + {"busy", func(h *Hub, _ *LaneCommit) { h.Lane("preview").transitioning = true }, "LANE_COMMIT_BUSY"}, + {"identity", func(_ *Hub, c *LaneCommit) { c.SceneVersion = "wrong" }, "LANE_COMMIT_PREVIEW_MISMATCH"}, + {"roles", func(_ *Hub, c *LaneCommit) { c.PreviousRoleMap = RoleMap{"B", "A"}; c.RoleMap = RoleMap{"A", "B"} }, "LANE_COMMIT_ROLE_MISMATCH"}, + } { + t.Run(tc.name, func(t *testing.T) { + h, p, a, b := roleFixture(t) + c := roleCommit() + tc.mutate(h, &c) + r := h.CommitRoles(c, nil) + if r.Reason != tc.reason || len(p.queue) != 0 || h.Lane("program").active != a || h.Lane("preview").active != b { + t.Fatal(r) + } + }) + } + h, p, _, _ := roleFixture(t) + c := roleCommit() + h.CommitRoles(c, nil) + c.SceneID = "conflict" + if r := h.CommitRoles(c, nil); r.Reason != "LANE_COMMIT_CONFLICT" { + t.Fatal(r) + } + c = roleCommit() + c.TakeCommandID = "next" + c.RuntimeInstanceID = "foreign" + if r := h.CommitRoles(c, nil); r.Reason != "LANE_COMMIT_FOREIGN_RUNTIME" { + t.Fatal(r) + } + c = roleCommit() + c.TakeCommandID = "next" + if r := h.CommitRoles(c, nil); r.Reason != "LANE_COMMIT_STALE" || len(p.queue) != 0 { + t.Fatal(r) + } +} +func TestPhysicalRoleCommitRetargetsCameraAuthorityByLogicalRole(t *testing.T) { + h, p, _, b := roleFixture(t) + h.Lane("program").EmitViewerPayload("program-viewer") + h.Lane("preview").EmitViewerPayload("preview-viewer") + for len(p.queue) > 0 { + <-p.queue + } + h.CommitRoles(roleCommit(), nil) + if b.document["defaults"].(map[string]any)["__cam.viewer"] != "program-viewer" { + t.Fatal("Preview retained Program credentials") + } + for len(p.queue) > 0 { + job := <-p.queue + if job.document != nil { + t.Fatal("camera authority reloaded document") + } + } +} diff --git a/internal/lsdpreception/mirror.go b/internal/lsdpreception/mirror.go new file mode 100644 index 00000000..a04e5e6f --- /dev/null +++ b/internal/lsdpreception/mirror.go @@ -0,0 +1,371 @@ +package lsdpreception + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "log/slog" + "strings" + "sync" + "time" + + "github.com/ZabLaboratory/Orion/internal/compiler" + "github.com/ZabLaboratory/Orion/internal/lsdp" + "github.com/ZabLaboratory/Orion/internal/protocol" + "github.com/ZabLaboratory/Orion/internal/runtime" +) + +// Hub owns logical lanes/generations, never a native process or WS server. +type Hub struct { + mu sync.Mutex + producer *Producer + logger *slog.Logger + generations map[string]*Mirror + clock uint64 + lanes map[string]*Lane + physical bool + roles RoleMap + lastCommit *LaneCommitReceipt + commitCache map[string]LaneCommitReceipt + commitOrder []string + releases map[string]ProgramReleaseReceipt + releaseOrder []string +} +type Lane struct { + hub *Hub + target string + role string + active *Mirror + scenes map[string]*Mirror + reserved map[string]any + viewer *lsdp.ViewerCredentials + transitioning bool +} +type Mirror struct { + lane *Lane + hub *Hub + key, owner, sceneID, version string + document map[string]any + surface func(string) bool + touched uint64 + session bool +} + +func GenerationKey(sceneID, version string) string { + sum := sha256.Sum256([]byte(sceneID + "\x00" + version)) + return hex.EncodeToString(sum[:]) +} +func NewHub(p *Producer, logger *slog.Logger) *Hub { + return &Hub{producer: p, logger: logger, generations: map[string]*Mirror{}, lanes: map[string]*Lane{}} +} +func (h *Hub) Lane(name string) *Lane { + h.mu.Lock() + defer h.mu.Unlock() + if l := h.lanes[name]; l != nil { + return l + } + target := "solar/" + name + if h.physical && name == "program" { + target = physicalTarget(h.roles.OnAir) + } + if h.physical && name == "preview" { + target = physicalTarget(h.roles.Preview) + } + l := &Lane{hub: h, role: name, target: target, scenes: map[string]*Mirror{}, reserved: map[string]any{}} + h.lanes[name] = l + return l +} +func sourceDocument(sceneID, version string, raw []byte) (map[string]any, error) { + var document map[string]any + if len(raw) == 0 { + return nil, errors.New("NATIVE_LSML_SOURCE_REQUIRED") + } + if err := json.Unmarshal(raw, &document); err != nil { + return nil, err + } + _, layoutObject := document["layout"].(map[string]any) + if sceneID == "" || version == "" || document["scene_id"] != sceneID || !layoutObject { + return nil, errors.New("NATIVE_LSML_IDENTITY_INVALID") + } + // The native document must remain fetchable by Canvas's LSML address. + // `version` identifies the admitted artifact set, not this source address. + sourceVersion, ok := document["scene_version"].(string) + if !ok || sourceVersion == "" { + return nil, errors.New("NATIVE_LSML_IDENTITY_INVALID") + } + document["x-orion-artifact-set"] = version + if document["defaults"] == nil { + document["defaults"] = map[string]any{} + } + if _, ok := document["defaults"].(map[string]any); !ok { + return nil, errors.New("NATIVE_LSML_DEFAULTS_INVALID") + } + return document, nil +} +func (l *Lane) MirrorForLSML(sceneID, version string, raw []byte) runtime.SceneMirror { + l.hub.mu.Lock() + defer l.hub.mu.Unlock() + document, err := sourceDocument(sceneID, version, raw) + if err != nil { + l.hub.producer.fail(err) + return nil + } + m := &Mirror{lane: l, hub: l.hub, sceneID: sceneID, version: version, document: document, surface: lsdp.RenderSurface(sceneID, raw, l.hub.logger)} + l.scenes[sceneID] = m + return m +} +func (l *Lane) MirrorFor(sceneID, version string, bundle *compiler.RenderBundle) runtime.SceneMirror { + if bundle == nil { + l.hub.producer.fail(errors.New("NATIVE_LSML_SOURCE_REQUIRED")) + return nil + } + return l.MirrorForLSML(sceneID, version, bundle.SourceLSML) +} +func (l *Lane) SetActive(sceneID string) { + l.hub.mu.Lock() + defer l.hub.mu.Unlock() + m := l.scenes[sceneID] + if m == nil { + return + } + l.active = m + defaults := m.document["defaults"].(map[string]any) + for key, value := range l.reserved { + defaults[key] = value + } + l.hub.producer.Replace(l.target, m.document) +} +func (l *Lane) Drop(sceneID string) { + l.hub.mu.Lock() + defer l.hub.mu.Unlock() + l.dropLocked(sceneID) +} +func (l *Lane) dropLocked(sceneID string) { + m := l.scenes[sceneID] + delete(l.scenes, sceneID) + if l.active == m && m != nil { + l.active = nil + l.hub.producer.Replace(l.target, nil) + } +} +func (l *Lane) EmitRoster(entries []runtime.RosterEntry) { + l.hub.producer.Apply("orion/state", []map[string]any{{"op": "add", "path": "/roster_" + pointer(l.target), "value": entries}}) +} +func (h *Hub) MirrorForLSML(sceneID, version, owner string, raw []byte) runtime.SceneMirror { + h.mu.Lock() + defer h.mu.Unlock() + key := GenerationKey(sceneID, version) + document, err := sourceDocument(sceneID, version, raw) + if err != nil { + h.producer.fail(err) + return nil + } + h.clock++ + m := &Mirror{hub: h, key: key, owner: owner, sceneID: sceneID, version: version, document: document, surface: lsdp.RenderSurface(sceneID, raw, h.logger), touched: h.clock} + for _, lane := range h.lanes { + if ownerMatchesLane(owner, "solar/"+lane.role) { + for key, value := range lane.reserved { + document["defaults"].(map[string]any)[key] = value + } + } + } + // A new writer lease invalidates the previous mirror, including the same owner. + h.generations[key] = m + // Bounded retention: never evict either active Program/Preview generation. + for len(h.generations) > 8 { + oldest := "" + clock := ^uint64(0) + for k, candidate := range h.generations { + pinned := k == key + for _, lane := range h.lanes { + if lane.active != nil && GenerationKey(lane.active.sceneID, lane.active.version) == k { + pinned = true + } + } + if !pinned && candidate.touched < clock { + oldest = k + clock = candidate.touched + } + } + if oldest == "" { + break + } + delete(h.generations, oldest) + h.producer.Apply("solar/generations", []map[string]any{{"op": "remove", "path": "/" + oldest}}) + } + h.producer.Apply("solar/generations", []map[string]any{{"op": "add", "path": "/" + key, "value": document}}) + return m +} +func (h *Hub) SetActive(_, _ string) {} // generation identity never retargets + +func (m *Mirror) Forward(message runtime.SubscriberMsg) { + h := m.hub + h.mu.Lock() + defer h.mu.Unlock() + if m.document == nil || (m.lane != nil && m.lane.transitioning) { + return + } + if m.lane != nil && m.lane.scenes[m.sceneID] != m { + return + } + if m.lane == nil && !m.session && h.generations[m.key] != m { + return + } + defaults := m.document["defaults"].(map[string]any) + operations := []map[string]any{} + appendValue := func(path string, raw json.RawMessage) { + if !m.surface(path) { + return + } + var value any + if json.Unmarshal(raw, &value) != nil { + return + } + defaults[path] = value + operations = append(operations, map[string]any{"op": "add", "path": "/defaults/" + pointer(path), "value": value}) + } + switch v := message.(type) { + case *protocol.Snapshot: + for key, value := range v.State { + appendValue(key, value) + } + case *protocol.Delta: + for _, patch := range v.Patches { + appendValue(patch.Path, patch.Value) + } + if len(operations) > 0 && v.RuntimeInstanceID != "" { + metadata := map[string]any{"schema_version": v.SchemaVersion, "scene_digest": v.SceneDigest, "runtime_instance_id": v.RuntimeInstanceID, "target": v.Target, "render_revision": v.RenderRevision, "correlation_id": v.CorrelationID, "cause": v.Cause} + m.document["x-orion"] = metadata + operations = append(operations, map[string]any{"op": "add", "path": "/x-orion", "value": metadata}) + } + default: + return + } + if m.lane != nil { + if m.lane.active == m { + h.producer.Apply(m.lane.target, operations) + } + } else { + target := "solar/generations" + if m.session { + target = "solar/sessions" + } + scoped := make([]map[string]any, 0, len(operations)) + for _, operation := range operations { + scopedOperation := map[string]any{} + for k, v := range operation { + scopedOperation[k] = v + } + scopedOperation["path"] = "/" + pointer(m.key) + operation["path"].(string) + scoped = append(scoped, scopedOperation) + } + h.producer.Apply(target, scoped) + } +} +func (l *Lane) EmitSlotAssignment(ref, label string) { + if ref != "" { + l.setReserved("__cam.slots."+ref, label) + } +} +func (l *Lane) EmitSlotCleared(ref string) { + if ref != "" { + l.setReserved("__cam.slots."+ref, nil) + } +} +func (l *Lane) setReserved(key string, value any) { + h := l.hub + h.mu.Lock() + defer h.mu.Unlock() + l.reserved[key] = value + if l.active != nil && !l.transitioning { + l.active.document["defaults"].(map[string]any)[key] = value + h.producer.Apply(l.target, []map[string]any{{"op": "add", "path": "/defaults/" + pointer(key), "value": value}}) + } + for k, m := range h.generations { + if ownerMatchesLane(m.owner, "solar/"+l.role) { + m.document["defaults"].(map[string]any)[key] = value + h.producer.Apply("solar/generations", []map[string]any{{"op": "add", "path": "/" + k + "/defaults/" + pointer(key), "value": value}}) + } + } + if l.viewer != nil && key != "__cam.viewer" { + peers := []string{} + for k, v := range l.reserved { + if strings.HasPrefix(k, "__cam.slots.") { + if label, ok := v.(string); ok && label != "" { + peers = append(peers, label) + } + } + } + l.viewer.SetPeers(peers) + } +} +func (l *Lane) EmitViewerPayload(js string) { l.setReserved("__cam.viewer", js) } +func (l *Lane) EnableViewerCreds(ctx context.Context, fetch lsdp.CredsFetcher, refresh time.Duration) { + l.viewer = lsdp.NewViewerCredentials(ctx, fetch, refresh, l.hub.logger, l) +} +func ownerMatchesLane(owner, target string) bool { + // Pulsar's physical Program lanes use explicit owner IDs. Preview is the + // one reserved owner that must never receive Program's camera authority. + return (target == "solar/preview" && owner == "preview") || + (target == "solar/program" && owner != "preview") +} +func (l *Lane) EmitOverlayApp(id string, running, onAir *bool) { + if id == "" { + return + } + ops := []map[string]any{} + if running != nil { + ops = append(ops, map[string]any{"op": "add", "path": "/overlay_running_" + pointer(id), "value": *running}) + } + if onAir != nil { + ops = append(ops, map[string]any{"op": "add", "path": "/overlay_on_air_" + pointer(id), "value": *onAir}) + } + l.hub.producer.Apply("orion/state", ops) +} + +// BeginTransition freezes scene projection while preserving the actual old mirror. +// The control coordinator owns the native presentation during this bounded window. +func (l *Lane) BeginTransition() func(bool) { + h := l.hub + h.mu.Lock() + previous := l.active + previousScenes := map[string]*Mirror{} + for key, value := range l.scenes { + previousScenes[key] = value + } + l.transitioning = true + h.mu.Unlock() + return func(restore bool) { + h.mu.Lock() + defer h.mu.Unlock() + l.transitioning = false + if restore { + l.active = previous + l.scenes = previousScenes + } + if l.active != nil { + for key, value := range l.reserved { + l.active.document["defaults"].(map[string]any)[key] = value + } + h.producer.Replace(l.target, l.active.document) + } else if restore { + h.producer.Replace(l.target, nil) + } + } +} + +func (l *Lane) PrepareSource(sceneID, version string, raw []byte) (map[string]any, error) { + document, err := sourceDocument(sceneID, version, raw) + if err != nil { + return nil, err + } + l.hub.mu.Lock() + defer l.hub.mu.Unlock() + defaults := document["defaults"].(map[string]any) + for key, value := range l.reserved { + defaults[key] = value + } + return document, nil +} diff --git a/internal/lsdpreception/mutation.go b/internal/lsdpreception/mutation.go new file mode 100644 index 00000000..52f5524d --- /dev/null +++ b/internal/lsdpreception/mutation.go @@ -0,0 +1,204 @@ +package lsdpreception + +import ( + "encoding/json" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + + "github.com/ZabLaboratory/Orion/internal/lsdp" +) + +// ApplyLSML changes only this mirror's scene, preserving the attested identity. +// It shares the producer's atomic native transaction and never writes source files. +func (m *Mirror) ApplyLSML(operations []map[string]any) error { + if len(operations) == 0 || len(operations) > 128 { + return errors.New("LSML_MUTATION_LIMIT") + } + for _, operation := range operations { + path, _ := operation["path"].(string) + allowed := false + for _, root := range []string{"/layout", "/defaults", "/animations"} { + if path == root || strings.HasPrefix(path, root+"/") { + allowed = true + } + } + if !allowed || path == "/defaults" || strings.HasPrefix(path, "/defaults/__cam.") { + return errors.New("LSML_MUTATION_PATH_FORBIDDEN") + } + } + h := m.hub + h.mu.Lock() + defer h.mu.Unlock() + if m.lane != nil && m.lane.transitioning { + return errors.New("LSML_SCENE_TRANSITION_IN_PROGRESS") + } + if m.document == nil || (m.lane != nil && m.lane.scenes[m.sceneID] != m) || (m.lane == nil && !m.session && h.generations[m.key] != m) { + return errors.New("LSML_MUTATION_STALE_GENERATION") + } + next, err := applyObjectOperations(m.document, operations) + if err != nil { + return err + } + document := next.(map[string]any) + if _, ok := document["layout"].(map[string]any); !ok { + return errors.New("LSML_MUTATION_LAYOUT_REQUIRED") + } + if _, ok := document["defaults"].(map[string]any); !ok { + return errors.New("LSML_MUTATION_DEFAULTS_REQUIRED") + } + if err := validateAnimationCommands(document); err != nil { + return err + } + data, err := json.Marshal(document) + if err != nil || len(data) > 16<<20 { + return errors.New("LSML_MUTATION_DOCUMENT_LIMIT") + } + m.document = document + m.surface = lsdp.RenderSurface(m.sceneID, data, h.logger) + target := "solar/generations" + if m.lane != nil { + if m.lane.active == m { + h.producer.Apply(m.lane.target, operations) + } + return nil + } + if m.session { + target = "solar/sessions" + } + scoped := make([]map[string]any, 0, len(operations)) + for _, operation := range operations { + scopedOperation := map[string]any{} + for k, v := range operation { + scopedOperation[k] = v + } + scopedOperation["path"] = "/" + pointer(m.key) + operation["path"].(string) + scoped = append(scoped, scopedOperation) + } + h.producer.Apply(target, scoped) + return nil +} + +// Reject an undeclared command before it can poison a subscribed scene. +func validateAnimationCommands(document map[string]any) error { + layout, _ := document["layout"].(map[string]any) + catalogue, _ := document["animations"].(map[string]any) + if catalogue == nil { + catalogue, _ = layout["animations"].(map[string]any) + } + var hasTarget func(any, string) bool + hasTarget = func(value any, target string) bool { + switch node := value.(type) { + case map[string]any: + if node["id"] == target { + return true + } + return hasTarget(node["children"], target) || hasTarget(node["template"], target) + case []any: + for _, child := range node { + if hasTarget(child, target) { + return true + } + } + } + return false + } + defaults, _ := document["defaults"].(map[string]any) + for key, raw := range defaults { + if !strings.HasPrefix(key, "__animation.") { + continue + } + command, _ := raw.(map[string]any) + id, _ := command["animation_id"].(string) + asset, _ := catalogue[id].(map[string]any) + target, _ := asset["target"].(string) + if id == "" || target == "" || !hasTarget(layout, target) { + return errors.New("ANIMATION_ASSET_OR_TARGET_UNDECLARED") + } + } + return nil +} + +func patchNode(node any, parts []string, operation map[string]any) (any, error) { + if len(parts) == 0 { + switch operation["op"] { + case "add", "replace": + return operation["value"], nil + case "test": + if reflect.DeepEqual(node, operation["value"]) { + return node, nil + } + return nil, errors.New("NATIVE_PATCH_TEST_FAILED") + default: + return nil, errors.New("NATIVE_PATCH_OPERATION_UNSUPPORTED") + } + } + key := parts[0] + switch current := node.(type) { + case map[string]any: + value, exists := current[key] + if len(parts) == 1 { + switch operation["op"] { + case "add": + current[key] = operation["value"] + case "replace": + if !exists { + return nil, errors.New("NATIVE_PATCH_LEAF_MISSING") + } + current[key] = operation["value"] + case "remove": + if !exists { + return nil, errors.New("NATIVE_PATCH_LEAF_MISSING") + } + delete(current, key) + case "test": + if !exists || !reflect.DeepEqual(value, operation["value"]) { + return nil, errors.New("NATIVE_PATCH_TEST_FAILED") + } + default: + return nil, errors.New("NATIVE_PATCH_OPERATION_UNSUPPORTED") + } + return current, nil + } + if !exists { + return nil, errors.New("NATIVE_PATCH_PARENT_MISSING") + } + next, err := patchNode(value, parts[1:], operation) + if err != nil { + return nil, err + } + current[key] = next + return current, nil + case []any: + index, err := strconv.Atoi(key) + if key == "-" && len(parts) == 1 && operation["op"] == "add" { + index = len(current) + err = nil + } + if err != nil || index < 0 || (key != "-" && strconv.Itoa(index) != key) || index > len(current) { + return nil, errors.New("NATIVE_PATCH_ARRAY_INDEX") + } + if len(parts) == 1 && operation["op"] == "add" { + current = append(current, nil) + copy(current[index+1:], current[index:]) + current[index] = operation["value"] + return current, nil + } + if index >= len(current) { + return nil, errors.New("NATIVE_PATCH_ARRAY_INDEX") + } + if len(parts) == 1 && operation["op"] == "remove" { + return append(current[:index], current[index+1:]...), nil + } + next, err := patchNode(current[index], parts[1:], operation) + if err != nil { + return nil, err + } + current[index] = next + return current, nil + default: + return nil, fmt.Errorf("NATIVE_PATCH_PARENT_TYPE: %T", node) + } +} diff --git a/internal/lsdpreception/mutation_test.go b/internal/lsdpreception/mutation_test.go new file mode 100644 index 00000000..e433518c --- /dev/null +++ b/internal/lsdpreception/mutation_test.go @@ -0,0 +1,66 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "log/slog" + "reflect" + "testing" +) + +func TestNativePatchArraysEscapesAndAtomicFailure(t *testing.T) { + before := map[string]any{"layout": map[string]any{"children": []any{map[string]any{"id": "a"}}}, "a/b~c": true} + ops := []map[string]any{ + {"op": "test", "path": "/a~1b~0c", "value": true}, + {"op": "add", "path": "/layout/children/-", "value": map[string]any{"id": "b"}}, + {"op": "replace", "path": "/layout/children/0/id", "value": "first"}, + {"op": "remove", "path": "/layout/children/1"}, + } + next, err := applyObjectOperations(before, ops) + if err != nil { + t.Fatal(err) + } + if reflect.DeepEqual(before, next) { + t.Fatal("no structural mutation") + } + original, _ := json.Marshal(before) + ops = append(ops, map[string]any{"op": "test", "path": "/a~1b~0c", "value": false}) + if _, err := applyObjectOperations(before, ops); err == nil { + t.Fatal("failed test accepted") + } + after, _ := json.Marshal(before) + if string(original) != string(after) { + t.Fatal("failed batch modified original") + } +} +func TestSceneMutationRejectsIdentityAndStaleLease(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + p := NewProducer(ctx, nil) + defer p.Close() + hub := NewHub(p, slog.Default()) + raw := []byte(`{"lsml":"1.1","scene_id":"scene","scene_version":"version","layout":{"kind":"frame","children":[]},"defaults":{}}`) + m := hub.MirrorForLSML("scene", "version", "preview", raw).(*Mirror) + if err := m.ApplyLSML([]map[string]any{{"op": "replace", "path": "/scene_id", "value": "other"}}); err == nil { + t.Fatal("identity overwrite accepted") + } + hub.MirrorForLSML("scene", "version", "program", raw) + if err := m.ApplyLSML([]map[string]any{{"op": "add", "path": "/defaults/title", "value": "late"}}); err == nil { + t.Fatal("stale writer accepted") + } +} + +func TestNativeAnimationRequiresDeclaredAssetAndTarget(t *testing.T) { + document := map[string]any{"layout": map[string]any{"kind": "frame", "id": "panel"}, "defaults": map[string]any{"__animation.play": map[string]any{"animation_id": "play"}}} + if err := validateAnimationCommands(document); err == nil { + t.Fatal("undeclared animation accepted") + } + document["animations"] = map[string]any{"play": map[string]any{"target": "missing"}} + if err := validateAnimationCommands(document); err == nil { + t.Fatal("missing target accepted") + } + document["animations"] = map[string]any{"play": map[string]any{"target": "panel"}} + if err := validateAnimationCommands(document); err != nil { + t.Fatal(err) + } +} diff --git a/internal/lsdpreception/producer.go b/internal/lsdpreception/producer.go new file mode 100644 index 00000000..e672542c --- /dev/null +++ b/internal/lsdpreception/producer.go @@ -0,0 +1,336 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net" + "sync" + "time" + + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +// Producer serializes native transactions off the Blue/scene goroutines. +// Overflow and failed delivery are visible to Flush/Ready, never silently dropped. +// RAM only: no scene, token, outbox or mutated LSML is written to disk. +type Producer struct { + reception *Reception + ctx context.Context + cancel context.CancelFunc + queue chan delivery + done chan struct{} + mu sync.Mutex + failure error + terminal bool + dial func(context.Context) (producerClient, error) + retryDelay time.Duration + reconnects uint64 + delivered uint64 +} +type DeliveryStatus struct { + Pending int `json:"pending"` + Capacity int `json:"capacity"` + Recovering bool `json:"recovering"` + Terminal bool `json:"terminal"` + Reconnects uint64 `json:"reconnects"` + Delivered uint64 `json:"delivered"` +} + +func (p *Producer) Status() DeliveryStatus { + p.mu.Lock() + defer p.mu.Unlock() + return DeliveryStatus{Pending: len(p.queue), Capacity: cap(p.queue), Recovering: p.failure != nil && !p.terminal, Terminal: p.terminal, Reconnects: p.reconnects, Delivered: p.delivered} +} + +type producerClient interface { + Exchange(context.Context, any) (json.RawMessage, error) + Close() error +} +type delivery struct { + target string + document any + operations []map[string]any + barrier chan error +} + +func NewProducer(parent context.Context, reception *Reception) *Producer { + ctx, cancel := context.WithCancel(parent) + p := &Producer{reception: reception, ctx: ctx, cancel: cancel, queue: make(chan delivery, 256), done: make(chan struct{})} + p.dial = func(ctx context.Context) (producerClient, error) { return native.Dial(ctx, reception.Address, "", nil) } + p.retryDelay = 250 * time.Millisecond + go p.run() + return p +} +func (p *Producer) Close() { p.cancel(); <-p.done } +func (p *Producer) fail(err error) { + p.mu.Lock() + if !p.terminal { + p.failure = err + p.terminal = true + } + p.mu.Unlock() +} +func (p *Producer) Error() error { p.mu.Lock(); defer p.mu.Unlock(); return p.failure } +func (p *Producer) transient(err error) { + p.mu.Lock() + defer p.mu.Unlock() + if !p.terminal { + p.failure = err + } +} + +// A dropped transport has an unknown outcome. Replay exactly the same request +// on the same receiver, never mint a fresh mutation identity during recovery. +func (p *Producer) exchange(client *producerClient, request any) (json.RawMessage, bool, error) { + retried := false + for { + p.mu.Lock() + terminal, failure := p.terminal, p.failure + p.mu.Unlock() + if terminal { + return nil, retried, failure + } + ctx, cancel := context.WithTimeout(p.ctx, 5*time.Second) + var result json.RawMessage + var err error + if *client == nil { + // Dial may return (*native.Client)(nil) converted to this interface. + // Keep the live client nil on failure so shutdown/retry cannot Close + // a typed-nil value or mistake it for an established connection. + var connected producerClient + connected, err = p.dial(ctx) + if err == nil { + *client = connected + } + } + if err == nil { + result, err = (*client).Exchange(ctx, request) + } + cancel() + if err == nil { + p.transient(nil) + return result, retried, nil + } + var wireError *native.WireError + if errors.As(err, &wireError) { + return nil, retried, err + } + var transport net.Error + if !errors.As(err, &transport) && !errors.Is(err, io.EOF) && !errors.Is(err, io.ErrUnexpectedEOF) && !errors.Is(err, net.ErrClosed) && !errors.Is(err, context.DeadlineExceeded) && p.ctx.Err() == nil { + return nil, retried, err + } + // An idle peer may have closed an otherwise healthy connection. Replay + // the identical request once immediately; only a failed reconnect backs + // off. Never mint a new ID or assume the lost request was uncommitted. + immediate := !retried && *client != nil + if *client != nil { + (*client).Close() + *client = nil + } + p.transient(fmt.Errorf("NATIVE_LSDP_RECONNECTING: %w", err)) + p.mu.Lock() + p.reconnects++ + p.mu.Unlock() + retried = true + if immediate { + continue + } + timer := time.NewTimer(p.retryDelay) + select { + case <-p.ctx.Done(): + timer.Stop() + return nil, retried, p.ctx.Err() + case <-timer.C: + } + } +} +func (p *Producer) enqueue(d delivery) { + if p.ctx.Err() != nil { + p.fail(p.ctx.Err()) + return + } + select { + case p.queue <- d: + default: + p.fail(errors.New("NATIVE_LSDP_QUEUE_FULL")) + } +} +func (p *Producer) Replace(target string, document any) { + // Capture immutable bytes before the caller mutates its private scene map. + data, err := json.Marshal(document) + if err != nil { + p.fail(err) + return + } + p.enqueue(delivery{target: target, document: json.RawMessage(data)}) +} +func (p *Producer) Apply(target string, operations []map[string]any) { + if len(operations) == 0 { + return + } + data, err := json.Marshal(operations) + if err != nil { + p.fail(err) + return + } + var owned []map[string]any + if err = json.Unmarshal(data, &owned); err != nil { + p.fail(err) + return + } + p.enqueue(delivery{target: target, operations: owned}) +} +func (p *Producer) Flush(ctx context.Context) error { + result := make(chan error, 1) + select { + case <-ctx.Done(): + return ctx.Err() + case <-p.done: + return errors.New("NATIVE_LSDP_STOPPED") + case p.queue <- delivery{barrier: result}: + } + select { + case <-ctx.Done(): + return ctx.Err() + case <-p.done: + return errors.New("NATIVE_LSDP_STOPPED") + case err := <-result: + return err + } +} +func (p *Producer) Check(ctx context.Context) error { + if err := p.Error(); err != nil { + return err + } + return p.reception.Check(ctx) +} +func (p *Producer) run() { + defer close(p.done) + var client producerClient + defer func() { + if client != nil { + client.Close() + } + }() + // The cache is authoritative only after a real read/ACK, not a listening port. + states := map[string]any{} + for { + select { + case <-p.ctx.Done(): + return + case job := <-p.queue: + if job.barrier != nil { + job.barrier <- p.Error() + continue + } + if p.Error() != nil { + continue + } + id, idErr := native.NewID() + if idErr != nil { + p.fail(idErr) + continue + } + var request any + var next any + var err error + if job.operations == nil { + kind := "solar.lsml/1" + if !isSolarSceneTarget(job.target) { + kind = "orion.state/1" + } + request = map[string]any{"kind": "route", "id": id, "port": job.target, "type": kind, "payload": job.document} + err = json.Unmarshal(job.document.(json.RawMessage), &next) + } else { + before, ok := states[job.target] + if !ok { + var raw json.RawMessage + raw, _, err = p.exchange(&client, map[string]any{"kind": "state.read", "target": job.target}) + if err == nil { + var snapshot struct { + State any `json:"state"` + } + err = json.Unmarshal(raw, &snapshot) + before = snapshot.State + } + } + if err == nil { + next, err = applyObjectOperations(before, job.operations) + if err == nil { + request = map[string]any{"format": "lsdp.apply/1", "id": id, "target": job.target, "beforeHash": treeHash(before), "operations": job.operations, "require": "applied"} + } + } + } + if err == nil { + var result json.RawMessage + var uncertain bool + result, uncertain, err = p.exchange(&client, request) + rebaseLoop: + for rebase := 0; err != nil && rebase < 8; rebase++ { + var wireError *native.WireError + switch { + case errors.As(err, &wireError) && wireError.Code == "BASE_MISMATCH" && job.operations != nil && uncertain: + // A receiver restart may have lost deduplication receipts. Do not + // rebase an array insertion or another possibly committed operation. + err = errors.New("NATIVE_TRANSACTION_OUTCOME_UNKNOWN") + break rebaseLoop + case errors.As(err, &wireError) && wireError.Code == "BASE_MISMATCH" && job.operations != nil: + // A concurrent explicit LSML edit may have changed another field. + // Read its acknowledged baseline; preserve it, then retry only our + // declared leaves with a NEW ID after a proven rejection. + var raw json.RawMessage + raw, _, err = p.exchange(&client, map[string]any{"kind": "state.read", "target": job.target}) + var snapshot struct { + State any `json:"state"` + } + if err == nil { + err = json.Unmarshal(raw, &snapshot) + } + if err == nil { + next, err = applyObjectOperations(snapshot.State, job.operations) + } + if err == nil { + id, err = native.NewID() + if err == nil { + request = map[string]any{"format": "lsdp.apply/1", "id": id, "target": job.target, "beforeHash": treeHash(snapshot.State), "operations": job.operations, "require": "applied"} + result, uncertain, err = p.exchange(&client, request) + } + } + default: + break rebaseLoop + } + } + if err == nil { + var receipt struct { + Status, Level, Target string + TransactionID string `json:"transactionId"` + } + err = json.Unmarshal(result, &receipt) + if err == nil && job.operations == nil { + err = completedRoute(result, id) + } + if err == nil && job.operations != nil && (receipt.Level != "applied" || receipt.Target != job.target || receipt.TransactionID != id) { + err = errors.New("NATIVE_APPLICATION_NOT_ACKNOWLEDGED") + } + if err == nil && job.operations == nil { + err = forgetCompletedRoute(func(request any) (json.RawMessage, error) { + raw, _, releaseErr := p.exchange(&client, request) + return raw, releaseErr + }, id) + } + } + } + if err != nil { + p.fail(fmt.Errorf("native delivery %s: %w", job.target, err)) + } else { + states[job.target] = next + p.mu.Lock() + p.delivered++ + p.mu.Unlock() + } + } + } +} diff --git a/internal/lsdpreception/producer_test.go b/internal/lsdpreception/producer_test.go new file mode 100644 index 00000000..83d49962 --- /dev/null +++ b/internal/lsdpreception/producer_test.go @@ -0,0 +1,259 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "io" + "log/slog" + "os" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/compiler" + "github.com/ZabLaboratory/Orion/internal/protocol" + "github.com/ZabLaboratory/Orion/internal/runtime" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +func TestTreeAndObjectOperations(t *testing.T) { + if treeHash(nil) != "tree-sha256:1b16b1df538ba12dc3f97edbb85caa7050d46c148134290feba80f8236c83db9" { + t.Fatal("null hash") + } + for _, item := range []struct { + value float64 + want string + }{{1e-7, "1e-7"}, {1e-6, "0.000001"}, {1e20, "100000000000000000000"}, {1e21, "1e+21"}, {0, "0"}, {-0.1, "-0.1"}} { + if got := number(item.value); got != item.want { + t.Fatalf("number %g: %s", item.value, got) + } + } + before := map[string]any{"a/b": map[string]any{"~": 1.0}} + next, err := applyObjectOperations(before, []map[string]any{{"op": "add", "path": "/a~1b/~0", "value": nil}}) + if err != nil || next.(map[string]any)["a/b"].(map[string]any)["~"] != nil || before["a/b"].(map[string]any)["~"] != 1.0 { + t.Fatal("atomic pointer mutation", err) + } +} + +func TestSourceDocumentPreservesLSMLAddressDistinctFromArtifactSet(t *testing.T) { + const sourceVersion = "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + const artifactSet = "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + raw := []byte(`{"lsml":"1.2","scene_id":"scene-1","scene_version":"` + sourceVersion + `","layout":{"type":"frame","children":[]}}`) + document, err := sourceDocument("scene-1", artifactSet, raw) + if err != nil || document["scene_version"] != sourceVersion || document["x-orion-artifact-set"] != artifactSet { + t.Fatalf("native source must retain its fetchable LSML identity: %v %v", document, err) + } +} + +// This is an actual Orion producer → native Rust receiver test, using the real +// LSML and its complete geometry/assets. The harness owns an ephemeral node. +func TestRealNativeProducers(t *testing.T) { + address, path := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), os.Getenv("ORION_TEST_LSML_PATH") + if address == "" || path == "" { + t.Skip("requires actual native receiver and real LSML") + } + ctx, cancel := context.WithTimeout(context.Background(), 40*time.Second) + defer cancel() + source, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var original map[string]any + if err = json.Unmarshal(source, &original); err != nil { + t.Fatal(err) + } + sceneID, version := original["scene_id"].(string), original["scene_version"].(string) + r, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + if err = r.Check(ctx); err != nil { + t.Fatal(err) + } + p := NewProducer(ctx, r) + defer p.Close() + // This integration test owns its disposable native resources. + p.Replace("solar/program", nil) + p.Replace("solar/preview", nil) + p.Replace("solar/generations", map[string]any{}) + p.Replace("solar/sessions", map[string]any{}) + p.Replace("orion/state", map[string]any{}) + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + h := NewHub(p, slog.New(slog.NewTextHandler(io.Discard, nil))) + c, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer c.Close() + read := func(target string) any { + raw, e := c.Exchange(ctx, map[string]any{"kind": "state.read", "target": target}) + if e != nil { + t.Fatal(e) + } + var snapshot struct{ State any } + if e = json.Unmarshal(raw, &snapshot); e != nil { + t.Fatal(e) + } + return snapshot.State + } + flush := func() { + t.Helper() + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + } + preview, program := h.Lane("preview"), h.Lane("program") + pm := preview.MirrorForLSML(sceneID, version, source) + if pm == nil { + t.Fatal(p.Error()) + } + pm.Forward(&protocol.Snapshot{SceneID: sceneID, State: map[string]json.RawMessage{}}) + preview.SetActive(sceneID) + gm := h.MirrorForLSML(sceneID, version, "preview", source) + flush() + if read("solar/program") != nil { + t.Fatal("Preview reached Program") + } + key := GenerationKey(sceneID, version) + if read("solar/generations").(map[string]any)[key] == nil { + t.Fatal("exact generation missing") + } + var pathKey string + for k, v := range original["defaults"].(map[string]any) { + if _, ok := v.(string); ok && len(k) > 11 && k[:11] == "__lit.text." { + pathKey = k + break + } + } + if pathKey == "" { + t.Fatal("real scene has no authored text binding") + } + value := json.RawMessage(`"Orion → LSDP natif"`) + delta := &protocol.Delta{SceneID: sceneID, Patches: []protocol.Patch{{Path: pathKey, Value: value}, {Path: "__vars.unbound", Value: json.RawMessage(`{"rows":[1]}`)}}, RuntimeInstanceID: "real-producer-test", SceneDigest: "blue-runtime-digest", Target: "preview", RenderRevision: "1", CorrelationID: "native-proof"} + pm.Forward(delta) + gm.Forward(delta) + flush() + state := read("solar/preview").(map[string]any) + if state["defaults"].(map[string]any)[pathKey] != "Orion → LSDP natif" { + t.Fatal("Blue output not applied") + } + if _, ok := state["defaults"].(map[string]any)["__vars.unbound"]; ok { + t.Fatal("unbound intermediate leaked") + } + if state["x-orion"].(map[string]any)["runtime_instance_id"] != "real-producer-test" { + t.Fatal("projection provenance missing") + } + // A proven external edit is preserved when the next producer leaf rebases. + external := state + external["test_extension"] = map[string]any{"fraction": 0.0000001, "unicode": "é / ~", "nested": []any{nil, 12.5}} + result, e := c.SendPort(ctx, "", "solar/preview", "solar.lsml/1", external) + if e != nil || native.Completed(result) != nil { + t.Fatal("native full-document diff", e) + } + pm.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: pathKey, Value: json.RawMessage(`"after external edit"`)}}}) + flush() + if read("solar/preview").(map[string]any)["test_extension"] == nil { + t.Fatal("concurrent LSML edit lost") + } + // Same-generation Take changes writer lease. A delayed Preview tick cannot + // overwrite the physical Program generation, even if its owner string repeats. + air := h.MirrorForLSML(sceneID, version, "on-air", source) + live := program.MirrorForLSML(sceneID, version, source) + program.SetActive(sceneID) + air.Forward(delta) + live.Forward(delta) + flush() + gm.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: pathKey, Value: json.RawMessage(`"stale"`)}}}) + flush() + if read("solar/generations").(map[string]any)[key].(map[string]any)["defaults"].(map[string]any)[pathKey] == "stale" { + t.Fatal("stale generation writer") + } + // Switching Preview does not retarget an immutable generation or Program. + other := map[string]any{} + raw, _ := json.Marshal(original) + if err := json.Unmarshal(raw, &other); err != nil { + t.Fatal(err) + } + other["scene_id"] = "other-preview" + otherRaw, _ := json.Marshal(other) + preview.MirrorForLSML("other-preview", version, otherRaw) + preview.SetActive("other-preview") + flush() + if read("solar/program").(map[string]any)["scene_id"] != sceneID { + t.Fatal("Preview switch corrupted Program") + } + program.EmitSlotAssignment("slot/one~", "peer-a") + program.EmitViewerPayload(`{"rooms":[]}`) + program.EmitOverlayApp("overlay-1", boolPointer(true), nil) + flush() + generation := read("solar/generations").(map[string]any)[key].(map[string]any) + if generation["defaults"].(map[string]any)["__cam.slots.slot/one~"] != "peer-a" { + t.Fatal("camera generation assignment missing") + } + if read("orion/state").(map[string]any)["overlay_running_overlay-1"] != true { + t.Fatal("overlay control missing") + } + // A freshly armed physical Pulsar lane inherits current camera authority, + // including explicit custom owner IDs, before its first frame is rendered. + h.MirrorForLSML(sceneID, "camera-generation", "pulsar-lane-a", source) + flush() + cameraKey := GenerationKey(sceneID, "camera-generation") + cameraDefaults := read("solar/generations").(map[string]any)[cameraKey].(map[string]any)["defaults"].(map[string]any) + if cameraDefaults["__cam.slots.slot/one~"] != "peer-a" || cameraDefaults["__cam.viewer"] != `{"rooms":[]}` { + t.Fatal("new physical generation lost current camera authority") + } + program.EmitSlotCleared("slot/one~") + flush() + if read("solar/generations").(map[string]any)[cameraKey].(map[string]any)["defaults"].(map[string]any)["__cam.slots.slot/one~"] != nil { + t.Fatal("custom physical owner missed camera release") + } + // Independent test clones use their actual API session identity. + a := h.NewSessionWireFor("session-a", sceneID, version, &compiler.RenderBundle{SourceLSML: source}) + b := h.NewSessionWireFor("session-b", sceneID, version, &compiler.RenderBundle{SourceLSML: source}) + a.Mirror().Forward(delta) + flush() + sessions := read("solar/sessions").(map[string]any) + if sessions["session-a"].(map[string]any)["defaults"].(map[string]any)[pathKey] == sessions["session-b"].(map[string]any)["defaults"].(map[string]any)[pathKey] { + t.Fatal("test session cross-talk") + } + a.Close() + a.Mirror().Forward(delta) + flush() + if read("solar/sessions").(map[string]any)["session-a"] != nil { + t.Fatal("closed session resurrected") + } + b.Close() + flush() + // Native subscribers live on the shared node. Abandoned API clones must + // expire through Orion's lease/sweep instead of leaking until shutdown. + manager := runtime.NewTestSessionManager(runtime.NewComputeRegistry(), h.logger, time.Minute) + manager.SetSessionWires(h) + defer manager.Close() + defaults := map[string]json.RawMessage{} + for k, value := range original["defaults"].(map[string]any) { + defaults[k], _ = json.Marshal(value) + } + leaseID, _ := manager.Open(ctx, sceneID, &compiler.Graph{SceneID: sceneID, SceneVersion: version, Defaults: defaults}, &compiler.RenderBundle{SourceLSML: source}) + flush() + if read("solar/sessions").(map[string]any)[leaseID] == nil { + t.Fatal("actual API session ID not published") + } + if _, err := manager.Renew(leaseID); err != nil { + t.Fatal(err) + } + manager.Sweep(time.Now().Add(2 * time.Minute)) + flush() + if read("solar/sessions").(map[string]any)[leaseID] != nil { + t.Fatal("expired native clone/resource leaked") + } + if _, err := manager.Renew(leaseID); err == nil { + t.Fatal("expired session revived") + } + untouched, _ := os.ReadFile(path) + if string(untouched) != string(source) { + t.Fatal("source file mutated") + } + t.Logf("actual native ACKs: Blue leaves, native diff and rebase, Program/Preview switch, generation writer lease, camera/overlay and test-session isolation; scene=%s; leaf=%s", sceneID, pathKey) +} +func boolPointer(value bool) *bool { return &value } diff --git a/internal/lsdpreception/program_identity.go b/internal/lsdpreception/program_identity.go new file mode 100644 index 00000000..1110985e --- /dev/null +++ b/internal/lsdpreception/program_identity.go @@ -0,0 +1,59 @@ +package lsdpreception + +// ProgramInspect captures the current identity once after output shutdown. +// There is no per-edit status publisher or additional transport. +type ProgramInspect struct { + Schema string `json:"schema"` + CommandID string `json:"command_id"` + RuntimeInstanceID string `json:"runtime_instance_id"` + TakeCommandID string `json:"take_command_id"` + ExpectedRoleMap RoleMap `json:"expected_role_map"` + ExpectedRevisions LaneRevisions `json:"expected_revisions"` +} +type ProgramIdentityReceipt struct { + ProgramInspect + Status string `json:"status"` + Reason string `json:"reason,omitempty"` + Target string `json:"target,omitempty"` + SceneID string `json:"scene_id,omitempty"` + SceneVersion string `json:"scene_version,omitempty"` + ArtifactSet string `json:"artifact_set,omitempty"` + WriterID string `json:"writer_id,omitempty"` + EditSeq *uint64 `json:"edit_seq,omitempty"` +} + +func (h *Hub) InspectProgram(r ProgramInspect) ProgramIdentityReceipt { + h.mu.Lock() + defer h.mu.Unlock() + out := ProgramIdentityReceipt{ProgramInspect: r, Status: "refused"} + refuse := func(reason string) ProgramIdentityReceipt { out.Reason = reason; return out } + if r.Schema != "orion.program-inspect.v1" || r.CommandID == "" || len(r.CommandID) > 256 { + return refuse("PROGRAM_INSPECT_INVALID") + } + if !h.physical || h.lastCommit == nil { + return refuse("PROGRAM_RELEASE_NO_COMMIT") + } + c := h.lastCommit + if c.RuntimeInstanceID != r.RuntimeInstanceID { + return refuse("PROGRAM_RELEASE_FOREIGN_RUNTIME") + } + if c.TakeCommandID != r.TakeCommandID || c.Revisions.Program != r.ExpectedRevisions.Program || c.Revisions.RoleMap != r.ExpectedRevisions.RoleMap || r.ExpectedRevisions.Preview < c.Revisions.Preview { + return refuse("PROGRAM_RELEASE_STALE_EPOCH") + } + if r.ExpectedRoleMap != h.roles { + return refuse("PROGRAM_RELEASE_ROLE_MISMATCH") + } + p := h.lanes["program"] + if p == nil || p.active == nil { + return refuse("PROGRAM_RELEASE_EMPTY") + } + if p.transitioning { + return refuse("PROGRAM_RELEASE_BUSY") + } + out.Status = "active" + out.Target = p.target + out.SceneID = p.active.sceneID + out.SceneVersion, _ = p.active.document["scene_version"].(string) + out.ArtifactSet = p.active.version + return out +} diff --git a/internal/lsdpreception/program_release.go b/internal/lsdpreception/program_release.go new file mode 100644 index 00000000..a843f788 --- /dev/null +++ b/internal/lsdpreception/program_release.go @@ -0,0 +1,167 @@ +package lsdpreception + +import ( + "context" + "encoding/json" +) + +func (h *Hub) Flush(ctx context.Context) error { return h.producer.Flush(ctx) } + +// ProgramRelease is an explicit local stop receipt, not a scene selection. +// The host application owns output confirmation; Orion owns scene retirement. +type ProgramRelease struct { + Schema string `json:"schema"` + CommandID string `json:"command_id"` + Attempt uint64 `json:"attempt,omitempty"` + StopCommandID string `json:"stop_command_id"` + OutputState string `json:"output_state"` + RuntimeInstanceID string `json:"runtime_instance_id"` + TakeCommandID string `json:"take_command_id"` + ExpectedRoleMap RoleMap `json:"expected_role_map"` + ExpectedRevisions LaneRevisions `json:"expected_revisions"` + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + ArtifactSet string `json:"artifact_set"` + WriterID string `json:"writer_id,omitempty"` + EditSeq *uint64 `json:"edit_seq,omitempty"` +} + +type ProgramReleaseReceipt struct { + ProgramRelease + Status string `json:"status"` + Reason string `json:"reason,omitempty"` + Target string `json:"target,omitempty"` + Retired bool `json:"retired"` + Replayed bool `json:"replayed,omitempty"` +} + +func (r ProgramRelease) Valid() bool { + for _, s := range []string{r.CommandID, r.StopCommandID, r.RuntimeInstanceID, r.TakeCommandID, r.SceneID, r.SceneVersion, r.ArtifactSet} { + if s == "" || len(s) > 256 { + return false + } + } + return r.Schema == "orion.program-release.v1" && r.OutputState == "stopped" && len(r.WriterID) <= 256 && + ((r.WriterID == "" && r.EditSeq == nil) || (r.WriterID != "" && r.EditSeq != nil)) +} + +func releaseKey(r ProgramRelease) string { return r.RuntimeInstanceID + "\x00" + r.CommandID } +func sameRelease(a, b ProgramRelease) bool { + a.Attempt = 0 + b.Attempt = 0 + x, _ := json.Marshal(a) + y, _ := json.Marshal(b) + return string(x) == string(y) +} + +// CheckProgramRelease does not change authority, including when a pending +// presentation must first be cancelled and compensated by SceneControl. +func (h *Hub) CheckProgramRelease(r ProgramRelease) ProgramReleaseReceipt { + h.mu.Lock() + defer h.mu.Unlock() + return h.checkProgramRelease(r, false) +} +func (h *Hub) checkProgramRelease(r ProgramRelease, requireIdle bool) ProgramReleaseReceipt { + out := ProgramReleaseReceipt{ProgramRelease: r, Status: "refused"} + refuse := func(reason string) ProgramReleaseReceipt { out.Reason = reason; return out } + if !h.physical || !r.Valid() { + return refuse("PROGRAM_RELEASE_INVALID") + } + if cached, ok := h.releases[releaseKey(r)]; ok { + if !sameRelease(cached.ProgramRelease, r) { + return refuse("PROGRAM_RELEASE_CONFLICT") + } + cached.Replayed = true + cached.Attempt = r.Attempt + return cached + } + if h.lastCommit == nil { + return refuse("PROGRAM_RELEASE_NO_COMMIT") + } + c := h.lastCommit + if c.RuntimeInstanceID != r.RuntimeInstanceID { + return refuse("PROGRAM_RELEASE_FOREIGN_RUNTIME") + } + if c.TakeCommandID != r.TakeCommandID || c.Revisions.Program != r.ExpectedRevisions.Program || c.Revisions.RoleMap != r.ExpectedRevisions.RoleMap { + return refuse("PROGRAM_RELEASE_STALE_EPOCH") + } + if r.ExpectedRevisions.Preview < c.Revisions.Preview { + return refuse("PROGRAM_RELEASE_STALE_EPOCH") + } + if r.ExpectedRoleMap != h.roles { + return refuse("PROGRAM_RELEASE_ROLE_MISMATCH") + } + p := h.lanes["program"] + if p == nil || p.active == nil { + return refuse("PROGRAM_RELEASE_EMPTY") + } + if p.active.sceneID != r.SceneID || p.active.document["scene_version"] != r.SceneVersion || p.active.version != r.ArtifactSet { + return refuse("PROGRAM_RELEASE_IDENTITY_MISMATCH") + } + if requireIdle && p.transitioning { + return refuse("PROGRAM_RELEASE_BUSY") + } + out.Status = "validated" + out.Target = p.target + return out +} + +// StageProgramRelease fences retained mirrors while their owners are stopped. +// Caller holds the Program Host lease. No owner is stopped under the Hub lock. +func (h *Hub) StageProgramRelease(r ProgramRelease) (func(), ProgramReleaseReceipt) { + h.mu.Lock() + defer h.mu.Unlock() + out := h.checkProgramRelease(r, true) + if out.Status != "validated" { + return nil, out + } + p := h.lanes["program"] + p.transitioning = true + return func() { h.mu.Lock(); defer h.mu.Unlock(); p.transitioning = false }, out +} + +// RetireProgram drops every Program mirror, including in-flight candidate +// mirrors, but retains the Lane object and its physical resource identity. +func (h *Hub) RetireProgram(r ProgramRelease) ProgramReleaseReceipt { + h.mu.Lock() + defer h.mu.Unlock() + out := h.checkProgramRelease(r, false) + if out.Status != "validated" { + return out + } + p := h.lanes["program"] + p.dropLocked(r.SceneID) + p.scenes = map[string]*Mirror{} + out.Status = "pending" + out.Retired = true + if h.releases == nil { + h.releases = map[string]ProgramReleaseReceipt{} + } + h.releases[releaseKey(r)] = out + h.releaseOrder = append(h.releaseOrder, releaseKey(r)) + if len(h.releaseOrder) > 64 { + delete(h.releases, h.releaseOrder[0]) + h.releaseOrder = h.releaseOrder[1:] + } + return out +} + +// FinishProgramRelease is called only after the native application barrier. +func (h *Hub) FinishProgramRelease(r ProgramRelease, reason string) ProgramReleaseReceipt { + h.mu.Lock() + defer h.mu.Unlock() + out, ok := h.releases[releaseKey(r)] + if !ok || !sameRelease(out.ProgramRelease, r) { + return ProgramReleaseReceipt{ProgramRelease: r, Status: "refused", Reason: "PROGRAM_RELEASE_CONFLICT"} + } + out.Attempt = r.Attempt + if reason != "" { + out.Status = "failed" + out.Reason = reason + } else { + out.Status = "released" + out.Reason = "" + } + h.releases[releaseKey(r)] = out + return out +} diff --git a/internal/lsdpreception/program_release_test.go b/internal/lsdpreception/program_release_test.go new file mode 100644 index 00000000..08e580be --- /dev/null +++ b/internal/lsdpreception/program_release_test.go @@ -0,0 +1,102 @@ +package lsdpreception + +import ( + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/protocol" + "testing" +) + +func releaseFixture(t *testing.T) (*Hub, *Producer, *Mirror, *Mirror, ProgramRelease) { + h, p, a, b := roleFixture(t) + c := roleCommit() + if got := h.CommitRoles(c, nil); got.Status != "committed" { + t.Fatal(got) + } + return h, p, a, b, ProgramRelease{Schema: "orion.program-release.v1", CommandID: "release-1", StopCommandID: "stop-1", OutputState: "stopped", RuntimeInstanceID: c.RuntimeInstanceID, TakeCommandID: c.TakeCommandID, ExpectedRoleMap: c.RoleMap, ExpectedRevisions: c.Revisions, SceneID: "scene-b", SceneVersion: "source-v1", ArtifactSet: "artifact-b"} +} + +func TestProgramReleasePreservesPreviewAndPhysicalRoles(t *testing.T) { + h, p, a, b, r := releaseFixture(t) + before, _ := json.Marshal(a.document) + finish, receipt := h.StageProgramRelease(r) + if finish == nil || receipt.Target != "solar/lane-b" { + t.Fatal(receipt) + } + b.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: "score", Value: json.RawMessage(`9`)}}}) + if len(p.queue) != 0 { + t.Fatal("publication crossed retirement fence") + } + retired := h.RetireProgram(r) + finish() + if !retired.Retired || retired.Status != "pending" { + t.Fatal(retired) + } + job := <-p.queue + raw, _ := json.Marshal(job.document) + if job.target != "solar/lane-b" || string(raw) != "null" || len(p.queue) != 0 { + t.Fatal("retirement targeted another resource", job) + } + b.Forward(&protocol.Delta{Patches: []protocol.Patch{{Path: "score", Value: json.RawMessage(`10`)}}}) + if err := b.ApplyLSML([]map[string]any{{"op": "add", "path": "/defaults/score", "value": 11}}); err == nil { + t.Fatal("retired mirror accepted mutation") + } + after, _ := json.Marshal(a.document) + if string(before) != string(after) || h.Lane("preview").active != a || h.Lane("program").active != nil || h.roles != r.ExpectedRoleMap || len(p.queue) != 0 { + t.Fatal("Preview or roles changed") + } + if got := h.FinishProgramRelease(r, ""); got.Status != "released" { + t.Fatal(got) + } + if finish, replay := h.StageProgramRelease(r); finish != nil || !replay.Replayed || replay.Status != "released" { + t.Fatal(replay) + } + if len(p.queue) != 0 { + t.Fatal("replay published another null") + } +} + +func TestProgramReleaseRejectsStaleAuthority(t *testing.T) { + for _, tc := range []struct { + name, reason string + change func(*ProgramRelease) + }{ + {"runtime", "PROGRAM_RELEASE_FOREIGN_RUNTIME", func(r *ProgramRelease) { r.RuntimeInstanceID = "other" }}, + {"epoch", "PROGRAM_RELEASE_STALE_EPOCH", func(r *ProgramRelease) { r.ExpectedRevisions.RoleMap++ }}, + {"program", "PROGRAM_RELEASE_STALE_EPOCH", func(r *ProgramRelease) { r.ExpectedRevisions.Program++ }}, + {"take", "PROGRAM_RELEASE_STALE_EPOCH", func(r *ProgramRelease) { r.TakeCommandID = "older" }}, + {"roles", "PROGRAM_RELEASE_ROLE_MISMATCH", func(r *ProgramRelease) { r.ExpectedRoleMap = RoleMap{"A", "B"} }}, + {"source", "PROGRAM_RELEASE_IDENTITY_MISMATCH", func(r *ProgramRelease) { r.SceneVersion = "other" }}, + {"artifact", "PROGRAM_RELEASE_IDENTITY_MISMATCH", func(r *ProgramRelease) { r.ArtifactSet = "other" }}, + {"not stopped", "PROGRAM_RELEASE_INVALID", func(r *ProgramRelease) { r.OutputState = "live" }}, + } { + t.Run(tc.name, func(t *testing.T) { + h, p, a, b, r := releaseFixture(t) + tc.change(&r) + finish, got := h.StageProgramRelease(r) + if finish != nil || got.Reason != tc.reason || h.Lane("program").active != b || h.Lane("preview").active != a || len(p.queue) != 0 { + t.Fatal(got) + } + }) + } + h, _, _, _, r := releaseFixture(t) + finish, _ := h.StageProgramRelease(r) + h.RetireProgram(r) + finish() + h.FinishProgramRelease(r, "") + r.SceneVersion = "changed" + if got := h.CheckProgramRelease(r); got.Reason != "PROGRAM_RELEASE_CONFLICT" { + t.Fatal(got) + } +} + +func TestFirstPhysicalTakeAllowsEmptyProgramWithoutDocumentReload(t *testing.T) { + h, p, _, b := roleFixture(t) + h.Lane("program").Drop("scene-a") + <-p.queue + if got := h.CommitRoles(roleCommit(), nil); got.Status != "committed" { + t.Fatal(got) + } + if h.Lane("program").active != b || h.Lane("preview").active != nil || len(p.queue) != 0 { + t.Fatal("first start reloaded or duplicated Preview") + } +} diff --git a/internal/lsdpreception/reception.go b/internal/lsdpreception/reception.go new file mode 100644 index 00000000..172fc9a3 --- /dev/null +++ b/internal/lsdpreception/reception.go @@ -0,0 +1,79 @@ +// Package lsdpreception connects to the single native receiver owned by Prism. +// Orion verifies it but never launches or terminates that shared process. +package lsdpreception + +import ( + "context" + "encoding/json" + "errors" + "net" + "strconv" + "sync/atomic" + "time" + + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +type Reception struct { + Address, Resource string + PhysicalLanes atomic.Bool +} + +func New(address, resource string) (*Reception, error) { + host, port, err := net.SplitHostPort(address) + number, numberErr := strconv.Atoi(port) + if err != nil || numberErr != nil || number < 1 || number > 65535 || net.ParseIP(host) == nil || !net.ParseIP(host).IsLoopback() || resource != "orion/state" { + return nil, errors.New("LSDP_RECEPTION_ENDPOINT_INVALID") + } + return &Reception{Address: address, Resource: resource}, nil +} + +// Check performs the native handshake, checks capabilities, then reads Orion's +// actual resource. A listening port alone is not proof of a functioning server. +func (r *Reception) Check(parent context.Context) error { + ctx, cancel := context.WithTimeout(parent, 3*time.Second) + defer cancel() + client, err := native.Dial(ctx, r.Address, "", nil) + if err != nil { + return err + } + defer client.Close() + response, err := client.Exchange(ctx, map[string]any{"kind": "capabilities"}) + if err != nil { + return err + } + var capabilities struct { + Ready bool + Profiles []string + Resources []string + } + if err = json.Unmarshal(response, &capabilities); err != nil { + return err + } + has := func(items []string, value string) bool { + for _, item := range items { + if item == value { + return true + } + } + return false + } + if !capabilities.Ready || !has(capabilities.Resources, r.Resource) || !has(capabilities.Profiles, "lsdp.node.routing/1") || !has(capabilities.Profiles, "lsdp.state.application/1") { + return errors.New("LSDP_RECEPTION_CAPABILITIES_INVALID") + } + _, err = client.Exchange(ctx, map[string]any{"kind": "state.read", "target": r.Resource}) + physical := has(capabilities.Resources, "solar/lane-a") && has(capabilities.Resources, "solar/lane-b") + if physical { + r.PhysicalLanes.Store(true) + } + targets := []string{"solar/program", "solar/preview", "solar/generations", "solar/sessions"} + if physical { + targets = []string{"solar/lane-a", "solar/lane-b", "solar/generations", "solar/sessions"} + } + for _, target := range targets { + if !has(capabilities.Resources, target) { + return errors.New("LSDP_RECEPTION_SCENE_RESOURCES_MISSING") + } + } + return err +} diff --git a/internal/lsdpreception/reception_test.go b/internal/lsdpreception/reception_test.go new file mode 100644 index 00000000..50c919b4 --- /dev/null +++ b/internal/lsdpreception/reception_test.go @@ -0,0 +1,61 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" + "os" + "testing" +) + +func TestEndpoint(t *testing.T) { + for _, address := range []string{"example.com:4000", "0.0.0.0:4000", "192.168.1.10:4000", "127.0.0.1:0", "127.0.0.1:99999"} { + if _, err := New(address, "orion/state"); err == nil { + t.Fatalf("accepted %s", address) + } + } + if _, err := New("127.0.0.1:4000", "solar/program"); err == nil { + t.Fatal("accepted Solar resource") + } +} + +func TestRealSharedNative(t *testing.T) { + address := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS") + if address == "" { + t.Skip("requires actual shared Rust receiver") + } + receiver, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + if err := receiver.Check(context.Background()); err != nil { + t.Fatal(err) + } + client, err := native.Dial(context.Background(), address, "", nil) + if err != nil { + t.Fatal(err) + } + defer client.Close() + before, err := client.Exchange(context.Background(), map[string]any{"kind": "state.read", "target": "orion/state"}) + if err != nil { + t.Fatal(err) + } + var snapshot struct{ State json.RawMessage } + if err := json.Unmarshal(before, &snapshot); err != nil { + t.Fatal(err) + } + receipt, err := client.SendPort(context.Background(), "", "orion/state", "orion.state/1", map[string]any{"revision": 91}) + if err != nil { + t.Fatal(err) + } + if err := native.Completed(receipt); err != nil { + t.Fatal(err) + } + receipt, err = client.SendPort(context.Background(), "", "orion/state", "orion.state/1", snapshot.State) + if err != nil { + t.Fatal(err) + } + if err := native.Completed(receipt); err != nil { + t.Fatal(err) + } +} diff --git a/internal/lsdpreception/recovery_native_test.go b/internal/lsdpreception/recovery_native_test.go new file mode 100644 index 00000000..2c4b574f --- /dev/null +++ b/internal/lsdpreception/recovery_native_test.go @@ -0,0 +1,86 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" + "io" + "os" + "sync/atomic" + "testing" + "time" +) + +type lostNativeReceipt struct { + producerClient + lost *atomic.Bool +} + +func (c lostNativeReceipt) Exchange(ctx context.Context, request any) (json.RawMessage, error) { + result, err := c.producerClient.Exchange(ctx, request) + if value, ok := request.(map[string]any); ok && value["format"] == "lsdp.apply/1" && err == nil && c.lost.CompareAndSwap(false, true) { + c.Close() // actual Rust commit happened; its receipt never reaches Producer. + return nil, io.EOF + } + return result, err +} +func TestRealNativeTransportRecovery(t *testing.T) { + address := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS") + if address == "" { + t.Skip("requires actual native receiver") + } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + client, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer client.Close() + raw, err := client.Exchange(ctx, map[string]any{"kind": "state.read", "target": "orion/state"}) + if err != nil { + t.Fatal(err) + } + var original struct{ State any } + if err := json.Unmarshal(raw, &original); err != nil { + t.Fatal(err) + } + defer func() { + if _, err := client.SendPort(context.Background(), "", "orion/state", "orion.state/1", original.State); err != nil { + t.Error(err) + } + }() + reception, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + p := NewProducer(ctx, reception) + defer p.Close() + var lost atomic.Bool + p.dial = func(ctx context.Context) (producerClient, error) { + c, e := native.Dial(ctx, address, "", nil) + if e != nil { + return nil, e + } + return lostNativeReceipt{c, &lost}, nil + } + p.Replace("orion/state", map[string]any{"items": []any{}}) + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + p.Apply("orion/state", []map[string]any{{"op": "add", "path": "/items/-", "value": "one"}}) + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + raw, err = client.Exchange(ctx, map[string]any{"kind": "state.read", "target": "orion/state"}) + if err != nil { + t.Fatal(err) + } + var observed struct{ State struct{ Items []string } } + if err := json.Unmarshal(raw, &observed); err != nil { + t.Fatal(err) + } + if len(observed.State.Items) != 1 || observed.State.Items[0] != "one" || !lost.Load() || p.Status().Reconnects != 1 { + t.Fatalf("committed insertion replayed: %s %+v", raw, p.Status()) + } + t.Logf("REAL_RECOVERY_PROOF committed_insertion=1 receipt_lost=true reconnects=%d healthy=true", p.Status().Reconnects) +} diff --git a/internal/lsdpreception/recovery_test.go b/internal/lsdpreception/recovery_test.go new file mode 100644 index 00000000..c9d8173a --- /dev/null +++ b/internal/lsdpreception/recovery_test.go @@ -0,0 +1,169 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "errors" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" + "io" + "sync" + "testing" + "time" +) + +type recoveryClient struct { + exchange func(any) (json.RawMessage, error) +} + +func (c recoveryClient) Exchange(_ context.Context, request any) (json.RawMessage, error) { + return c.exchange(request) +} +func (c recoveryClient) Close() error { return nil } + +func TestProducerRecoversWithoutDroppingOrChangingTransaction(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + p.retryDelay = time.Millisecond + var mu sync.Mutex + var attempts []string + offline := make(chan struct{}) + attemptsSeen := make(chan struct{}, 1) + p.dial = func(context.Context) (producerClient, error) { + select { + case <-offline: + default: + select { + case attemptsSeen <- struct{}{}: + default: + } + return nil, io.EOF + } + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + value := request.(map[string]any) + if value["kind"] == "route.forget" { + reply, _ := json.Marshal(map[string]any{"status": "forgotten", "id": value["id"]}) + return reply, nil + } + raw, _ := json.Marshal(request) + mu.Lock() + defer mu.Unlock() + attempts = append(attempts, string(raw)) + // Simulate a commit whose receipt was lost on the first connection. + if len(attempts) == 1 { + return nil, io.EOF + } + reply, _ := json.Marshal(map[string]any{"status": "completed", "id": value["id"]}) + return reply, nil + }}, nil + } + p.Replace("solar/program", map[string]any{"value": "one"}) + <-attemptsSeen + deadline := time.Now().Add(time.Second) + for p.Error() == nil && time.Now().Before(deadline) { + time.Sleep(time.Millisecond) + } + if err := p.Error(); err == nil { + t.Fatal("outage did not invalidate readiness") + } + // Every accepted delivery stays ordered behind the unavailable receiver. + p.Replace("solar/preview", map[string]any{"value": "two"}) + close(offline) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + mu.Lock() + defer mu.Unlock() + if len(attempts) != 3 || attempts[0] != attempts[1] { + t.Fatalf("lost or changed replay: %v", attempts) + } + if p.Error() != nil { + t.Fatal("recovery remained permanently unready", p.Error()) + } + if status := p.Status(); status.Delivered != 2 || status.Reconnects < 2 || status.Recovering || status.Terminal || status.Pending != 0 { + t.Fatalf("recovery status: %+v", status) + } +} + +func TestProducerDoesNotRebaseUnknownCommittedInsertion(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + p.retryDelay = time.Millisecond + attempts := 0 + p.dial = func(context.Context) (producerClient, error) { + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + value := request.(map[string]any) + if value["kind"] == "state.read" { + return json.RawMessage(`{"state":{"items":[]}}`), nil + } + attempts++ + if attempts == 1 { + return nil, io.EOF + } + return nil, &native.WireError{Code: "BASE_MISMATCH", Outcome: "rejected"} + }}, nil + } + p.Apply("solar/program", []map[string]any{{"op": "add", "path": "/items/-", "value": "one"}}) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := p.Flush(ctx); err == nil || !errors.Is(err, p.Error()) { + t.Fatal("unknown mutation outcome was hidden", err) + } + if attempts != 2 { + t.Fatal("insertion was rebased after an unknown commit") + } +} + +func TestProducerCloseCancelsReconnect(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + attempted := make(chan struct{}, 1) + p.dial = func(context.Context) (producerClient, error) { attempted <- struct{}{}; return nil, io.EOF } + p.Replace("solar/program", nil) + <-attempted + stopped := make(chan struct{}) + go func() { p.Close(); close(stopped) }() + select { + case <-stopped: + case <-time.After(time.Second): + t.Fatal("shutdown stuck in retry") + } +} + +func TestProducerProtocolFailureIsTerminal(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + p.dial = func(context.Context) (producerClient, error) { return nil, errors.New("INCOMPATIBLE_HELLO") } + p.Replace("solar/program", nil) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := p.Flush(ctx); err == nil || !p.Status().Terminal || p.Status().Reconnects != 0 { + t.Fatal("protocol failure was retried", err, p.Status()) + } +} + +func TestProducerRebasesRepeatedProvenConcurrentRejections(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + attempts := 0 + p.dial = func(context.Context) (producerClient, error) { + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + value := request.(map[string]any) + if value["kind"] == "state.read" { + return json.RawMessage(`{"state":{"external":"preserved"}}`), nil + } + attempts++ + if attempts <= 3 { + return nil, &native.WireError{Code: "BASE_MISMATCH", Outcome: "rejected"} + } + raw, _ := json.Marshal(map[string]any{"level": "applied", "target": value["target"], "transactionId": value["id"]}) + return raw, nil + }}, nil + } + p.Apply("orion/state", []map[string]any{{"op": "add", "path": "/own", "value": "one"}}) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := p.Flush(ctx); err != nil || attempts != 4 { + t.Fatalf("bounded conflict recovery failed: %v attempts=%d", err, attempts) + } +} diff --git a/internal/lsdpreception/route_retention_test.go b/internal/lsdpreception/route_retention_test.go new file mode 100644 index 00000000..245a2323 --- /dev/null +++ b/internal/lsdpreception/route_retention_test.go @@ -0,0 +1,182 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "errors" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" + "io" + "os" + "sort" + "strings" + "testing" + "time" +) + +func TestProducerReleasesOnlyCompletedRoutesBeforeRetentionSaturates(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + records := map[string]bool{} + routes, released := 0, 0 + p.dial = func(context.Context) (producerClient, error) { + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + value := request.(map[string]any) + id, _ := value["id"].(string) + if value["kind"] == "route.forget" { + if value["force"] != false || !records[id] { + t.Error("attempted to release an unconfirmed route") + } + delete(records, id) + released++ + raw, _ := json.Marshal(map[string]any{"status": "forgotten", "id": id}) + return raw, nil + } + if len(records) >= 8 { + return nil, &native.WireError{Code: "ROUTE_BYTES", Outcome: "rejected"} + } + records[id] = true + routes++ + raw, _ := json.Marshal(map[string]any{"status": "completed", "id": id}) + return raw, nil + }}, nil + } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + for i := 0; i < 256; i++ { + p.Replace("solar/preview", map[string]any{"revision": i}) + if err := p.Flush(ctx); err != nil { + t.Fatalf("replacement %d exhausted retained route memory: %v", i, err) + } + } + if routes != 256 || released != routes || len(records) != 0 { + t.Fatalf("routes=%d released=%d retained=%d", routes, released, len(records)) + } +} + +func TestProducerNeverReleasesAnUnconfirmedRoute(t *testing.T) { + for _, receipt := range []string{`{"status":"incomplete"}`, `{"status":"completed","id":"another-route"}`, `{"status":"rejected"}`} { + t.Run(receipt, func(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + releases := 0 + p.dial = func(context.Context) (producerClient, error) { + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + if request.(map[string]any)["kind"] == "route.forget" { + releases++ + } + return json.RawMessage(receipt), nil + }}, nil + } + p.Replace("solar/preview", map[string]any{"revision": 1}) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := p.Flush(ctx); err == nil || releases != 0 { + t.Fatalf("unconfirmed receipt accepted: err=%v releases=%d", err, releases) + } + }) + } +} + +// The harness owns a disposable Rust node with a 128 KiB routing budget. This +// must never target the shared application: the no-release control saturates it. +func TestRealNativeRouteRetention(t *testing.T) { + address := os.Getenv("ORION_TEST_ROUTE_RETENTION_ADDRESS") + if address == "" { + t.Skip("requires disposable native receiver with bounded routing budget") + } + ctx, cancel := context.WithTimeout(context.Background(), 90*time.Second) + defer cancel() + r := &Reception{Address: address, Resource: "orion/state"} + c, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer c.Close() + payload := map[string]any{"revision": 0, "padding": strings.Repeat("x", 8192)} + var retained []string + var rejection *native.WireError + for i := 0; i < 32; i++ { + id, err := native.NewID() + if err != nil { + t.Fatal(err) + } + raw, err := c.SendPort(ctx, id, "orion/state", "orion.state/1", payload) + if err != nil { + if !errors.As(err, &rejection) || rejection.Code != "ROUTE_BYTES" { + t.Fatalf("no-release control: %v", err) + } + break + } + if err := completedRoute(raw, id); err != nil { + t.Fatal(err) + } + retained = append(retained, id) + } + if rejection == nil || len(retained) == 0 { + t.Fatal("no-release control did not exhaust the bounded receiver") + } + for _, id := range retained { + if err := forgetCompletedRoute(func(request any) (json.RawMessage, error) { return c.Exchange(ctx, request) }, id); err != nil { + t.Fatal(err) + } + } + p := NewProducer(ctx, r) + defer p.Close() + var durations []float64 + for i := 1; i <= 2048; i++ { + payload["revision"] = i + start := time.Now() + p.Replace("orion/state", payload) + if err := p.Flush(ctx); err != nil { + t.Fatalf("replacement %d: %v", i, err) + } + durations = append(durations, float64(time.Since(start).Microseconds())/1000) + } + for i := 2049; i <= 2176; i++ { + payload["revision"] = i + if err := r.Replace(ctx, "orion/state", payload); err != nil { + t.Fatalf("control replacement %d: %v", i, err) + } + } + raw, err := c.Exchange(ctx, map[string]any{"kind": "state.read", "target": "orion/state"}) + if err != nil { + t.Fatal(err) + } + var final struct{ State struct{ Revision int } } + if json.Unmarshal(raw, &final) != nil || final.State.Revision != 2176 || p.Status().Terminal || p.Status().Delivered != 2048 { + t.Fatalf("final state or health invalid: %s %+v", raw, p.Status()) + } + sort.Float64s(durations) + t.Logf("REAL_ROUTE_RETENTION_PROOF no_release_rejection=ROUTE_BYTES retained_before_rejection=%d producer_replacements=2048 control_replacements=128 final_revision=%d producer_p50_ms=%.3f producer_p95_ms=%.3f terminal=false", len(retained), final.State.Revision, durations[len(durations)/2], durations[len(durations)*95/100]) +} + +func TestProducerRetriesReleaseAfterLostReceiptWithoutReplayingCompletedRoute(t *testing.T) { + p := NewProducer(context.Background(), &Reception{}) + defer p.Close() + p.retryDelay = time.Millisecond + routes, releases := 0, 0 + p.dial = func(context.Context) (producerClient, error) { + return recoveryClient{exchange: func(request any) (json.RawMessage, error) { + value := request.(map[string]any) + if value["kind"] == "route.forget" { + releases++ + if releases == 1 { + return nil, io.EOF + } + return json.RawMessage(`{"status":"unknown"}`), nil + } + routes++ + raw, _ := json.Marshal(map[string]any{"status": "completed", "id": value["id"]}) + return raw, nil + }}, nil + } + p.Replace("solar/preview", map[string]any{"revision": 1}) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + if routes != 1 || releases != 2 { + t.Fatalf("completed route was replayed: routes=%d releases=%d", routes, releases) + } +} diff --git a/internal/lsdpreception/session.go b/internal/lsdpreception/session.go new file mode 100644 index 00000000..19dd4240 --- /dev/null +++ b/internal/lsdpreception/session.go @@ -0,0 +1,59 @@ +package lsdpreception + +import ( + "net/http" + + "github.com/ZabLaboratory/Orion/internal/compiler" + "github.com/ZabLaboratory/Orion/internal/lsdp" + "github.com/ZabLaboratory/Orion/internal/runtime" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +type sessionWire struct{ mirror *Mirror } + +func (h *Hub) NewSessionWire(sceneID, version string, bundle *compiler.RenderBundle) runtime.SessionWire { + id, err := native.NewID() + if err != nil { + h.producer.fail(err) + return &sessionWire{} + } + return h.NewSessionWireFor(id, sceneID, version, bundle) +} +func (h *Hub) NewSessionWireFor(sessionID, sceneID, version string, bundle *compiler.RenderBundle) runtime.SessionWire { + h.mu.Lock() + defer h.mu.Unlock() + if bundle == nil { + h.producer.fail(http.ErrMissingFile) + return &sessionWire{} + } + document, err := sourceDocument(sceneID, version, bundle.SourceLSML) + if err != nil { + h.producer.fail(err) + return &sessionWire{} + } + m := &Mirror{hub: h, key: sessionID, sceneID: sceneID, version: version, document: document, surface: lsdp.RenderSurface(sceneID, bundle.SourceLSML, h.logger), session: true} + h.producer.Apply("solar/sessions", []map[string]any{{"op": "add", "path": "/" + pointer(sessionID), "value": document}}) + return &sessionWire{mirror: m} +} +func (s *sessionWire) Mirror() runtime.SceneMirror { + if s.mirror == nil { + return nil + } + return s.mirror +} + +// No retired WS endpoint: the authenticated session API returns the native selector. +func (s *sessionWire) Handler() http.Handler { return http.NotFoundHandler() } +func (s *sessionWire) Close() { + if s.mirror == nil { + return + } + h := s.mirror.hub + h.mu.Lock() + defer h.mu.Unlock() + if s.mirror.document == nil { + return + } + s.mirror.document = nil + h.producer.Apply("solar/sessions", []map[string]any{{"op": "remove", "path": "/" + pointer(s.mirror.key)}}) +} diff --git a/internal/lsdpreception/surface_native_test.go b/internal/lsdpreception/surface_native_test.go new file mode 100644 index 00000000..6bf322eb --- /dev/null +++ b/internal/lsdpreception/surface_native_test.go @@ -0,0 +1,132 @@ +package lsdpreception + +import ( + "bytes" + "context" + "encoding/json" + "log/slog" + "os" + "testing" + "time" + + "github.com/ZabLaboratory/Orion/internal/bluehost" + "github.com/ZabLaboratory/Orion/internal/canonical" + "github.com/ZabLaboratory/Orion/internal/providers" + native "github.com/ZabLaboratory/Orion/third_party/lsdpnative" +) + +func TestRealNativeBlueStructuralMutation(t *testing.T) { + address, path := os.Getenv("ORION_TEST_LSDP_NATIVE_ADDRESS"), os.Getenv("ORION_TEST_LSML_PATH") + if address == "" || path == "" { + t.Skip("requires real native receiver and original LSML") + } + source, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var document map[string]any + if err := json.Unmarshal(source, &document); err != nil { + t.Fatal(err) + } + id, version := document["scene_id"].(string), document["scene_version"].(string) + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + r, err := New(address, "orion/state") + if err != nil { + t.Fatal(err) + } + p := NewProducer(ctx, r) + defer p.Close() + hub := NewHub(p, slog.Default()) + lane := hub.Lane("preview") + mirror := lane.MirrorForLSML(id, version, source).(*Mirror) + lane.SetActive(id) + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + defer func() { + p.Replace("solar/preview", document) + if err := p.Flush(ctx); err != nil { + t.Error(err) + } + }() + raw := nativeEffectProgram(t, "core.lsml", "mutate", map[string]any{"operations": []any{map[string]any{"op": "add", "path": "/layout/children/-", "value": map[string]any{"id": "native-blue-added", "kind": "frame", "background": "#808080", "size": map[string]any{"w": json.Number("40"), "h": json.Number("40")}}}}}) + host := bluehost.NewHost() + host.SetSceneMutationSink(func(slot bluehost.Slot, operations []map[string]any) error { + if slot != bluehost.SlotPreview { + t.Fatal("crossed Program lane") + } + return mirror.ApplyLSML(operations) + }) + if err := host.PreparePreview("structural-blue", id, version, raw, providers.Registry(), providers.Policy(false), nil); err != nil { + t.Fatal(err) + } + defer func() { + if err := host.Release(bluehost.SlotPreview, "proof-end"); err != nil { + t.Error(err) + } + }() + if _, err := host.Step(bluehost.SlotPreview); err != nil { + t.Fatal(err) + } + if err := p.Flush(ctx); err != nil { + t.Fatal(err) + } + client, err := native.Dial(ctx, address, "", nil) + if err != nil { + t.Fatal(err) + } + defer client.Close() + state, err := client.Exchange(ctx, map[string]any{"kind": "state.read", "target": "solar/preview"}) + if err != nil { + t.Fatal(err) + } + var snapshot struct{ State map[string]any } + if err := json.Unmarshal(state, &snapshot); err != nil { + t.Fatal(err) + } + children := snapshot.State["layout"].(map[string]any)["children"].([]any) + if children[len(children)-1].(map[string]any)["id"] != "native-blue-added" || snapshot.State["scene_version"] != version { + t.Fatal("Blue structural mutation absent or identity changed") + } +} + +func nativeEffectProgram(t *testing.T, capability, operation string, request map[string]any) []byte { + t.Helper() + raw, err := os.ReadFile("../bluespike/testdata/02-http-requires.program.json") + if err != nil { + t.Fatal(err) + } + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + var program map[string]any + if err := decoder.Decode(&program); err != nil { + t.Fatal(err) + } + for _, row := range program["effects"].([]any) { + effect := row.(map[string]any) + effect["capability"] = capability + effect["operation"] = operation + } + for _, row := range program["requires"].([]any) { + requirement := row.(map[string]any) + requirement["capability"] = capability + requirement["operation"] = operation + } + for _, row := range program["data_literals"].([]any) { + literal := row.(map[string]any) + if literal["node_id"] == "http-call" { + literal["value"] = request + } + } + delete(program, "program_digest") + program["program_digest"], err = canonical.Digest(program) + if err != nil { + t.Fatal(err) + } + raw, err = json.Marshal(program) + if err != nil { + t.Fatal(err) + } + return raw +} diff --git a/internal/lsdpreception/transition_test.go b/internal/lsdpreception/transition_test.go new file mode 100644 index 00000000..0120a040 --- /dev/null +++ b/internal/lsdpreception/transition_test.go @@ -0,0 +1,35 @@ +package lsdpreception + +import ( + "context" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/protocol" + "testing" +) + +func TestLaneFreezesCameraAndBlueProjectionAndRestoresLatestAuthority(t *testing.T) { + p := &Producer{ctx: context.Background(), queue: make(chan delivery, 8)} + h := NewHub(p, nil) + lane := h.Lane("program") + source := []byte(`{"lsml":"1.2","scene_id":"scene-1","scene_version":"v1","layout":{"type":"frame"},"defaults":{}}`) + mirror := lane.MirrorForLSML("scene-1", "v1", source) + lane.SetActive("scene-1") + <-p.queue + for _, restore := range []bool{true, false} { + finish := lane.BeginTransition() + lane.EmitSlotAssignment("host", "new-camera") + mirror.Forward(&protocol.Snapshot{State: map[string]json.RawMessage{"title": json.RawMessage(`"unsafe"`)}}) + if len(p.queue) != 0 { + t.Fatal("projection escaped transition freeze") + } + finish(restore) + job := <-p.queue + var document map[string]any + if err := json.Unmarshal(job.document.(json.RawMessage), &document); err != nil { + t.Fatal(err) + } + if document["defaults"].(map[string]any)["__cam.slots.host"] != "new-camera" { + t.Fatal("latest camera authority lost") + } + } +} diff --git a/internal/lsdpreception/tree.go b/internal/lsdpreception/tree.go new file mode 100644 index 00000000..51002514 --- /dev/null +++ b/internal/lsdpreception/tree.go @@ -0,0 +1,135 @@ +package lsdpreception + +import ( + "bytes" + "crypto/sha256" + "encoding/binary" + "encoding/hex" + "encoding/json" + "errors" + "math" + "sort" + "strconv" + "strings" +) + +// Normative LSDP tree hash; distinct from LSML scene_version (JCS). +// Number spelling matches ECMAScript's shortest binary64 JSON representation. +func treeHash(value any) string { + digest := hashNode(value) + return "tree-sha256:" + hex.EncodeToString(digest) +} +func digest(parts ...[]byte) []byte { + h := sha256.New() + for _, p := range parts { + h.Write(p) + } + return h.Sum(nil) +} +func size(n int) []byte { b := make([]byte, 8); binary.BigEndian.PutUint64(b, uint64(n)); return b } +func number(v float64) string { + if v == 0 { + return "0" + } + if math.Abs(v) >= 1e-6 && math.Abs(v) < 1e21 { + return strconv.FormatFloat(v, 'f', -1, 64) + } + s := strconv.FormatFloat(v, 'e', -1, 64) + pieces := strings.Split(s, "e") + n, _ := strconv.Atoi(pieces[1]) + sign := "" + if n >= 0 { + sign = "+" + } + return pieces[0] + "e" + sign + strconv.Itoa(n) +} +func hashNode(value any) []byte { + switch v := value.(type) { + case nil: + return digest([]byte("n")) + case bool: + if v { + return digest([]byte("t")) + } + return digest([]byte("f")) + case float64: + return digest([]byte("d" + number(v))) + case string: + return digest([]byte("s"), size(len([]byte(v))), []byte(v)) + case []any: + parts := [][]byte{[]byte("a"), size(len(v))} + for _, item := range v { + parts = append(parts, hashNode(item)) + } + return digest(parts...) + case map[string]any: + keys := make([]string, 0, len(v)) + for key := range v { + keys = append(keys, key) + } + sort.Strings(keys) + var walk func([]string) []byte + walk = func(ks []string) []byte { + if len(ks) == 0 { + return digest([]byte("LSDP-MAP-EMPTY/1")) + } + root := 0 + priority := sha256.Sum256([]byte(ks[0])) + for i := 1; i < len(ks); i++ { + candidate := sha256.Sum256([]byte(ks[i])) + cmp := bytes.Compare(candidate[:], priority[:]) + if cmp > 0 || (cmp == 0 && ks[i] > ks[root]) { + root = i + priority = candidate + } + } + key := ks[root] + return digest([]byte("LSDP-MAP-NODE/1"), walk(ks[:root]), size(len([]byte(key))), []byte(key), hashNode(v[key]), walk(ks[root+1:])) + } + return digest([]byte("o"), size(len(keys)), walk(keys)) + default: + panic("non-JSON native state") + } +} + +// Apply on an owned clone so any failed operation rolls back the full batch. +func applyObjectOperations(state any, ops []map[string]any) (any, error) { + raw, err := json.Marshal(map[string]any{"state": state, "ops": ops}) + if err != nil { + return nil, err + } + var owned struct { + State any `json:"state"` + Ops []map[string]any `json:"ops"` + } + if err = json.Unmarshal(raw, &owned); err != nil { + return nil, err + } + next := owned.State + for _, operation := range owned.Ops { + path, ok := operation["path"].(string) + if !ok || !strings.HasPrefix(path, "/") { + return nil, errors.New("NATIVE_OBJECT_POINTER_REQUIRED") + } + parts := strings.Split(path[1:], "/") + for i, part := range parts { + for k := 0; k < len(part); k++ { + if part[k] == '~' { + if k+1 >= len(part) || (part[k+1] != '0' && part[k+1] != '1') { + return nil, errors.New("NATIVE_PATCH_POINTER_ESCAPE") + } + k++ + } + } + parts[i] = strings.ReplaceAll(strings.ReplaceAll(part, "~1", "/"), "~0", "~") + } + next, err = patchNode(next, parts, operation) + if err != nil { + return nil, err + } + } + return next, nil +} +func pointer(key string) string { + return strings.ReplaceAll(strings.ReplaceAll(key, "~", "~0"), "/", "~1") +} diff --git a/internal/providers/events.go b/internal/providers/events.go index 452a3287..ced635c2 100644 --- a/internal/providers/events.go +++ b/internal/providers/events.go @@ -77,10 +77,6 @@ type ActiveIngress struct { origins map[string]uint64 } -// Ingress is a short compatibility alias for callers that do not need the -// more explicit ActiveIngress name. -type Ingress = ActiveIngress - // NewActiveIngress creates an ingress bound to one host. The host remains the // owner of preview/on-air instances; this adapter stores no scene roster or // durable event state. @@ -92,11 +88,6 @@ func NewActiveIngress(host *bluehost.Host) *ActiveIngress { } } -// NewIngress is an alias for NewActiveIngress. -func NewIngress(host *bluehost.Host) *ActiveIngress { - return NewActiveIngress(host) -} - var activeIngresses sync.Map // map[*bluehost.Host]*ActiveIngress func ingressFor(host *bluehost.Host) *ActiveIngress { diff --git a/internal/providers/providers.go b/internal/providers/providers.go index c47ac362..f0dd507a 100644 --- a/internal/providers/providers.go +++ b/internal/providers/providers.go @@ -2,9 +2,8 @@ // descriptors (ADR-BLUE-012 §4.3/§6.6) — the "menu" bluehost.Host.Prepare/ // Take pass to blueruntime.StartOptions.Providers so a program declaring // `requires` can be admitted by checkProviders. Blue defines the abstract -// capability shape; this package is the Zab adaptation for the three -// capabilities Orion currently serves: HTTP egress, stream-level output -// emission, and overlay-app configuration (no store). +// capability shape; this package adapts HTTP, DB, service calls, camera slots, +// show events, overlay control, native LSML mutations and Vision animations. package providers import ( @@ -82,8 +81,8 @@ func showEmitProvider() map[string]any { } // overlayAppProvider is the `core.overlay-app` capability — invoking an -// overlay-hosted app surface. Explicitly stateless: no store backs an -// overlay-app instance, this provider is a pure invocation contract. +// overlay-hosted app surface. The provider is an invocation contract; +// Orion's stream controller owns its durable desired state and local process. // operation "set" mirrors the existing Blue node core.overlay-app.set@1 // (verb-mirrors-action pattern) — NOT "invoke", so a future `requires` // emitted for that node matches this descriptor exactly. @@ -124,5 +123,24 @@ func Registry() []map[string]any { httpRequestProvider(), showEmitProvider(), overlayAppProvider(), + localProvider("core.db.query", "emulated", "query"), + localProvider("core.service.call", "emulated", "call"), + localProvider("zabcam.slots", "unsupported", "assign", "release"), + localProvider("core.lsml", "emulated", "mutate"), + localProvider("core.animation", "emulated", "play"), } } + +func localProvider(capability, preview string, names ...string) map[string]any { + operations := make([]any, 0, len(names)) + for _, name := range names { + operations = append(operations, map[string]any{ + "name": name, "request_type": "core.json", "response_type": "core.json", + "preview": preview, "execute": "allowed", "idempotency": "unsupported", + "cancellation": "unsupported", "deadline": "unsupported", + "limits": map[string]any{"max_in_flight": num(16), "max_payload_bytes": num(1 << 18), "max_deadline_ms": num(0)}, + "backpressure": "reject", "error_codes": []any{"PROVIDER_FAILED"}, + }) + } + return map[string]any{"schema_version": "blue.capability-provider.v1", "capability": capability, "version": "1", "health": "healthy", "operations": operations} +} diff --git a/internal/runtime/editable_targets.go b/internal/runtime/editable_targets.go new file mode 100644 index 00000000..de2d0394 --- /dev/null +++ b/internal/runtime/editable_targets.go @@ -0,0 +1,150 @@ +package runtime + +import ( + "context" + "encoding/json" + "github.com/ZabLaboratory/Orion/internal/compiler" +) + +// EditableHead identifies one currently active actor. Its writer ID survives a +// Take and changes on structural replacement; retired actors have no read path. +type EditableHead struct { + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + EditSeq uint64 `json:"edit_seq"` + WriterID string `json:"writer_id"` +} + +type EditableSnapshot struct { + Head EditableHead + roleEpoch uint64 +} + +func (p *PreviewSlot) SetEditableProgramWire(wire PreviewWire) { + p.mu.Lock() + defer p.mu.Unlock() + p.programWire = wire +} + +func (p *PreviewSlot) editableTargetLocked(target string) *previewClone { + if target == "program" { + if !p.nativeAir { + return nil + } + return p.airCurrent + } + if target == "preview" { + return p.current + } + return nil +} + +func editableHead(cur *previewClone) EditableHead { + if cur == nil { + return EditableHead{} + } + return EditableHead{cur.sceneID, cur.sceneVersion, cur.editSeq, cur.writerID} +} + +func (p *PreviewSlot) EditableTargetHead(target string) (EditableHead, bool) { + snapshot, editable := p.EditableTargetSnapshot(target) + return snapshot.Head, editable +} + +func (p *PreviewSlot) EditableTargetSnapshot(target string) (EditableSnapshot, bool) { + p.mu.Lock() + defer p.mu.Unlock() + cur := p.editableTargetLocked(target) + return EditableSnapshot{editableHead(cur), p.roleEpoch}, cur != nil && cur.editable +} + +// EditableTargetState waits for accepted actor inputs before returning its live +// defaults. Callers pin the Host lane against writes/Take during this read. +func (p *PreviewSlot) EditableTargetState(ctx context.Context, target, sceneID string) (EditableHead, map[string]json.RawMessage, error) { + p.mu.Lock() + cur := p.editableTargetLocked(target) + if cur == nil || cur.sceneID != sceneID || !cur.editable { + p.mu.Unlock() + return EditableHead{}, nil, ErrPreviewSceneMismatch + } + head := editableHead(cur) + epoch := p.roleEpoch + p.mu.Unlock() + if err := cur.scene.Flush(ctx); err != nil { + return EditableHead{}, nil, err + } + _, _, state := cur.scene.SnapshotState() + p.mu.Lock() + defer p.mu.Unlock() + if p.editableTargetLocked(target) != cur || editableHead(cur) != head || p.roleEpoch != epoch { + return EditableHead{}, nil, ErrPreviewEditSequence + } + return head, state, nil +} + +// ReplaceEditableTarget fences compilation against the actor and sequence read +// before it started. The Host admission callback and native mirror replacement +// run while roles are pinned, so a Take or hot edit cannot redirect the snapshot. +func (p *PreviewSlot) ReplaceEditableTarget(target, sceneID, writerID string, baseSeq *uint64, expected EditableSnapshot, graph *compiler.Graph, bundle *compiler.RenderBundle, editSeq uint64, source []byte, before func() error) error { + p.mu.Lock() + defer p.mu.Unlock() + cur := p.editableTargetLocked(target) + if target != "preview" && target != "program" { + return ErrPreviewSceneMismatch + } + if editableHead(cur) != expected.Head || p.roleEpoch != expected.roleEpoch { + return ErrPreviewEditSequence + } + if target == "program" { + if cur == nil || cur.sceneID != sceneID { + return ErrPreviewSceneMismatch + } + if !cur.editable || p.programWire == nil { + return ErrPreviewNotEditable + } + if writerID == "" || baseSeq == nil { + return ErrPreviewEditSequence + } + } + if writerID != "" && (cur == nil || cur.writerID != writerID) { + return ErrPreviewEditSequence + } + if baseSeq != nil && (cur == nil || cur.editSeq != *baseSeq) { + return ErrPreviewEditSequence + } + if cur != nil && cur.sceneID == sceneID && editSeq < cur.editSeq { + return ErrPreviewEditSequence + } + if before != nil { + if err := before(); err != nil { + return err + } + } + p.activateLocked(target, sceneID, graph, bundle, true, editSeq, source, nil) + return nil +} + +func (p *PreviewSlot) FlushEditableTarget(ctx context.Context, target string) error { + p.mu.Lock() + cur := p.editableTargetLocked(target) + p.mu.Unlock() + if cur == nil { + return nil + } + return cur.scene.Flush(ctx) +} + +func (p *PreviewSlot) EditableTargetMirror(target string) SceneMirror { + p.mu.Lock() + defer p.mu.Unlock() + cur := p.editableTargetLocked(target) + if cur == nil || cur.mirror == nil { + return nil + } + cur.mirror.mu.RLock() + defer cur.mirror.mu.RUnlock() + if len(cur.mirror.mirrors) == 0 { + return nil + } + return cur.mirror.mirrors[0] +} diff --git a/internal/runtime/editable_targets_test.go b/internal/runtime/editable_targets_test.go new file mode 100644 index 00000000..54742406 --- /dev/null +++ b/internal/runtime/editable_targets_test.go @@ -0,0 +1,108 @@ +package runtime + +import ( + "context" + "encoding/json" + "errors" + "io" + "log/slog" + "testing" + + "github.com/ZabLaboratory/Orion/internal/compiler" +) + +func TestEditableTargetsFollowActorAndFenceStructuralSnapshots(t *testing.T) { + wire := &editablePreviewWire{out: make(chan SubscriberMsg, 64)} + program := &editablePreviewWire{out: make(chan SubscriberMsg, 64)} + p := NewPreviewSlot(context.Background(), NewComputeRegistry(), wire, slog.New(slog.NewTextHandler(io.Discard, nil))) + p.SetEditableProgramWire(program) + defer p.Close() + g := &compiler.Graph{SceneID: "a", SceneVersion: "v1", Defaults: map[string]json.RawMessage{"__editable.x": json.RawMessage(`10`)}} + b := &compiler.RenderBundle{SceneVersion: "v1"} + p.ActivateEditable("a", g, b, 4) + head, _ := p.EditableTargetHead("preview") + actor := p.Current() + finish, err := p.StageRoleSwap("a") + if err != nil { + t.Fatal(err) + } + finish(true) + air, ok := p.EditableTargetHead("program") + if !ok || air != head { + t.Fatal("Take changed author identity", air, head) + } + patches := []EditablePatch{{Path: "__editable.x", Value: json.RawMessage(`20`)}} + if err = p.ApplyEditableTargetPatches("preview", "a", head.WriterID, 4, 5, patches); !errors.Is(err, ErrPreviewSceneMismatch) { + t.Fatal("old role accepted", err) + } + if err = p.ApplyEditableTargetPatches("program", "a", "retired", 4, 5, patches); !errors.Is(err, ErrPreviewEditSequence) { + t.Fatal("retired writer accepted", err) + } + fence, _ := p.EditableTargetSnapshot("program") + if err = p.ApplyEditableTargetPatches("program", "a", head.WriterID, 4, 5, patches); err != nil { + t.Fatal(err) + } + if err = p.FlushEditableTarget(context.Background(), "program"); err != nil { + t.Fatal(err) + } + _, _, state := actor.SnapshotState() + if string(state["__editable.x"]) != "20" { + t.Fatal(state) + } + base := uint64(5) + called := false + before := func() error { called = true; return nil } + if err = p.ReplaceEditableTarget("program", "a", head.WriterID, &base, fence, g, b, 6, nil, before); !errors.Is(err, ErrPreviewEditSequence) || called { + t.Fatal("stale compilation mutated host", err, called) + } + head, _ = p.EditableTargetHead("program") + fence, _ = p.EditableTargetSnapshot("program") + if err = p.ReplaceEditableTarget("program", "other", head.WriterID, &base, fence, g, b, 6, nil, before); !errors.Is(err, ErrPreviewSceneMismatch) || called { + t.Fatal("wrong scene mutated host", err, called) + } + if err = p.ReplaceEditableTarget("program", "a", head.WriterID, &base, fence, g, b, 6, nil, before); err != nil { + t.Fatal(err) + } + next, _ := p.EditableTargetHead("program") + if !called || next.WriterID == head.WriterID || next.EditSeq != 6 || program.activeIDs[0] != "a" { + t.Fatal("wrong structural target", next, program.activeIDs) + } + if err = p.ApplyEditableTargetPatches("program", "a", head.WriterID, 6, 7, patches); !errors.Is(err, ErrPreviewEditSequence) { + t.Fatal("old actor writer accepted after replacement", err) + } +} + +func TestEditableSnapshotFencesRoleSwapWithoutEditableActors(t *testing.T) { + p := NewPreviewSlot(context.Background(), NewComputeRegistry(), &editablePreviewWire{out: make(chan SubscriberMsg, 8)}, slog.New(slog.NewTextHandler(io.Discard, nil))) + defer p.Close() + fence, _ := p.EditableTargetSnapshot("preview") + finish, err := p.StageRoleSwap("blue") + if err != nil { + t.Fatal(err) + } + finish(true) + called := false + err = p.ReplaceEditableTarget("preview", "a", "", nil, fence, &compiler.Graph{SceneID: "a", SceneVersion: "v1"}, &compiler.RenderBundle{SceneVersion: "v1"}, 0, nil, func() error { called = true; return nil }) + if !errors.Is(err, ErrPreviewEditSequence) || called { + t.Fatal("stale snapshot followed new physical role", err, called) + } +} + +func TestLegacyEditableGenerationIsNotNativeProgramAuthor(t *testing.T) { + p := NewPreviewSlot(context.Background(), NewComputeRegistry(), &editablePreviewWire{out: make(chan SubscriberMsg, 16)}, slog.New(slog.NewTextHandler(io.Discard, nil))) + p.SetEditableProgramWire(&editablePreviewWire{out: make(chan SubscriberMsg, 16)}) + p.SetEditableAirWire(&editableAirWire{out: make(chan SubscriberMsg, 16)}) + defer p.Close() + g := &compiler.Graph{SceneID: "a", SceneVersion: "v1"} + p.ActivateEditableWithBundle("a", g, &compiler.RenderBundle{SceneVersion: "v1"}, 0, []byte(`{"scene_id":"a"}`)) + if _, err := p.PromoteEditable("a", "legacy-generation"); err != nil { + t.Fatal(err) + } + if _, ok := p.EditableTargetHead("program"); ok { + t.Fatal("generation exposed as physical Program") + } + p.ReleasePreview() + if _, _, err := p.EditableTargetState(context.Background(), "program", "a"); !errors.Is(err, ErrPreviewSceneMismatch) { + t.Fatal("generation read as active Program", err) + } +} diff --git a/internal/runtime/preview.go b/internal/runtime/preview.go index ea0aaec0..defe74eb 100644 --- a/internal/runtime/preview.go +++ b/internal/runtime/preview.go @@ -2,6 +2,7 @@ package runtime import ( "context" + "crypto/rand" "encoding/json" "errors" "log/slog" @@ -13,15 +14,9 @@ import ( "github.com/ZabLaboratory/Orion/internal/protocol" ) -// PreviewWire is the persistent LSDP/1.1 wire dedicated to the cockpit -// preview — a SECOND wire beside the antenne's /show/stream.lsdp. The cockpit -// Solar connects to it ONCE (a fixed URL); switching the previewed scene swaps -// the wire's active clone via SetActive (the proven antenne switch path — -// scene_changed + fresh snapshot over the EXISTING socket, no client reload), -// so a preview switch never reconnects and never touches the antenne. The -// scenes mirrored here are PREVIEW CLONES, fully isolated from the global show. -// *lsdp.Wire satisfies this interface (MirrorFor/SetActive/Drop already exist); -// the interface lives in runtime to keep the import direction lsdp → runtime. +// PreviewWire projects isolated Preview clones through a role-stable resource. +// Production uses the native solar/preview lane; compatibility adapters also +// implement this lifecycle seam. Switching never touches Program's active scene. type PreviewWire interface { MirrorFor(sceneID, sceneVersion string, bundle *compiler.RenderBundle) SceneMirror SetActive(sceneID string) @@ -79,19 +74,19 @@ func (f *sceneMirrorFanout) Forward(message SubscriberMsg) { // preview/antenne split: a preview scene switch can no longer flip the live // antenne. nil in bespoke mode (no preview wire) — the preview routes degrade. type PreviewSlot struct { - registry *ComputeRegistry - logger *slog.Logger - wire PreviewWire + registry *ComputeRegistry + logger *slog.Logger + wire PreviewWire + programWire PreviewWire + roleEpoch uint64 mu sync.Mutex ctx context.Context current *previewClone - // editable keeps already-compiled no-Blue clones warm while a regular - // scene temporarily owns the Preview wire. Re-selecting an editable scene - // is therefore only a Wire.SetActive operation: no LSML compilation, no - // clone restart and no Solar/Pulsar reconnection. - editable map[string]*previewClone - effects *SceneEffects + // Only the current Preview and an explicitly active on-air generation live. + airCurrent *previewClone + nativeAir bool + effects *SceneEffects // editableAir is deliberately separate from the persistent Preview wire. // A promotion adds a generation mirror to the clone's fan-out; it never // reuses or retargets the Program/antenne wire. @@ -104,10 +99,12 @@ type previewClone struct { scene *Scene bundle []byte lsmlBundle []byte + assets map[string][]byte mirror *sceneMirrorFanout editable bool editSeq uint64 airPromoted bool + writerID string } var ( @@ -134,7 +131,6 @@ func NewPreviewSlot(ctx context.Context, registry *ComputeRegistry, wire Preview logger: logger.With("component", "preview-slot"), wire: wire, ctx: ctx, - editable: make(map[string]*previewClone), } } @@ -168,7 +164,7 @@ func (p *PreviewSlot) SetEditableAirWire(wire EditableAirWire) { // Re-activating the same scene rebuilds a fresh clone (reseeds defaults + // fires on-start), matching a push-swap of the live scene on the antenne. func (p *PreviewSlot) Activate(sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, progs ...*ExecProgram) { - p.activate(sceneID, graph, bundle, false, 0, nil, progs...) + p.activate(sceneID, graph, bundle, false, 0, nil, nil, progs...) } // ActivateStatic installs a no-Blue render bundle in the editable preview @@ -186,21 +182,29 @@ func (p *PreviewSlot) ActivateStatic(sceneID string, bundle *compiler.RenderBund Bindings: bundle.ExternalAdapters, OperatorInputs: bundle.OperatorInputs, } - p.activate(sceneID, graph, bundle, true, 0, nil) + p.activate(sceneID, graph, bundle, true, 0, nil, nil) return nil } -func (p *PreviewSlot) activate(sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, editable bool, editSeq uint64, lsmlBundle []byte, progs ...*ExecProgram) { +func (p *PreviewSlot) activate(sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, editable bool, editSeq uint64, lsmlBundle []byte, assets map[string][]byte, progs ...*ExecProgram) { p.mu.Lock() defer p.mu.Unlock() + p.activateLocked("preview", sceneID, graph, bundle, editable, editSeq, lsmlBundle, assets, progs...) +} - prev := p.current - replaced := p.editable[sceneID] +func (p *PreviewSlot) activateLocked(target, sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, editable bool, editSeq uint64, lsmlBundle []byte, assets map[string][]byte, progs ...*ExecProgram) { + prev, wire := p.current, p.wire + if target == "program" { + prev, wire = p.airCurrent, p.programWire + } // Clone the compiled artefacts so the preview's reactive loop owns private // inputs — the antenne instance of the same scene is untouched. gcopy := *graph bcopy := *bundle + if len(lsmlBundle) > 0 { + bcopy.SourceLSML = append([]byte(nil), lsmlBundle...) + } scene := NewScene(sceneID, &gcopy, &bcopy, p.registry, p.logger.With("preview_scene", sceneID)) scene.InstallExec(progs...) // Install the world-effect ops (db.query, http.request, …) on the clone @@ -228,14 +232,14 @@ func (p *PreviewSlot) activate(sceneID string, graph *compiler.Graph, bundle *co // Pair with the PREVIEW wire before Run (SetMirror seeds the kit scene with // the clone's snapshot). MirrorFor registers the kit scene under sceneID on // the preview wire ONLY — never the antenne wire (a different Server). - mirror := newSceneMirrorFanout(p.wire.MirrorFor(sceneID, gcopy.SceneVersion, &bcopy)) + mirror := newSceneMirrorFanout(wire.MirrorFor(sceneID, gcopy.SceneVersion, &bcopy)) scene.SetMirror(mirror) go scene.Run(p.ctx) scene.FireOnStart("system:preview-activated") // Flip the preview wire's live endpoint to this clone: the connected // preview Solar migrates (scene_changed + fresh snapshot) over its EXISTING // socket — no reload. Identical mechanism to the antenne's Show.SetActive. - p.wire.SetActive(sceneID) + wire.SetActive(sceneID) bundleBytes, err := json.Marshal(&bcopy) if err != nil { // RenderBundle is composed entirely of JSON-backed fields and was @@ -251,30 +255,28 @@ func (p *PreviewSlot) activate(sceneID string, graph *compiler.Graph, bundle *co scene: scene, bundle: bundleBytes, lsmlBundle: append([]byte(nil), lsmlBundle...), + assets: cloneEditableAssets(assets), mirror: mirror, editable: editable, editSeq: editSeq, } - p.current = next - if editable { - p.editable[sceneID] = next + next.writerID = rand.Text() + if target == "program" { + next.airPromoted = true + p.airCurrent = next + p.nativeAir = true } else { - delete(p.editable, sceneID) + p.current = next } - - // Tear disposable clones down AFTER the flip (no preview gap). An editable - // clone with another id deliberately stays alive in p.editable so a later - // switch back is compilation-free. A same-id cached clone is replaced by - // the fresh structural build above and must be stopped exactly once. - if replaced != nil && replaced != next { - replaced.scene.Stop() - } - if prev != nil && prev != replaced && !prev.editable { - prev.scene.Stop() + if prev != nil { + if prev != p.airCurrent && prev != p.current { + prev.scene.Stop() + } if prev.sceneID != sceneID { - p.wire.Drop(prev.sceneID) + wire.Drop(prev.sceneID) } } + } // Bundle returns the exact compiled render tree owned by the persistent @@ -288,26 +290,44 @@ func (p *PreviewSlot) Bundle(sceneID, sceneVersion string) ([]byte, bool) { defer p.mu.Unlock() cur := p.current if cur == nil || cur.sceneID != sceneID { - cur = p.editable[sceneID] + cur = p.airCurrent } - if cur == nil || cur.sceneVersion != sceneVersion || len(cur.bundle) == 0 { + if cur == nil || cur.sceneID != sceneID || cur.sceneVersion != sceneVersion || len(cur.bundle) == 0 { return nil, false } return append([]byte(nil), cur.bundle...), true } +// EditableSource exposes only the immutable authoring base, never live defaults. +func (p *PreviewSlot) EditableSource(sceneID, sceneVersion string) ([]byte, map[string][]byte, bool) { + p.mu.Lock() + defer p.mu.Unlock() + clone := p.current + if clone == nil || clone.sceneID != sceneID { + clone = p.airCurrent + } + if sceneID == "" || sceneVersion == "" || clone == nil || clone.sceneID != sceneID || clone.sceneVersion != sceneVersion || len(clone.lsmlBundle) == 0 { + return nil, nil, false + } + return append([]byte(nil), clone.lsmlBundle...), cloneEditableAssets(clone.assets), true +} + // ActivateEditable arms a no-Blue preview clone and records the durable // ZabCanvas edit sequence that subsequent hot patches must extend. func (p *PreviewSlot) ActivateEditable(sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, editSeq uint64) { - p.activate(sceneID, graph, bundle, true, editSeq, nil) + p.activate(sceneID, graph, bundle, true, editSeq, nil, nil) } // ActivateEditableWithBundle is the source-preserving variant used by the // HTTP editable-preview route. Generation wires need the original LSML bytes // to derive their bound leaf surface; the compiled RenderBundle alone is not // a valid LSML bundle. -func (p *PreviewSlot) ActivateEditableWithBundle(sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, editSeq uint64, lsmlBundle []byte) { - p.activate(sceneID, graph, bundle, true, editSeq, lsmlBundle) +func (p *PreviewSlot) ActivateEditableWithBundle(sceneID string, graph *compiler.Graph, bundle *compiler.RenderBundle, editSeq uint64, lsmlBundle []byte, assets ...map[string][]byte) { + var sourceAssets map[string][]byte + if len(assets) > 0 { + sourceAssets = assets[0] + } + p.activate(sceneID, graph, bundle, true, editSeq, lsmlBundle, sourceAssets) } // PromoteEditable attaches the current no-Blue clone to its immutable @@ -318,8 +338,8 @@ func (p *PreviewSlot) ActivateEditableWithBundle(sceneID string, graph *compiler func (p *PreviewSlot) PromoteEditable(sceneID, owner string) (string, error) { p.mu.Lock() defer p.mu.Unlock() - clone := p.editable[sceneID] - if clone == nil || !clone.editable { + clone := p.current + if clone == nil || clone.sceneID != sceneID || !clone.editable { return "", ErrPreviewCacheMiss } if p.editableAir == nil || len(clone.lsmlBundle) == 0 { @@ -342,62 +362,76 @@ func (p *PreviewSlot) PromoteEditable(sceneID, owner string) (string, error) { State: state, }) p.editableAir.SetActive(sceneID, version) + if p.airCurrent != nil && p.airCurrent != clone { + p.airCurrent.scene.Stop() + } + p.airCurrent = clone + p.nativeAir = false clone.airPromoted = true return version, nil } -// ReactivateEditable flips Preview back to an already-compiled editable -// clone. expectedEditSeq binds Prism's durable ZabCanvas head to the cached -// runtime instance so stale UI state can never silently reactivate. The clone -// and its scene mirror stay alive while Blue owns Preview; only the preview -// wire's active scene changes here. +// ReactivateEditable is a compatibility validation for the current head only. +// It cannot restore a scene that no longer owns Preview. func (p *PreviewSlot) ReactivateEditable(sceneID string, expectedEditSeq uint64) error { p.mu.Lock() defer p.mu.Unlock() - next := p.editable[sceneID] - if next == nil { + next := p.current + if next == nil || next.sceneID != sceneID || !next.editable { return ErrPreviewCacheMiss } if next.editSeq != expectedEditSeq { return ErrPreviewEditSequence } - prev := p.current - if prev == next { - // Blue scene-intent uses the same persistent Preview wire but is - // intentionally owned by bluehost rather than PreviewSlot. In that - // path p.current still points at this warm clone while the wire has - // moved to Blue, so returning early would acknowledge activation - // without emitting the scene_changed/snapshot pair Solar needs. - // Reassert the wire even when the cached clone is already current; - // this is idempotent for an actually-active editable scene and closes - // the external-owner hand-off gap without rebuilding the clone. - p.wire.SetActive(sceneID) - return nil - } - p.wire.SetActive(sceneID) - p.current = next - if prev != nil && !prev.editable { - prev.scene.Stop() - if prev.sceneID != sceneID { - p.wire.Drop(prev.sceneID) + return nil +} + +// ReleasePreview drops the authoring clone when another owner commits Preview. +// An explicitly promoted Program generation is independent and remains active. +func (p *PreviewSlot) ReleasePreview(incoming ...string) { + p.mu.Lock() + defer p.mu.Unlock() + if p.current != nil { + if p.current != p.airCurrent { + p.current.scene.Stop() + } + if len(incoming) == 0 || incoming[0] != p.current.sceneID { + p.wire.Drop(p.current.sceneID) } } - return nil + p.current = nil +} + +func (p *PreviewSlot) ReleaseEditableAir() { + p.mu.Lock() + defer p.mu.Unlock() + if p.airCurrent != nil && p.airCurrent != p.current { + p.airCurrent.scene.Stop() + } + p.airCurrent = nil + p.nativeAir = false } // ApplyEditablePatches queues one atomic hot edit on the live preview clone. // All values travel through the existing scene mirror, so Solar receives a // real LSDP delta over its persistent socket; the antenna show is untouched. func (p *PreviewSlot) ApplyEditablePatches(sceneID string, baseSeq, editSeq uint64, patches []EditablePatch) error { + return p.ApplyEditableTargetPatches("preview", sceneID, "", baseSeq, editSeq, patches) +} + +func (p *PreviewSlot) ApplyEditableTargetPatches(target, sceneID, writerID string, baseSeq, editSeq uint64, patches []EditablePatch) error { p.mu.Lock() defer p.mu.Unlock() - cur := p.current + cur := p.editableTargetLocked(target) if cur == nil || cur.sceneID != sceneID { return ErrPreviewSceneMismatch } if !cur.editable { return ErrPreviewNotEditable } + if (target == "program" && writerID == "") || (writerID != "" && writerID != cur.writerID) { + return ErrPreviewEditSequence + } if cur.editSeq != baseSeq || editSeq != baseSeq+1 { return ErrPreviewEditSequence } @@ -434,15 +468,22 @@ func (p *PreviewSlot) ApplyEditablePatches(sceneID string, baseSeq, editSeq uint // antenne Show or mutating a Blue/Program scene. The input is not an authoring // edit, so it does not advance ZabCanvas's edit sequence. func (p *PreviewSlot) ApplyPreviewInput(path string, value json.RawMessage, source string) error { + return p.ApplyEditableTargetInput("preview", "", "", path, value, source) +} + +func (p *PreviewSlot) ApplyEditableTargetInput(target, sceneID, writerID, path string, value json.RawMessage, source string) error { p.mu.Lock() defer p.mu.Unlock() - cur := p.current - if cur == nil { + cur := p.editableTargetLocked(target) + if cur == nil || (sceneID != "" && cur.sceneID != sceneID) { return ErrPreviewSceneMismatch } if !cur.editable { return ErrPreviewNotEditable } + if (target == "program" && (sceneID == "" || writerID == "")) || (writerID != "" && cur.writerID != writerID) { + return ErrPreviewEditSequence + } if path == "" || strings.HasPrefix(path, "__test.") { return ErrPreviewEditPath } @@ -490,6 +531,18 @@ func (p *PreviewSlot) CurrentSceneID() string { return p.current.sceneID } +// Flush waits until the active clone has forwarded its queued inputs to its +// mirrors. The API then waits for the native receiver's application ACK. +func (p *PreviewSlot) Flush(ctx context.Context) error { + p.mu.Lock() + cur := p.current + p.mu.Unlock() + if cur == nil { + return nil + } + return cur.scene.Flush(ctx) +} + // Current is the live preview clone scene, or nil when none is open. It is the // operator-surface target in preview mode: firing an on-call / resolving an // await against the preview clone drives the PREVIEW, never the antenne's @@ -507,18 +560,22 @@ func (p *PreviewSlot) Current() *Scene { func (p *PreviewSlot) Close() { p.mu.Lock() defer p.mu.Unlock() - stopped := make(map[*previewClone]struct{}, len(p.editable)+1) if p.current != nil { p.current.scene.Stop() p.wire.Drop(p.current.sceneID) - stopped[p.current] = struct{}{} } - for sceneID, clone := range p.editable { - if _, ok := stopped[clone]; !ok { - clone.scene.Stop() - p.wire.Drop(sceneID) - } + if p.airCurrent != nil && p.airCurrent != p.current { + p.airCurrent.scene.Stop() } p.current = nil - clear(p.editable) + p.airCurrent = nil + p.nativeAir = false +} + +func cloneEditableAssets(source map[string][]byte) map[string][]byte { + result := make(map[string][]byte, len(source)) + for key, value := range source { + result[key] = append([]byte(nil), value...) + } + return result } diff --git a/internal/runtime/preview_editable_test.go b/internal/runtime/preview_editable_test.go index bbd77d5a..fc0acda0 100644 --- a/internal/runtime/preview_editable_test.go +++ b/internal/runtime/preview_editable_test.go @@ -170,99 +170,33 @@ func TestPreviewSlotInputUpdatesEditableCloneWithoutAdvancingEditSequence(t *tes } } -func TestPreviewSlotReactivatesWarmEditableCloneAcrossRegularScene(t *testing.T) { - wire := &editablePreviewWire{out: make(chan SubscriberMsg, 8)} - slot := NewPreviewSlot( - context.Background(), - NewComputeRegistry(), - wire, - slog.New(slog.NewTextHandler(io.Discard, nil)), - ) +func TestPreviewSlotReleasesInactiveEditableClone(t *testing.T) { + wire := &editablePreviewWire{out: make(chan SubscriberMsg, 128)} + slot := NewPreviewSlot(context.Background(), NewComputeRegistry(), wire, slog.New(slog.NewTextHandler(io.Discard, nil))) defer slot.Close() - - editableGraph := &compiler.Graph{ - SceneID: "editable-a", - SceneVersion: "sha256:editable-a", - Defaults: map[string]json.RawMessage{ - "__editable.61.x": json.RawMessage(`10`), - }, + graph := &compiler.Graph{SceneID: "a", SceneVersion: "sha256:a"} + slot.ActivateEditable("a", graph, &compiler.RenderBundle{SceneVersion: graph.SceneVersion}, 0) + first := slot.Current() + slot.Activate("b", &compiler.Graph{SceneID: "b", SceneVersion: "sha256:b"}, &compiler.RenderBundle{SceneVersion: "sha256:b"}) + if _, ok := slot.Bundle("a", graph.SceneVersion); ok { + t.Fatal("inactive bundle retained") } - editableBundle := &compiler.RenderBundle{SceneVersion: editableGraph.SceneVersion} - slot.ActivateEditable("editable-a", editableGraph, editableBundle, 4) - warm := slot.Current() - - if err := slot.ApplyEditablePatches("editable-a", 4, 5, []EditablePatch{{ - Path: "__editable.61.x", Value: json.RawMessage(`35`), - }}); err != nil { - t.Fatalf("hot patch before switch: %v", err) + if err := slot.ReactivateEditable("a", 0); err != ErrPreviewCacheMiss { + t.Fatalf("reactivation = %v", err) } - - regularGraph := &compiler.Graph{SceneID: "blue-b", SceneVersion: "sha256:blue-b"} - regularBundle := &compiler.RenderBundle{SceneVersion: regularGraph.SceneVersion} - slot.Activate("blue-b", regularGraph, regularBundle) - if slot.CurrentSceneID() != "blue-b" { - t.Fatalf("current after regular activation = %q", slot.CurrentSceneID()) - } - if _, ok := slot.Bundle("editable-a", editableGraph.SceneVersion); !ok { - t.Fatal("warm editable bundle disappeared while Blue owned Preview") - } - if err := slot.ReactivateEditable("editable-a", 4); err != ErrPreviewEditSequence { - t.Fatalf("stale durable head = %v, want %v", err, ErrPreviewEditSequence) - } - if slot.CurrentSceneID() != "blue-b" { - t.Fatal("a rejected warm activation changed Preview") + slot.ActivateEditable("a", graph, &compiler.RenderBundle{SceneVersion: graph.SceneVersion}, 0) + if slot.Current() == first { + t.Fatal("reused inactive clone") } - if err := slot.ReactivateEditable("editable-a", 5); err != nil { - t.Fatalf("ReactivateEditable: %v", err) + slot.ReleasePreview() + if slot.Current() != nil { + t.Fatal("external takeover retained clone") } - if slot.Current() != warm { - t.Fatal("editable reactivation rebuilt the runtime clone") + if err := slot.ReactivateEditable("a", 0); err != ErrPreviewCacheMiss { + t.Fatalf("external reactivation = %v", err) } - if got := wire.mirrorIDs; len(got) != 2 || got[0] != "editable-a" || got[1] != "blue-b" { - t.Fatalf("MirrorFor calls = %#v, want exactly editable-a then blue-b", got) - } - if got := wire.activeIDs; len(got) != 3 || got[0] != "editable-a" || got[1] != "blue-b" || got[2] != "editable-a" { - t.Fatalf("active switches = %#v", got) - } - if got := wire.dropped; len(got) != 1 || got[0] != "blue-b" { - t.Fatalf("drops before close = %#v, want disposable Blue clone only", got) - } -} - -func TestPreviewSlotReactivatesWarmCloneAfterExternalPreviewWireTakeover(t *testing.T) { - wire := &editablePreviewWire{out: make(chan SubscriberMsg, 8)} - slot := NewPreviewSlot( - context.Background(), - NewComputeRegistry(), - wire, - slog.New(slog.NewTextHandler(io.Discard, nil)), - ) - defer slot.Close() - - graph := &compiler.Graph{ - SceneID: "editable-external", - SceneVersion: "sha256:editable-external", - Defaults: map[string]json.RawMessage{ - "__editable.61.x": json.RawMessage(`10`), - }, - } - slot.ActivateEditable("editable-external", graph, &compiler.RenderBundle{SceneVersion: graph.SceneVersion}, 7) - // Blue's scene-intent path owns bluehost, but it switches this same wire - // directly; PreviewSlot.current deliberately remains the warm editable - // clone so returning must reassert SetActive instead of taking the no-op - // branch that caused the production switch regression. - wire.SetActive("blue-external") - if err := slot.ReactivateEditable("editable-external", 7); err != nil { - t.Fatalf("ReactivateEditable after external takeover: %v", err) - } - want := []string{"editable-external", "blue-external", "editable-external"} - if len(wire.activeIDs) != len(want) { - t.Fatalf("active switches = %#v, want %#v", wire.activeIDs, want) - } - for i, got := range wire.activeIDs { - if got != want[i] { - t.Fatalf("active switch %d = %q, want %q", i, got, want[i]) - } + if len(wire.dropped) != 3 { + t.Fatalf("drops = %#v", wire.dropped) } } @@ -396,3 +330,47 @@ func TestPreviewSlotServiceInputFansOutToPromotedGeneration(t *testing.T) { t.Fatal("generation mirror did not receive service input delta") } } + +func TestPreviewSlotRetainsOnlyExplicitActiveProgramGeneration(t *testing.T) { + wire := &editablePreviewWire{out: make(chan SubscriberMsg, 128)} + air := &editableAirWire{out: make(chan SubscriberMsg, 128)} + slot := NewPreviewSlot(context.Background(), NewComputeRegistry(), wire, slog.New(slog.NewTextHandler(io.Discard, nil))) + slot.SetEditableAirWire(air) + defer slot.Close() + graph := &compiler.Graph{SceneID: "program", SceneVersion: "sha256:program"} + slot.ActivateEditableWithBundle("program", graph, &compiler.RenderBundle{SceneVersion: graph.SceneVersion}, 0, []byte(`{"lsml":"1.1","scene_id":"program","scene_version":"sha256:program","layout":{"kind":"stack"}}`)) + program := slot.Current() + if _, err := slot.PromoteEditable("program", "on-air"); err != nil { + t.Fatal(err) + } + slot.ActivateEditable("next", &compiler.Graph{SceneID: "next", SceneVersion: "sha256:next"}, &compiler.RenderBundle{SceneVersion: "sha256:next"}, 0) + select { + case <-program.done: + t.Fatal("Preview change stopped the active Program") + default: + } + if _, ok := slot.Bundle("program", "sha256:program"); !ok { + t.Fatal("active Program bundle was removed") + } + if err := slot.ReactivateEditable("program", 0); err != ErrPreviewCacheMiss { + t.Fatalf("inactive Preview reactivation = %v", err) + } + current := slot.Current() + slot.ReleaseEditableAir() + select { + case <-program.done: + case <-time.After(time.Second): + t.Fatal("retired Program did not stop") + } + if _, ok := slot.Bundle("program", "sha256:program"); ok { + t.Fatal("retired Program bundle retained") + } + if slot.Current() != current { + t.Fatal("Program release changed Preview") + } + select { + case <-current.done: + t.Fatal("Program release stopped Preview") + default: + } +} diff --git a/internal/runtime/preview_roles.go b/internal/runtime/preview_roles.go new file mode 100644 index 00000000..10f6b62c --- /dev/null +++ b/internal/runtime/preview_roles.go @@ -0,0 +1,45 @@ +package runtime + +import "errors" + +// CurrentMirror is the original native mirror of the current editable actor. +// The registry uses its existing mutation seam for stream-level LSML effects. +func (p *PreviewSlot) CurrentMirror() SceneMirror { + p.mu.Lock() + defer p.mu.Unlock() + if p.current == nil || p.current.mirror == nil { + return nil + } + f := p.current.mirror + f.mu.RLock() + defer f.mu.RUnlock() + if len(f.mirrors) == 0 { + return nil + } + return f.mirrors[0] +} + +// StageRoleSwap pins the two existing editable actors. Their Mirror authority +// is transferred by the Hub; no clone, generation or snapshot is created here. +// finish is required on every path and releases the pin. +func (p *PreviewSlot) StageRoleSwap(sceneID string) (func(bool), error) { + p.mu.Lock() + if p.current != nil && (p.current.sceneID != sceneID || !p.current.editable) { + p.mu.Unlock() + return nil, errors.New("LANE_COMMIT_EDITABLE_MISMATCH") + } + return func(commit bool) { + if commit { + p.roleEpoch++ + p.nativeAir = p.current != nil + p.current, p.airCurrent = p.airCurrent, p.current + if p.current != nil { + p.current.airPromoted = false + } + if p.airCurrent != nil { + p.airCurrent.airPromoted = true + } + } + p.mu.Unlock() + }, nil +} diff --git a/internal/runtime/program_release.go b/internal/runtime/program_release.go new file mode 100644 index 00000000..b3b8c5d9 --- /dev/null +++ b/internal/runtime/program_release.go @@ -0,0 +1,20 @@ +package runtime + +// ReleaseNativeProgram detaches its writer before joining the scene loop. +// Caller holds the Program Host lease and has frozen its native mirror. +// Preview and its compilation epoch are deliberately untouched. +func (p *PreviewSlot) ReleaseNativeProgram(expected EditableHead) error { + p.mu.Lock() + cur := p.editableTargetLocked("program") + if editableHead(cur) != expected { + p.mu.Unlock() + return ErrPreviewEditSequence + } + p.airCurrent = nil + p.nativeAir = false + p.mu.Unlock() + if cur != nil { + cur.scene.Stop() + } + return nil +} diff --git a/internal/runtime/scene.go b/internal/runtime/scene.go index 35f31540..2812d1a4 100644 --- a/internal/runtime/scene.go +++ b/internal/runtime/scene.go @@ -3,6 +3,7 @@ package runtime import ( "context" "encoding/json" + "errors" "github.com/ZabLaboratory/Orion/internal/compiler" "github.com/ZabLaboratory/Orion/internal/protocol" "log/slog" @@ -792,6 +793,27 @@ func (s *Scene) Input(msg InputMsg) bool { } } +// Flush publishes inputs already queued on this scene before returning. It is +// an inbox barrier, not a promise that future asynchronous Blue work has ended. +func (s *Scene) Flush(ctx context.Context) error { + done := make(chan struct{}) + if !s.Input(InputMsg{Control: func(scene *Scene) { + scene.recompute(false) + scene.emit(nil) + close(done) + }}) { + return errors.New("SCENE_INBOX_FULL") + } + select { + case <-done: + return nil + case <-s.ctx.Done(): + return s.ctx.Err() + case <-ctx.Done(): + return ctx.Err() + } +} + // Subscribe registers a new subscriber and returns a snapshot to seed it. // The caller is expected to push the snapshot onto its WS as the // first frame, then forward Out. diff --git a/internal/runtime/test_session.go b/internal/runtime/test_session.go index 78ea0f98..ea42141f 100644 --- a/internal/runtime/test_session.go +++ b/internal/runtime/test_session.go @@ -14,13 +14,9 @@ import ( "github.com/ZabLaboratory/Orion/internal/compiler" ) -// SessionWire is a per-test-session LSDP/1.1 endpoint — the PREVIEW wire. -// Each test session gets its OWN isolated lumencast-go server whose sole, -// always-active scene is this session's clone. Solar subscribes live-mode -// against Handler() and follows ONLY the clone; it can neither observe nor -// drive the global show's active scene. This is the structural isolation the -// preview/antenne split needs: no shared active pointer, ever. Close tears -// the kit scene down when the session dies. +// SessionWire owns a clone's isolated render projection. Production publishes +// one entry under the actual session ID in native solar/sessions. Handler is +// retained for explicit compatibility adapters; native viewers use selectors. type SessionWire interface { // Mirror is the output tap fed onto the session's kit scene — wired // onto the clone via Scene.SetMirror before it runs. @@ -127,8 +123,16 @@ func (m *TestSessionManager) Open(ctx context.Context, sceneID string, graph *co wires := m.wires m.mu.Unlock() var wire SessionWire + nativeLease := false if wires != nil { - wire = wires.NewSessionWire(sceneID, gcopy.SceneVersion, &bcopy) + if named, ok := wires.(interface { + NewSessionWireFor(string, string, string, *compiler.RenderBundle) SessionWire + }); ok { + nativeLease = true + wire = named.NewSessionWireFor(id, sceneID, gcopy.SceneVersion, &bcopy) + } else { + wire = wires.NewSessionWire(sceneID, gcopy.SceneVersion, &bcopy) + } scene.SetMirror(wire.Mirror()) } @@ -141,12 +145,55 @@ func (m *TestSessionManager) Open(ctx context.Context, sceneID string, graph *co wire: wire, wsActive: false, } + if nativeLease { + // Subscriptions terminate at the shared node; Orion needs an explicit lease. + sess.closeAt = time.Now().Add(m.graceWindow) + } m.mu.Lock() m.sessions[id] = sess m.mu.Unlock() return id, scene } +// Renew extends a native session lease without marking a local WS connected. +func (m *TestSessionManager) Renew(id string) (time.Time, error) { + m.mu.Lock() + defer m.mu.Unlock() + sess := m.sessions[id] + if sess == nil || (!sess.closeAt.IsZero() && time.Now().After(sess.closeAt)) { + return time.Time{}, ErrTestSessionExpired + } + sess.closeAt = time.Now().Add(m.graceWindow) + return sess.closeAt, nil +} + +// CloseSession tears down the clone and its native resource entry immediately. +func (m *TestSessionManager) CloseSession(id string) { + m.mu.Lock() + defer m.mu.Unlock() + if sess := m.sessions[id]; sess != nil { + sess.scene.Stop() + if sess.wire != nil { + sess.wire.Close() + } + delete(m.sessions, id) + } +} + +// RunSweep reclaims expired native leases even without a local WS consumer. +func (m *TestSessionManager) RunSweep(ctx context.Context) { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case now := <-ticker.C: + m.Sweep(now) + } + } +} + // ConnectWire marks a session WS-active (grace reset) and returns its // per-session preview-LSDP handler — the .lsdp-route analogue of Connect. // Returns ErrTestSessionExpired if the session is unknown / past grace, or diff --git a/internal/streamcontrol/README.md b/internal/streamcontrol/README.md new file mode 100644 index 00000000..3ff949e9 --- /dev/null +++ b/internal/streamcontrol/README.md @@ -0,0 +1,32 @@ +# Durable stream control + +`store.go` owns `stream-control.lsml`: published global Blue programs/digests +and desired `{running,on_air}` state per local overlay app. It verifies the +document digest at startup and replaces the file atomically. Scene content, +mutated scene LSML, credentials and transient Blue variables never enter it. + +`cmd/orion/main.go` restores saved rules directly into RulePlane, then reapplies +the saved overlay intent. No upstream compile is needed on restart. Rule +promotion persists only after load and first step succeed; demotion removes it. + +`apps.go` reads an explicitly configured local command manifest. It accepts +either `{app_id:{executable,args,directory}}` or the existing version-1 installed +overlay declaration `{version:1,apps:[{id,exe_path,args,...}]}`. Paths are absolute, +arguments are an array and no shell is used. Blue supplies only an app identifier +and booleans. Unknown apps and failed launches surface as errors. + +`controller.go` persists intent before acting, maintains actual PID/running/error +status and restarts still-enabled exited processes. Stop/OFF terminates only an +owned child; Windows also reaps its child tree. Orion cancels and joins the +reconciliation loop before closing its apps. Desired enabled state survives +shutdown. `GET /api/v1/show/overlay-apps` exposes actual process status to operators. +Window capture/on-air composition remains the existing host's responsibility. + +Configuration: `ORION_STREAM_INTENT_PATH` overrides the LSML location. Otherwise +it resides alongside the local service-token state, then under the local artifact +root or asset root. `ORION_OVERLAY_APPS_PATH` selects the installed command manifest; +an unset path declares no executable. No product-specific app is hardcoded. + +Tests cover restart/digest rejection, process idempotence, OFF/reaping and an +opt-in real Electron Marker rule/capture/native-ACK proof. The package is owned +by Orion; Prism and Lumencast need no edits for this local implementation. diff --git a/internal/streamcontrol/apps.go b/internal/streamcontrol/apps.go new file mode 100644 index 00000000..b5bde2b5 --- /dev/null +++ b/internal/streamcontrol/apps.go @@ -0,0 +1,161 @@ +package streamcontrol + +import ( + "context" + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "sync" + "time" +) + +// Commands are installed/local configuration, never supplied by a Blue request. +type Command struct { + Executable string `json:"executable"` + Args []string `json:"args"` + Directory string `json:"directory"` +} +type AppStatus struct { + Running bool `json:"running_actual"` + DesiredRunning bool `json:"running"` + DesiredOnAir bool `json:"on_air"` + PID int `json:"pid,omitempty"` + Error string `json:"last_error,omitempty"` +} +type process struct { + cmd *exec.Cmd + done chan struct{} +} +type Apps struct { + mu sync.Mutex + commands map[string]Command + processes map[string]*process + status map[string]AppStatus +} + +func NewApps(manifest string) (*Apps, error) { + a := &Apps{commands: map[string]Command{}, processes: map[string]*process{}, status: map[string]AppStatus{}} + if manifest == "" { + return a, nil + } + raw, err := os.ReadFile(manifest) + if err != nil { + return nil, err + } + var existing struct { + Version int `json:"version"` + Apps []struct { + ID string `json:"id"` + Executable string `json:"exe_path"` + Args []string `json:"args"` + } `json:"apps"` + } + if json.Unmarshal(raw, &existing) == nil && existing.Version == 1 && existing.Apps != nil { + for _, entry := range existing.Apps { + if _, duplicate := a.commands[entry.ID]; duplicate { + return nil, fmt.Errorf("OVERLAY_COMMAND_DUPLICATE: %s", entry.ID) + } + a.commands[entry.ID] = Command{Executable: entry.Executable, Args: entry.Args} + } + } else if err := json.Unmarshal(raw, &a.commands); err != nil { + return nil, err + } + for id, command := range a.commands { + if id == "" || !filepath.IsAbs(command.Executable) || (command.Directory != "" && !filepath.IsAbs(command.Directory)) { + return nil, fmt.Errorf("OVERLAY_COMMAND_INVALID: %s", id) + } + } + return a, nil +} +func (a *Apps) Status() map[string]AppStatus { + a.mu.Lock() + defer a.mu.Unlock() + result := map[string]AppStatus{} + for id, status := range a.status { + result[id] = status + } + return result +} +func (a *Apps) Set(ctx context.Context, id string, running bool) error { + a.mu.Lock() + p := a.processes[id] + if !running { + if p == nil { + a.status[id] = AppStatus{} + a.mu.Unlock() + return nil + } + delete(a.processes, id) + a.mu.Unlock() + _ = terminateProcess(p.cmd) + select { + case <-p.done: + case <-ctx.Done(): + return ctx.Err() + } + return nil + } + if p != nil { + a.mu.Unlock() + return nil + } + command, ok := a.commands[id] + if !ok { + a.status[id] = AppStatus{Error: "OVERLAY_APPLICATION_NOT_CONFIGURED"} + a.mu.Unlock() + return fmt.Errorf("OVERLAY_APPLICATION_NOT_CONFIGURED: %s", id) + } + cmd := exec.Command(command.Executable, command.Args...) + cmd.Dir = command.Directory + configureProcess(cmd) + if err := cmd.Start(); err != nil { + a.status[id] = AppStatus{Error: err.Error()} + a.mu.Unlock() + return err + } + p = &process{cmd: cmd, done: make(chan struct{})} + a.processes[id] = p + a.status[id] = AppStatus{Running: true, PID: cmd.Process.Pid} + a.mu.Unlock() + go func() { + err := cmd.Wait() + a.mu.Lock() + if a.processes[id] == p { + delete(a.processes, id) + status := AppStatus{} + if err != nil { + status.Error = err.Error() + } + a.status[id] = status + } else if a.status[id].PID == cmd.Process.Pid { + a.status[id] = AppStatus{} + } + a.mu.Unlock() + close(p.done) + }() + // Detect immediate launcher failure without confusing successful exec with a + // child already gone. This still reports process status, not rendered pixels. + select { + case <-p.done: + return fmt.Errorf("OVERLAY_APPLICATION_EXITED: %s", id) + case <-ctx.Done(): + return ctx.Err() + case <-time.After(100 * time.Millisecond): + return nil + } +} +func (a *Apps) Close() { + a.mu.Lock() + ids := make([]string, 0, len(a.processes)) + for id := range a.processes { + ids = append(ids, id) + } + a.mu.Unlock() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + for _, id := range ids { + _ = a.Set(ctx, id, false) + } +} diff --git a/internal/streamcontrol/apps_test.go b/internal/streamcontrol/apps_test.go new file mode 100644 index 00000000..730eb08d --- /dev/null +++ b/internal/streamcontrol/apps_test.go @@ -0,0 +1,59 @@ +package streamcontrol + +import ( + "context" + "encoding/json" + "os" + "path/filepath" + "testing" + "time" +) + +func TestOverlayChild(_ *testing.T) { + if os.Getenv("ORION_OVERLAY_CHILD") != "1" { + return + } + for { + time.Sleep(time.Second) + } +} +func TestConfiguredOverlayLaunchIsIdempotentAndStopsOwnedProcess(t *testing.T) { + t.Setenv("ORION_OVERLAY_CHILD", "1") + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + manifest := filepath.Join(t.TempDir(), "apps.json") + raw, _ := json.Marshal(map[string]Command{"marker": {Executable: executable, Args: []string{"-test.run=^TestOverlayChild$"}}}) + if err := os.WriteFile(manifest, raw, 0600); err != nil { + t.Fatal(err) + } + apps, err := NewApps(manifest) + if err != nil { + t.Fatal(err) + } + defer apps.Close() + ctx := context.Background() + if err := apps.Set(ctx, "marker", true); err != nil { + t.Fatal(err) + } + first := apps.Status()["marker"] + if !first.Running || first.PID == 0 { + t.Fatalf("not launched: %+v", first) + } + if err := apps.Set(ctx, "marker", true); err != nil { + t.Fatal(err) + } + if apps.Status()["marker"].PID != first.PID { + t.Fatal("duplicate process") + } + if err := apps.Set(ctx, "marker", false); err != nil { + t.Fatal(err) + } + if apps.Status()["marker"].Running { + t.Fatal("owned process left running") + } + if err := apps.Set(ctx, "unknown", true); err == nil { + t.Fatal("unconfigured executable admitted") + } +} diff --git a/internal/streamcontrol/controller.go b/internal/streamcontrol/controller.go new file mode 100644 index 00000000..8c56afa7 --- /dev/null +++ b/internal/streamcontrol/controller.go @@ -0,0 +1,83 @@ +package streamcontrol + +import ( + "context" + "errors" + "sync" + "time" +) + +type Mirror interface{ EmitOverlayApp(string, *bool, *bool) } + +// Controller persists intent before executing it and publishes process status +// separately. Only configured local applications can be spawned. +type Controller struct { + store *Store + apps *Apps + mirror Mirror + mu sync.Mutex + failures map[string]error +} + +func NewController(store *Store, apps *Apps, mirror Mirror) *Controller { + return &Controller{store: store, apps: apps, mirror: mirror, failures: map[string]error{}} +} +func (c *Controller) EmitOverlayApp(id string, running, onAir *bool) { + c.mu.Lock() + defer c.mu.Unlock() + if err := c.store.SetApp(id, running, onAir); err != nil { + c.failures[id] = err + return + } + app := c.store.Snapshot().Apps[id] + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + err := c.apps.Set(ctx, id, app.Running) + if err == nil { + delete(c.failures, id) + } else { + c.failures[id] = err + } + if c.mirror != nil { + c.mirror.EmitOverlayApp(id, &app.Running, &app.OnAir) + } +} +func (c *Controller) Error() error { + c.mu.Lock() + defer c.mu.Unlock() + var failures []error + for _, err := range c.failures { + failures = append(failures, err) + } + return errors.Join(failures...) +} +func (c *Controller) Status() map[string]AppStatus { + status := c.apps.Status() + for id, app := range c.store.Snapshot().Apps { + value := status[id] + value.DesiredRunning, value.DesiredOnAir = app.Running, app.OnAir + status[id] = value + } + return status +} + +// Run reconciles a still-enabled app after an unexpected exit. Closing Orion +// stops owned processes while the durable enabled intent survives. +func (c *Controller) Run(ctx context.Context) { + ticker := time.NewTicker(2 * time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + intent := c.store.Snapshot() + status := c.apps.Status() + for id, app := range intent.Apps { + if app.Running && !status[id].Running { + c.EmitOverlayApp(id, &app.Running, &app.OnAir) + } + } + } + } +} diff --git a/internal/streamcontrol/process_unix.go b/internal/streamcontrol/process_unix.go new file mode 100644 index 00000000..1e8b20ee --- /dev/null +++ b/internal/streamcontrol/process_unix.go @@ -0,0 +1,9 @@ +//go:build !windows + +package streamcontrol + +import "os/exec" + +func configureProcess(_ *exec.Cmd) {} + +func terminateProcess(cmd *exec.Cmd) error { return cmd.Process.Kill() } diff --git a/internal/streamcontrol/process_windows.go b/internal/streamcontrol/process_windows.go new file mode 100644 index 00000000..47cde556 --- /dev/null +++ b/internal/streamcontrol/process_windows.go @@ -0,0 +1,18 @@ +package streamcontrol + +import ( + "os/exec" + "strconv" + "syscall" +) + +func configureProcess(cmd *exec.Cmd) { cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} } + +func terminateProcess(cmd *exec.Cmd) error { + kill := exec.Command("taskkill", "/PID", strconv.Itoa(cmd.Process.Pid), "/T", "/F") + configureProcess(kill) + if err := kill.Run(); err != nil { + return cmd.Process.Kill() + } + return nil +} diff --git a/internal/streamcontrol/store.go b/internal/streamcontrol/store.go new file mode 100644 index 00000000..096b3c99 --- /dev/null +++ b/internal/streamcontrol/store.go @@ -0,0 +1,148 @@ +// Package streamcontrol owns Orion's durable stream intent, never scene content. +package streamcontrol + +import ( + "bytes" + "encoding/json" + "errors" + "os" + "path/filepath" + "sync" + + "github.com/ZabLaboratory/Orion/internal/canonical" +) + +type Rule struct { + Digest string `json:"digest"` + Program json.RawMessage `json:"program"` +} +type App struct { + Running bool `json:"running"` + OnAir bool `json:"on_air"` +} +type Intent struct { + Rules map[string]Rule `json:"stream_rules"` + Apps map[string]App `json:"overlay_apps"` +} +type document struct { + LSML string `json:"lsml"` + SceneID string `json:"scene_id"` + Version string `json:"scene_version,omitempty"` + Layout map[string]any `json:"layout"` + Defaults Intent `json:"defaults"` +} +type Store struct { + mu sync.Mutex + path string + value document +} + +func Open(path string) (*Store, error) { + if !filepath.IsAbs(path) { + return nil, errors.New("STREAM_INTENT_ABSOLUTE_PATH_REQUIRED") + } + s := &Store{path: path, value: document{LSML: "1.1", SceneID: "orion-stream-control", Layout: map[string]any{"kind": "frame", "children": []any{}}, Defaults: Intent{Rules: map[string]Rule{}, Apps: map[string]App{}}}} + raw, err := os.ReadFile(path) + if err == nil { + if err = json.Unmarshal(raw, &s.value); err != nil { + return nil, err + } + if s.value.LSML != "1.1" || s.value.SceneID != "orion-stream-control" || s.value.Defaults.Rules == nil || s.value.Defaults.Apps == nil { + return nil, errors.New("STREAM_INTENT_INVALID") + } + version := s.value.Version + if err := s.stamp(); err != nil { + return nil, err + } + if version != s.value.Version { + return nil, errors.New("STREAM_INTENT_DIGEST_MISMATCH") + } + } else if !os.IsNotExist(err) { + return nil, err + } else if err = s.save(); err != nil { + return nil, err + } + return s, nil +} +func (s *Store) Snapshot() Intent { + s.mu.Lock() + defer s.mu.Unlock() + raw, _ := json.Marshal(s.value.Defaults) + var result Intent + _ = json.Unmarshal(raw, &result) + return result +} +func (s *Store) change(change func(*Intent)) error { + s.mu.Lock() + defer s.mu.Unlock() + previous, _ := json.Marshal(s.value) + change(&s.value.Defaults) + if err := s.save(); err != nil { + _ = json.Unmarshal(previous, &s.value) + return err + } + return nil +} +func (s *Store) SetRule(id, digest string, program []byte) error { + return s.change(func(i *Intent) { i.Rules[id] = Rule{digest, append(json.RawMessage(nil), program...)} }) +} +func (s *Store) RemoveRule(id string) error { return s.change(func(i *Intent) { delete(i.Rules, id) }) } +func (s *Store) SetApp(id string, running, onAir *bool) error { + return s.change(func(i *Intent) { + app := i.Apps[id] + if running != nil { + app.Running = *running + } + if onAir != nil { + app.OnAir = *onAir + } + i.Apps[id] = app + }) +} +func (s *Store) stamp() error { + s.value.Version = "" + raw, err := json.Marshal(s.value) + if err != nil { + return err + } + var value any + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + if err := decoder.Decode(&value); err != nil { + return err + } + s.value.Version, err = canonical.Digest(value) + return err +} +func (s *Store) save() error { + if err := s.stamp(); err != nil { + return err + } + raw, err := json.MarshalIndent(s.value, "", " ") + if err != nil { + return err + } + if err := os.MkdirAll(filepath.Dir(s.path), 0700); err != nil { + return err + } + file, err := os.CreateTemp(filepath.Dir(s.path), ".stream-intent-*.tmp") + if err != nil { + return err + } + name := file.Name() + defer os.Remove(name) + if err = file.Chmod(0600); err == nil { + _, err = file.Write(raw) + } + if err == nil { + err = file.Sync() + } + closeErr := file.Close() + if err == nil { + err = closeErr + } + if err != nil { + return err + } + return os.Rename(name, s.path) +} diff --git a/internal/streamcontrol/store_test.go b/internal/streamcontrol/store_test.go new file mode 100644 index 00000000..b53fa8bb --- /dev/null +++ b/internal/streamcontrol/store_test.go @@ -0,0 +1,42 @@ +package streamcontrol + +import ( + "os" + "path/filepath" + "testing" +) + +func TestStreamLSMLIntentSurvivesRestartAndRejectsCorruption(t *testing.T) { + path := filepath.Join(t.TempDir(), "control.lsml") + s, err := Open(path) + if err != nil { + t.Fatal(err) + } + if err := s.SetRule("rule", "digest", []byte(`{"schema_version":"blue.program.v1"}`)); err != nil { + t.Fatal(err) + } + on := true + if err := s.SetApp("marker", &on, &on); err != nil { + t.Fatal(err) + } + restarted, err := Open(path) + if err != nil { + t.Fatal(err) + } + intent := restarted.Snapshot() + if len(intent.Rules) != 1 || !intent.Apps["marker"].Running { + t.Fatalf("intent lost: %+v", intent) + } + if err := restarted.RemoveRule("rule"); err != nil { + t.Fatal(err) + } + if len(s.Snapshot().Rules) != 1 { + t.Fatal("stores share mutable intent") + } + if err := os.WriteFile(path, []byte(`{"lsml":"1.1","scene_id":"orion-stream-control","scene_version":"tampered","defaults":{"stream_rules":{},"overlay_apps":{}}}`), 0600); err != nil { + t.Fatal(err) + } + if _, err := Open(path); err == nil { + t.Fatal("corrupt LSML reset silently") + } +} diff --git a/internal/ws/connection.go b/internal/ws/connection.go index 462be63a..5ba49c53 100644 --- a/internal/ws/connection.go +++ b/internal/ws/connection.go @@ -2,7 +2,6 @@ package ws import ( "context" - "encoding/json" "errors" "log/slog" "sync/atomic" @@ -199,15 +198,3 @@ func nonce() string { } return string(out) } - -// writeJSON is used by some tests to confirm bytes-on-wire match -// envelope shape; kept for parity with api/public.go. -func writeJSON(_ context.Context, w *websocket.Conn, v any) error { - raw, err := json.Marshal(v) - if err != nil { - return err - } - return w.Write(context.Background(), websocket.MessageText, raw) -} - -var _ = writeJSON diff --git a/third_party/lsdpnative/LICENSE b/third_party/lsdpnative/LICENSE new file mode 100644 index 00000000..e67af29e --- /dev/null +++ b/third_party/lsdpnative/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for describing the origin of the Work and + reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may accept and charge a + fee for, acceptance of support, warranty, indemnity, or other + liability obligations and/or rights consistent with this License. + However, in accepting such obligations, You may act only on Your + own behalf and on Your sole responsibility, not on behalf of any + other Contributor, and only if You agree to indemnify, defend, + and hold each Contributor harmless for any liability incurred by, + or claims asserted against, such Contributor by reason of your + accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 The Lumencast Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/third_party/lsdpnative/README.md b/third_party/lsdpnative/README.md new file mode 100644 index 00000000..cf4912b4 --- /dev/null +++ b/third_party/lsdpnative/README.md @@ -0,0 +1,7 @@ +# Lumencast native Go client + +client.go is copied unchanged from lumencast-lsdp-native/addons/go/client.go at +e695e14f9f664f430ffc2e0e75d083fab88abc7f, Apache-2.0. Its live consumer is Orion's +native producer, receipt barriers and receiver readiness (internal/lsdpreception). No process launcher +is copied: Prism owns the common daemon. Generic transport APIs remain upstream; +we do not fork the native server or rewrite its protocol in Orion. diff --git a/third_party/lsdpnative/client.go b/third_party/lsdpnative/client.go new file mode 100644 index 00000000..d33552dc --- /dev/null +++ b/third_party/lsdpnative/client.go @@ -0,0 +1,380 @@ +// Package lsdpnative is a generic, persistent native-wire language binding. +// It carries operator types and LSML as data; it has no application-specific logic. +package lsdpnative + +import ( + "bytes" + "context" + "crypto/rand" + "crypto/sha256" + "crypto/tls" + "encoding/binary" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "net" + "sync" + "time" +) + +const wire = "LSDP-TCP/2.0-draft2" + +type frame struct { + kind byte + channel uint32 + id uint64 + body []byte +} +type WireError struct { + Code string `json:"code"` + Outcome string `json:"outcome"` +} + +func (e *WireError) Error() string { return e.Code + " (" + e.Outcome + ")" } + +// Client serializes exchanges on one connection. A transport failure closes it; +// reconnect and retry the same port request ID to recover the producer's outbox. +type Client struct { + mu sync.Mutex + conn net.Conn + send, receive, channel uint32 + remote struct{ FrameBytes, MessageBytes, WindowBytes, ChannelWindowBytes int } + credit int +} + +func Dial(ctx context.Context, address, token string, security *tls.Config) (*Client, error) { + host, _, err := net.SplitHostPort(address) + if err != nil { + return nil, err + } + if security == nil && (net.ParseIP(host) == nil || !net.ParseIP(host).IsLoopback()) { + return nil, errors.New("TLS_REQUIRED") + } + if security != nil && security.InsecureSkipVerify { + return nil, errors.New("TLS_VERIFICATION_REQUIRED") + } + var conn net.Conn + if security == nil { + conn, err = (&net.Dialer{}).DialContext(ctx, "tcp", address) + } else { + secure := security.Clone() + secure.MinVersion = tls.VersionTLS13 + conn, err = (&tls.Dialer{Config: secure}).DialContext(ctx, "tcp", address) + } + if err != nil { + return nil, err + } + c := &Client{conn: conn} + deadline := time.Now().Add(5 * time.Second) + if d, ok := ctx.Deadline(); ok && d.Before(deadline) { + deadline = d + } + _ = conn.SetDeadline(deadline) + hello := map[string]any{"wire": wire, "role": "client", "limits": map[string]any{ + "frameBytes": 65536, "windowBytes": 1048576, "channelWindowBytes": 262144, "mutationReserveBytes": 65536, + "messageBytes": 16777216, "bufferedMessageBytes": 33554432, "streamBytes": 1073741824, "channels": 32, + "controlBytes": 8192, "receiptBytes": 8192, "timeoutMs": 30000, "handshakeMs": 5000, "idleMs": 120000}} + if token != "" { + hello["authToken"] = token + } + body, _ := json.Marshal(hello) + if err = c.write(frame{kind: 1, body: body}); err != nil { + conn.Close() + return nil, err + } + response, err := c.read() + if err != nil { + conn.Close() + return nil, err + } + var reply struct { + Wire, Role string + Limits struct{ FrameBytes, MessageBytes, WindowBytes, ChannelWindowBytes int } + } + if err = json.Unmarshal(response.body, &reply); err != nil || response.kind != 1 || response.channel != 0 || response.id != 0 || reply.Wire != wire || reply.Role != "server" || reply.Limits.FrameBytes < 1024 || reply.Limits.FrameBytes > 1048576 || reply.Limits.MessageBytes < 1 || reply.Limits.MessageBytes > 67108864 || reply.Limits.WindowBytes < reply.Limits.FrameBytes || reply.Limits.WindowBytes > 67108864 || reply.Limits.ChannelWindowBytes < 1 || reply.Limits.ChannelWindowBytes > reply.Limits.WindowBytes { + conn.Close() + return nil, errors.New("INCOMPATIBLE_HELLO") + } + c.remote = reply.Limits + c.credit = reply.Limits.WindowBytes + _ = conn.SetDeadline(time.Time{}) + return c, nil +} +func (c *Client) Close() error { return c.conn.Close() } +func (c *Client) write(f frame) error { + if c.send == ^uint32(0) { + return errors.New("SEQUENCE_EXHAUSTED") + } + c.send++ + header := make([]byte, 32) + copy(header, "LSDP") + header[4] = 2 + header[5] = f.kind + binary.BigEndian.PutUint32(header[8:12], f.channel) + binary.BigEndian.PutUint64(header[12:20], f.id) + binary.BigEndian.PutUint32(header[20:24], uint32(len(f.body))) + binary.BigEndian.PutUint32(header[24:28], c.send) + chunks := net.Buffers{header, f.body} + _, err := chunks.WriteTo(c.conn) + return err +} +func (c *Client) read() (frame, error) { + var f frame + header := make([]byte, 32) + if _, err := io.ReadFull(c.conn, header); err != nil { + return f, err + } + length := binary.BigEndian.Uint32(header[20:24]) + sequence := binary.BigEndian.Uint32(header[24:28]) + if string(header[:4]) != "LSDP" || header[4] != 2 || header[5] < 1 || header[5] > 10 || header[6] != 0 || header[7] != 0 || binary.BigEndian.Uint32(header[28:]) != 0 || c.receive == ^uint32(0) || sequence != c.receive+1 || length > 65536 { + return f, errors.New("INVALID_FRAME") + } + c.receive = sequence + f = frame{kind: header[5], channel: binary.BigEndian.Uint32(header[8:12]), id: binary.BigEndian.Uint64(header[12:20]), body: make([]byte, length)} + _, err := io.ReadFull(c.conn, f.body) + return f, err +} +func (c *Client) consume(f frame, channelCredit *int) error { + if f.kind != 5 || len(f.body) != 4 || f.id != 0 { + return errors.New("INVALID_CREDIT") + } + amount := int(binary.BigEndian.Uint32(f.body)) + if amount < 1 { + return errors.New("INVALID_CREDIT") + } + if f.channel == 0 { + c.credit += amount + if c.credit > c.remote.WindowBytes { + return errors.New("INVALID_CREDIT") + } + } else if f.channel == c.channel { + *channelCredit += amount + if *channelCredit > c.remote.ChannelWindowBytes { + return errors.New("INVALID_CREDIT") + } + } else if f.channel > c.channel { + return errors.New("INVALID_CREDIT") + } + return nil +} +func (c *Client) Exchange(ctx context.Context, value any) (json.RawMessage, error) { + c.mu.Lock() + defer c.mu.Unlock() + if err := ctx.Err(); err != nil { + return nil, err + } + deadline := time.Now().Add(30 * time.Second) + if d, ok := ctx.Deadline(); ok && d.Before(deadline) { + deadline = d + } + _ = c.conn.SetDeadline(deadline) + stop := context.AfterFunc(ctx, func() { _ = c.conn.Close() }) + defer stop() + defer c.conn.SetDeadline(time.Time{}) + result, err := c.exchange(value) + if err != nil { + var remote *WireError + if !errors.As(err, &remote) { + c.conn.Close() + } + } + return result, err +} +func (c *Client) exchange(value any) (json.RawMessage, error) { + body, err := json.Marshal(value) + if err != nil { + return nil, err + } + if len(body) > c.remote.MessageBytes || len(body) > 16777216 { + return nil, errors.New("MESSAGE_LIMIT") + } + if c.channel == 0 { + c.channel = 1 + } else { + if c.channel > ^uint32(0)-2 { + return nil, errors.New("CHANNEL_EXHAUSTED") + } + c.channel += 2 + } + header, _ := json.Marshal(map[string]any{"kind": "json", "length": len(body), "metadata": nil}) + if err = c.write(frame{kind: 2, channel: c.channel, id: uint64(c.channel), body: header}); err != nil { + return nil, err + } + channelCredit := c.remote.ChannelWindowBytes + chunk := min(65536, c.remote.FrameBytes, c.remote.ChannelWindowBytes) + for offset := 0; offset < len(body); { + n := min(chunk, len(body)-offset) + for n > c.credit || n > channelCredit { + f, e := c.read() + if e != nil { + return nil, e + } + if e = c.consume(f, &channelCredit); e != nil { + return nil, e + } + } + c.credit -= n + channelCredit -= n + if err = c.write(frame{kind: 3, channel: c.channel, id: uint64(c.channel), body: body[offset : offset+n]}); err != nil { + return nil, err + } + offset += n + } + commit := make([]byte, 40) + binary.BigEndian.PutUint64(commit, uint64(len(body))) + hash := sha256.Sum256(body) + copy(commit[8:], hash[:]) + if err = c.write(frame{kind: 4, channel: c.channel, id: uint64(c.channel), body: commit}); err != nil { + return nil, err + } + for { + f, e := c.read() + if e != nil { + return nil, e + } + if f.kind == 5 { + if e = c.consume(f, &channelCredit); e != nil { + return nil, e + } + continue + } + if f.channel != c.channel || f.id != uint64(c.channel) { + return nil, errors.New("INVALID_RESPONSE") + } + if f.kind == 7 { + var wireError WireError + if e = json.Unmarshal(f.body, &wireError); e != nil { + return nil, e + } + return nil, &wireError + } + if f.kind != 6 { + return nil, errors.New("INVALID_RESPONSE") + } + var response struct { + Result json.RawMessage `json:"result"` + } + if e = json.Unmarshal(f.body, &response); e != nil || response.Result == nil { + return nil, errors.New("INVALID_ACK") + } + var descriptor struct { + Profile, Target string + Length int + } + _ = json.Unmarshal(response.Result, &descriptor) + if descriptor.Profile == "lsdp.state.read/1" { + return c.readState(descriptor.Target, descriptor.Length, &channelCredit) + } + return response.Result, nil + } +} +func (c *Client) readState(target string, length int, channelCredit *int) (json.RawMessage, error) { + if length < 0 || length > 16777216 { + return nil, errors.New("SNAPSHOT_LIMIT") + } + var begin frame + for { + f, err := c.read() + if err != nil { + return nil, err + } + if f.kind == 5 { + if err = c.consume(f, channelCredit); err != nil { + return nil, err + } + continue + } + begin = f + break + } + var header struct { + Kind string + Length int + Metadata struct { + Profile, Target string + Length int + } + } + if err := json.Unmarshal(begin.body, &header); err != nil || begin.kind != 2 || begin.channel == 0 || begin.channel%2 != 0 || begin.id == 0 || header.Kind != "json" || header.Length != length || header.Metadata.Profile != "lsdp.state.read/1" || header.Metadata.Target != target || header.Metadata.Length != length { + return nil, errors.New("INVALID_SNAPSHOT") + } + body := bytes.NewBuffer(make([]byte, 0, length)) + for { + f, err := c.read() + if err != nil { + return nil, err + } + if f.kind == 5 { + if err = c.consume(f, channelCredit); err != nil { + return nil, err + } + continue + } + if f.channel != begin.channel || f.id != begin.id { + return nil, errors.New("INVALID_SNAPSHOT") + } + if f.kind == 3 { + if len(f.body) == 0 || body.Len()+len(f.body) > length { + return nil, errors.New("INVALID_SNAPSHOT") + } + body.Write(f.body) + amount := make([]byte, 4) + binary.BigEndian.PutUint32(amount, uint32(len(f.body))) + for _, channel := range []uint32{0, begin.channel} { + if err = c.write(frame{kind: 5, channel: channel, body: amount}); err != nil { + return nil, err + } + } + } else if f.kind == 4 { + hash := sha256.Sum256(body.Bytes()) + if len(f.body) != 40 || body.Len() != length || binary.BigEndian.Uint64(f.body) != uint64(length) || !bytes.Equal(f.body[8:], hash[:]) || !json.Valid(body.Bytes()) { + return nil, errors.New("INTEGRITY_FAILED") + } + if err = c.write(frame{kind: 6, channel: begin.channel, id: begin.id, body: []byte(`{"result":{"level":"received"}}`)}); err != nil { + return nil, err + } + return json.Marshal(map[string]any{"target": target, "state": json.RawMessage(body.Bytes())}) + } else { + return nil, errors.New("INVALID_SNAPSHOT") + } + } +} +func NewID() (string, error) { + var id [16]byte + if _, err := rand.Read(id[:]); err != nil { + return "", err + } + return hex.EncodeToString(id[:]), nil +} +func (c *Client) SendPort(ctx context.Context, id, port, kind string, payload any) (json.RawMessage, error) { + if id == "" { + var err error + id, err = NewID() + if err != nil { + return nil, err + } + } + return c.Exchange(ctx, map[string]any{"kind": "route", "id": id, "port": port, "type": kind, "payload": payload}) +} +func (c *Client) ConfigureSettings(ctx context.Context, settings any, expectedVersion string) (json.RawMessage, error) { + value := map[string]any{"kind": "configuration.settings", "settings": settings} + if expectedVersion != "" { + value["expectedVersion"] = expectedVersion + } + return c.Exchange(ctx, value) +} + +// Typed receipt access is deliberately explicit: a completed route confirms +// its destinations, not pixels rendered or a provider's external side effects. +func Completed(value json.RawMessage) error { + var status struct{ Status string } + if err := json.Unmarshal(value, &status); err != nil { + return err + } + if status.Status != "completed" { + return fmt.Errorf("route status: %s", status.Status) + } + return nil +} diff --git a/third_party/lsdpnative/subscription.go b/third_party/lsdpnative/subscription.go new file mode 100644 index 00000000..a33ae9dd --- /dev/null +++ b/third_party/lsdpnative/subscription.go @@ -0,0 +1,91 @@ +package lsdpnative + +// Orion-owned subscription extension. client.go remains the exact upstream pin; +// this reuses its negotiated framing, checksums and credit implementation. +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/binary" + "encoding/json" + "errors" +) + +func (c *Client) Subscribe(ctx context.Context, target, stateHash string) error { + _, err := c.Exchange(ctx, map[string]any{"kind": "subscribe", "target": target, "stateHash": stateHash}) + return err +} + +// Next receives one server-initiated subscription transaction on a dedicated +// connection. Callback validation precedes its application acknowledgement. +func (c *Client) Next(ctx context.Context, target string, apply func(json.RawMessage) error) error { + c.mu.Lock() + defer c.mu.Unlock() + stop := context.AfterFunc(ctx, func() { c.conn.Close() }) + defer stop() + credit := 0 + var begin frame + for { + f, err := c.read() + if err != nil { + return err + } + if f.kind == 5 { + if err = c.consume(f, &credit); err != nil { + return err + } + continue + } + begin = f + break + } + var header struct { + Kind string + Length int + Metadata struct{ Profile, Target string } + } + if err := json.Unmarshal(begin.body, &header); err != nil || begin.kind != 2 || begin.channel == 0 || begin.channel%2 != 0 || begin.id == 0 || header.Kind != "json" || header.Length < 0 || header.Length > 16777216 || header.Length > c.remote.MessageBytes || header.Metadata.Profile != "lsdp.state.subscription/1" || header.Metadata.Target != target { + return errors.New("INVALID_SUBSCRIPTION") + } + body := bytes.NewBuffer(make([]byte, 0, header.Length)) + for { + f, err := c.read() + if err != nil { + return err + } + if f.kind == 5 { + if err = c.consume(f, &credit); err != nil { + return err + } + continue + } + if f.channel != begin.channel || f.id != begin.id { + return errors.New("INVALID_SUBSCRIPTION") + } + switch f.kind { + case 3: + if len(f.body) == 0 || body.Len()+len(f.body) > header.Length { + return errors.New("INVALID_SUBSCRIPTION") + } + body.Write(f.body) + amount := make([]byte, 4) + binary.BigEndian.PutUint32(amount, uint32(len(f.body))) + for _, channel := range []uint32{0, begin.channel} { + if err = c.write(frame{kind: 5, channel: channel, body: amount}); err != nil { + return err + } + } + case 4: + hash := sha256.Sum256(body.Bytes()) + if len(f.body) != 40 || body.Len() != header.Length || binary.BigEndian.Uint64(f.body) != uint64(header.Length) || !bytes.Equal(f.body[8:], hash[:]) || !json.Valid(body.Bytes()) { + return errors.New("INTEGRITY_FAILED") + } + if err = apply(body.Bytes()); err != nil { + return err + } + return c.write(frame{kind: 6, channel: begin.channel, id: begin.id, body: []byte(`{"result":{"level":"applied"}}`)}) + default: + return errors.New("INVALID_SUBSCRIPTION") + } + } +} diff --git a/third_party/lumencast-go/LICENSE b/third_party/lumencast-go/LICENSE new file mode 100644 index 00000000..c7336beb --- /dev/null +++ b/third_party/lumencast-go/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for describing the origin of the Work and + reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Support. While redistributing the Work or + Derivative Works thereof, You may choose to offer, and charge a + fee for, acceptance of support, warranty, indemnity, or other + liability obligations and/or rights consistent with this License. + However, in accepting such obligations, You may act only on Your + own behalf and on Your sole responsibility, not on behalf of any + other Contributor, and only if You agree to indemnify, defend, and + hold each Contributor harmless for any liability incurred by, or + claims asserted against, such Contributor by reason of your + accepting any such warranty or support. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 The Lumencast Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/third_party/lumencast-go/NOTICE b/third_party/lumencast-go/NOTICE new file mode 100644 index 00000000..60b7c07a --- /dev/null +++ b/third_party/lumencast-go/NOTICE @@ -0,0 +1,9 @@ +Lumencast Go SDK and CLI +Copyright 2026 The Lumencast Authors + +This product includes software developed by the Lumencast project +(https://github.com/Lumencast/lumencast-go). + +Portions of the protocol package and WebSocket server kit derive from +prior art in the Orion server (ZabLaboratory/Orion), released under the +Apache 2.0 License. diff --git a/third_party/lumencast-go/README.orion.md b/third_party/lumencast-go/README.orion.md new file mode 100644 index 00000000..5444e85d --- /dev/null +++ b/third_party/lumencast-go/README.orion.md @@ -0,0 +1,11 @@ +# Pinned Lumencast Go module for Orion + +This directory contains the `lsml`, `protocol`, and `server` packages from +`Lumencast/lumencast-go` revision +`0c7cfc65c694ce4ab943eb4e7711fd226c671180`, copied unchanged from that +revision with its `go.mod`, `go.sum`, `LICENSE`, and `NOTICE`. Orion's `go.mod` +replaces only this exact module with this local path so its CI and Windows +sidecar build do not depend on a cross-organization private Git credential. + +When the pinned module revision changes, replace these files from that revision +and run `go mod tidy` and the full Orion tests before updating the requirement. diff --git a/third_party/lumencast-go/go.mod b/third_party/lumencast-go/go.mod new file mode 100644 index 00000000..459c0fee --- /dev/null +++ b/third_party/lumencast-go/go.mod @@ -0,0 +1,17 @@ +module github.com/Lumencast/lumencast-go + +go 1.25.0 + +require ( + github.com/coder/websocket v1.8.14 + github.com/jackc/pgx/v5 v5.9.2 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + golang.org/x/text v0.29.0 // indirect +) diff --git a/third_party/lumencast-go/go.sum b/third_party/lumencast-go/go.sum new file mode 100644 index 00000000..2a96ec68 --- /dev/null +++ b/third_party/lumencast-go/go.sum @@ -0,0 +1,37 @@ +github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= +github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/third_party/lumencast-go/lsml/bundle.go b/third_party/lumencast-go/lsml/bundle.go new file mode 100644 index 00000000..502853e0 --- /dev/null +++ b/third_party/lumencast-go/lsml/bundle.go @@ -0,0 +1,64 @@ +// Package lsml implements the LSML 1.0 scene format : type definitions, +// validation, and content-hash canonicalisation. +// +// LSML bundles are JSON documents whose top-level shape and primitive +// catalog are documented at +// https://github.com/Lumencast/lumencast-protocol/blob/main/spec/LSML-1.md. +package lsml + +import "encoding/json" + +// Version is the LSML major.minor this package implements. +const Version = "1.0" + +// Bundle is the top-level scene document. +type Bundle struct { + LSML string `json:"lsml"` + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + Layout json.RawMessage `json:"layout"` + OperatorInputs []OperatorInput `json:"operator_inputs,omitempty"` + ExternalAdapters []json.RawMessage `json:"external_adapters,omitempty"` + Defaults map[string]any `json:"defaults,omitempty"` + Assets *Assets `json:"assets,omitempty"` + I18n json.RawMessage `json:"i18n,omitempty"` + Metadata json.RawMessage `json:"metadata,omitempty"` +} + +// OperatorInput describes a single operator-controllable field. +type OperatorInput struct { + Path string `json:"path"` + Label string `json:"label"` + Type string `json:"type"` + Constraints map[string]any `json:"constraints,omitempty"` + Values []any `json:"values,omitempty"` + WritableBy []string `json:"writable_by"` + Group string `json:"group,omitempty"` +} + +// Assets is the asset declaration block. +type Assets struct { + AllowedHosts []string `json:"allowedHosts,omitempty"` + Fonts []FontAsset `json:"fonts,omitempty"` + Preload []string `json:"preload,omitempty"` + Extra map[string]any `json:"-"` +} + +// FontAsset is one font declaration. +type FontAsset struct { + Family string `json:"family"` + URL string `json:"url"` + Sha256 string `json:"sha256,omitempty"` +} + +// Node is the discriminated representation of a primitive node. Most +// validation walks the raw JSON tree directly ; Node is convenience +// for code that wants typed access. +type Node struct { + Kind string `json:"kind"` + Children []Node `json:"children,omitempty"` + Bind json.RawMessage `json:"bind,omitempty"` + Style json.RawMessage `json:"style,omitempty"` + Animate json.RawMessage `json:"animate,omitempty"` + Extra json.RawMessage `json:"-"` +} diff --git a/third_party/lumencast-go/lsml/capture.go b/third_party/lumencast-go/lsml/capture.go new file mode 100644 index 00000000..8ee87dcd --- /dev/null +++ b/third_party/lumencast-go/lsml/capture.go @@ -0,0 +1,125 @@ +package lsml + +import ( + "fmt" + "strings" +) + +// ZabCaptureKind is the one vendor-prefixed `kind` this package +// recognises : the Zab capture placeholder of RFC-0001. +const ZabCaptureKind = "x-zab.capture" + +// captureVisualKinds are the `x-zab.sourceKind` values whose box is +// painted. `size` is mandatory for them : the geometry is what lets the +// consuming app position the native source over the box the author drew +// (RFC-0001 Amendment 2 §A2.2 / §A2.4). +var captureVisualKinds = []string{ + "media.webcam", + "media.screen", + "media.window", + "media.file", + "media.game", +} + +// captureAudioKinds are the audio-only `x-zab.sourceKind` values — a +// zero-area inert box is valid, so `size` MAY be omitted (§A2.2). +var captureAudioKinds = []string{ + "media.app_audio", + "media.system_audio", + "media.mic", +} + +// CheckZabCaptureNodes validates every `x-zab.capture` node reachable +// from root against RFC-0001 (+ Amendment 2), leaving every other node +// untouched. root is a decoded JSON value (map[string]any / []any). +// +// Deliberately narrower than Validate : a caller holding an untrusted +// inline layout can enforce the vendor contract without also taking a +// position on core primitives it may not know yet — the bundles that +// reach it come from several LSML minors. +func CheckZabCaptureNodes(root any) error { + stack := []any{root} + for len(stack) > 0 { + node := stack[len(stack)-1] + stack = stack[:len(stack)-1] + obj, ok := node.(map[string]any) + if !ok { + continue + } + if kind, _ := obj["kind"].(string); kind == ZabCaptureKind { + if err := checkZabCapture(obj); err != nil { + return err + } + } + if children, ok := obj["children"].([]any); ok { + stack = append(stack, children...) + } + if tmpl, ok := obj["template"]; ok { + stack = append(stack, tmpl) + } + } + return nil +} + +// checkZabCapture applies the RFC-0001 prop rules to a single +// `x-zab.capture` node. +func checkZabCapture(obj map[string]any) error { + sourceKind, ok := obj["x-zab.sourceKind"].(string) + if !ok || sourceKind == "" { + return fmt.Errorf("`%s` MUST declare `x-zab.sourceKind` (RFC-0001)", ZabCaptureKind) + } + visual := contains(captureVisualKinds, sourceKind) + if !visual && !contains(captureAudioKinds, sourceKind) { + return fmt.Errorf("unknown `x-zab.sourceKind` %q (RFC-0001 A2 §A2.2: %s, %s)", + sourceKind, + strings.Join(captureVisualKinds, ", "), + strings.Join(captureAudioKinds, ", ")) + } + + deviceRef, ok := obj["x-zab.deviceRef"].(string) + if !ok { + return fmt.Errorf("`%s` MUST declare `x-zab.deviceRef` (RFC-0001)", ZabCaptureKind) + } + if !isLogicalDeviceRef(deviceRef) { + return fmt.Errorf("`x-zab.deviceRef` %q MUST be a logical alias matching "+ + "^[a-z][a-z0-9-]{0,63}$ — never a physical device id (RFC-0001)", deviceRef) + } + + // §A2.4 — the visual set is a SECOND set, not a subset check on the + // enum : extending the enum alone would let a `media.file` with no + // geometry through as a zero-area media box. + if _, hasSize := obj["size"]; visual && !hasSize { + return fmt.Errorf("`%s` of visual kind %q MUST declare `size` "+ + "(RFC-0001 Amendment 2 §A2.2)", ZabCaptureKind, sourceKind) + } + return nil +} + +// isLogicalDeviceRef implements `^[a-z][a-z0-9-]{0,63}$` — the +// hash-safe logical alias grammar. +func isLogicalDeviceRef(s string) bool { + if len(s) == 0 || len(s) > 64 { + return false + } + if s[0] < 'a' || s[0] > 'z' { + return false + } + for i := 1; i < len(s); i++ { + c := s[i] + switch { + case c >= 'a' && c <= 'z', c >= '0' && c <= '9', c == '-': + default: + return false + } + } + return true +} + +func contains(haystack []string, needle string) bool { + for _, v := range haystack { + if v == needle { + return true + } + } + return false +} diff --git a/third_party/lumencast-go/lsml/capture_test.go b/third_party/lumencast-go/lsml/capture_test.go new file mode 100644 index 00000000..c94df1fc --- /dev/null +++ b/third_party/lumencast-go/lsml/capture_test.go @@ -0,0 +1,155 @@ +package lsml_test + +import ( + "encoding/json" + "strings" + "testing" + + "github.com/Lumencast/lumencast-go/lsml" +) + +// decode is a small helper : conformance bundles reach the validator as +// decoded JSON, not as typed structs. +func decode(t *testing.T, raw string) any { + t.Helper() + var v any + if err := json.Unmarshal([]byte(raw), &v); err != nil { + t.Fatalf("bad test JSON: %v", err) + } + return v +} + +func TestCheckZabCaptureNodes(t *testing.T) { + tests := []struct { + name string + layout string + wantErr string // substring ; "" means the layout MUST validate + }{ + { + name: "visual kind with size validates", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.webcam", + "x-zab.deviceRef":"primary-cam","size":{"w":640,"h":360}}]}`, + }, + { + name: "audio kind may omit size", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.mic", + "x-zab.deviceRef":"main-mic"}]}`, + }, + { + name: "system_audio may omit size", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.system_audio", + "x-zab.deviceRef":"desktop-out"}]}`, + }, + { + name: "media.game with size validates", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.game", + "x-zab.deviceRef":"league-client","size":{"w":1920,"h":1080}}]}`, + }, + { + // RFC-0001 Amendment 2 §A2.4 — the visual set is a SECOND + // set : media.file joined the enum AND the visual set. + name: "media.file without size is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.file", + "x-zab.deviceRef":"intro-sting"}]}`, + wantErr: "MUST declare `size`", + }, + { + name: "media.game without size is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.game", + "x-zab.deviceRef":"league-client"}]}`, + wantErr: "MUST declare `size`", + }, + { + name: "physical device id is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.webcam", + "x-zab.deviceRef":"video:0","size":{"w":640,"h":360}}]}`, + wantErr: "logical alias", + }, + { + name: "uppercase deviceRef is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.webcam", + "x-zab.deviceRef":"Primary-Cam","size":{"w":640,"h":360}}]}`, + wantErr: "logical alias", + }, + { + name: "deviceRef starting with a digit is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.mic", + "x-zab.deviceRef":"0-mic"}]}`, + wantErr: "logical alias", + }, + { + name: "missing sourceKind is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.deviceRef":"primary-cam", + "size":{"w":640,"h":360}}]}`, + wantErr: "x-zab.sourceKind", + }, + { + name: "unknown sourceKind is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.hologram", + "x-zab.deviceRef":"primary-cam","size":{"w":640,"h":360}}]}`, + wantErr: "unknown `x-zab.sourceKind`", + }, + { + name: "missing deviceRef is rejected", + layout: `{"kind":"frame","children":[ + {"kind":"x-zab.capture","x-zab.sourceKind":"media.webcam", + "size":{"w":640,"h":360}}]}`, + wantErr: "x-zab.deviceRef", + }, + { + // The walk speaks for x-zab.capture alone : an unknown core + // primitive is left to lsml.Validate, not rejected here. + name: "non-capture nodes are left untouched", + layout: `{"kind":"frame","children":[{"kind":"future-primitive","whatever":1}]}`, + }, + { + name: "nested inside a repeat template is reached", + layout: `{"kind":"repeat","template": + {"kind":"x-zab.capture","x-zab.sourceKind":"media.file", + "x-zab.deviceRef":"intro-sting"}}`, + wantErr: "MUST declare `size`", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + err := lsml.CheckZabCaptureNodes(decode(t, tc.layout)) + switch { + case tc.wantErr == "" && err != nil: + t.Fatalf("want valid, got error: %v", err) + case tc.wantErr != "" && err == nil: + t.Fatalf("want error containing %q, got nil", tc.wantErr) + case tc.wantErr != "" && !strings.Contains(err.Error(), tc.wantErr): + t.Fatalf("want error containing %q, got %v", tc.wantErr, err) + } + }) + } +} + +// A deviceRef of exactly 64 chars is the boundary of +// ^[a-z][a-z0-9-]{0,63}$ ; 65 is over it. +func TestDeviceRefLengthBoundary(t *testing.T) { + node := func(ref string) any { + return decode(t, `{"kind":"x-zab.capture","x-zab.sourceKind":"media.mic","x-zab.deviceRef":"`+ref+`"}`) + } + if err := lsml.CheckZabCaptureNodes(node("a" + strings.Repeat("b", 63))); err != nil { + t.Fatalf("64-char deviceRef must validate, got %v", err) + } + if err := lsml.CheckZabCaptureNodes(node("a" + strings.Repeat("b", 64))); err == nil { + t.Fatal("65-char deviceRef must be rejected") + } + if err := lsml.CheckZabCaptureNodes(node("")); err == nil { + t.Fatal("empty deviceRef must be rejected") + } +} diff --git a/third_party/lumencast-go/lsml/hash.go b/third_party/lumencast-go/lsml/hash.go new file mode 100644 index 00000000..b3df7561 --- /dev/null +++ b/third_party/lumencast-go/lsml/hash.go @@ -0,0 +1,180 @@ +package lsml + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "sort" + "strconv" +) + +// zeroHash is the placeholder injected into scene_version during +// canonicalisation, so the hash is computed over the bundle without +// being self-referential. +const zeroHash = "sha256:0000000000000000000000000000000000000000000000000000000000000000" + +// HashBundle computes the LSML 1.0 content hash for a bundle. Returns +// the lowercase hex sha256 plus the canonical JSON bytes. The bundle +// is not modified. +// +// Canonicalisation rules (spec § 3) : +// +// - UTF-8 +// - Object keys sorted lexicographically at every level +// - No insignificant whitespace +// - scene_version replaced by zeroHash during the hash computation +func HashBundle(b *Bundle) (string, []byte, error) { + raw, err := json.Marshal(b) + if err != nil { + return "", nil, err + } + return HashRaw(raw) +} + +// HashRaw computes the LSML 1.0 content hash for a bundle supplied as raw +// JSON, under the exact rules documented on HashBundle. Returns the +// lowercase hex sha256 plus the canonical JSON bytes. +// +// Use this — not HashBundle — to VERIFY a bundle that came from elsewhere. +// Bundle is a typed VIEW of the format, not a container for it: a document +// carrying any member Bundle does not declare (a vendor extension, a newer +// spec field, an `animations` catalogue) loses it on unmarshal, so what gets +// hashed is not what was received. Round-tripping foreign bytes through the +// struct reports a mismatch that says more about this struct's field list +// than about the document. +// +// HashBundle stays the right call for a bundle the caller just built: it +// delegates here after marshalling, so the two agree by construction and +// there is one canonicalisation in this package, not two. +// +// Numbers decode into float64, exactly as HashBundle has always done — an +// integer beyond float64's exact range canonicalises to its nearest +// representable value. That is shared, documented behaviour of the reference +// TS serializer too (see the `big` case in the cross-language golden), not a +// property of this entry point. +func HashRaw(raw []byte) (string, []byte, error) { + var v any + if err := json.Unmarshal(raw, &v); err != nil { + return "", nil, err + } + v = setSceneVersion(v, zeroHash) + canon, err := canonicalize(v) + if err != nil { + return "", nil, err + } + sum := sha256.Sum256(canon) + return hex.EncodeToString(sum[:]), canon, nil +} + +// setSceneVersion replaces the top-level scene_version field. v MUST +// be a map decoded from JSON. +func setSceneVersion(v any, replacement string) any { + m, ok := v.(map[string]any) + if !ok { + return v + } + if _, exists := m["scene_version"]; exists { + m["scene_version"] = replacement + } + return m +} + +// canonicalize emits canonical JSON. Object keys are sorted ; numbers +// use Go's json shortest decimal representation (RFC 8259 compliant). +func canonicalize(v any) ([]byte, error) { + var buf bytes.Buffer + if err := writeCanonical(&buf, v); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func writeCanonical(buf *bytes.Buffer, v any) error { + switch x := v.(type) { + case nil: + buf.WriteString("null") + case bool: + if x { + buf.WriteString("true") + } else { + buf.WriteString("false") + } + case string: + raw, err := marshalString(x) + if err != nil { + return err + } + buf.Write(raw) + case json.Number: + buf.WriteString(string(x)) + case float64: + // json.Marshal already produces shortest form. + raw, err := json.Marshal(x) + if err != nil { + return err + } + buf.Write(raw) + case int: + buf.WriteString(strconv.Itoa(x)) + case []any: + buf.WriteByte('[') + for i, item := range x { + if i > 0 { + buf.WriteByte(',') + } + if err := writeCanonical(buf, item); err != nil { + return err + } + } + buf.WriteByte(']') + case map[string]any: + keys := make([]string, 0, len(x)) + for k := range x { + keys = append(keys, k) + } + sort.Strings(keys) + buf.WriteByte('{') + for i, k := range keys { + if i > 0 { + buf.WriteByte(',') + } + raw, err := marshalString(k) + if err != nil { + return err + } + buf.Write(raw) + buf.WriteByte(':') + if err := writeCanonical(buf, x[k]); err != nil { + return err + } + } + buf.WriteByte('}') + default: + return fmt.Errorf("canonical: unsupported type %T", v) + } + return nil +} + +// marshalString JSON-encodes a string WITHOUT escaping &, <, > as +// &, <, >. Go's encoding/json escapes these by default +// (SetEscapeHTML(true)) as an anti-XSS measure for HTML embedding, but +// the TS reference serializer (@lumencast/compiler canonicalize.ts, +// JSON.stringify) does not. Disabling it keeps the canonical form +// byte-identical across SDKs, which the LSML content hash (spec § 3) +// requires — otherwise a string containing any of these characters +// produces a different scene_version in Go vs TS and the +// adopt-on-verify path (ADR 007 § C4) silently falls back to legacy. +// +// json.Encoder appends a trailing newline that json.Marshal does not, +// so it is trimmed. +func marshalString(s string) ([]byte, error) { + var b bytes.Buffer + enc := json.NewEncoder(&b) + enc.SetEscapeHTML(false) + if err := enc.Encode(s); err != nil { + return nil, err + } + return bytes.TrimRight(b.Bytes(), "\n"), nil +} diff --git a/third_party/lumencast-go/lsml/hash_xlang_golden_test.go b/third_party/lumencast-go/lsml/hash_xlang_golden_test.go new file mode 100644 index 00000000..5c2c0c52 --- /dev/null +++ b/third_party/lumencast-go/lsml/hash_xlang_golden_test.go @@ -0,0 +1,194 @@ +package lsml_test + +import ( + "encoding/json" + "strings" + "testing" + + "github.com/Lumencast/lumencast-go/lsml" +) + +// Cross-language hashBundle golden — gate for ADR 007 §C4 (adopt-on-verify). +// +// These golden values are the canonical JSON + sha256 produced by the TS +// reference implementation @lumencast/compiler (canonicalize.ts, v0.2.0), +// captured empirically. The adopt-on-verify path only stays on the new +// engine if Go lsml.HashBundle agrees byte-for-byte with the TS hash for +// the SAME logical bundle; any mismatch silently falls back to legacy. +// +// Each sub-test feeds the SAME logical bundle to Go HashBundle and asserts +// the canonical bytes + hash match the TS golden. +// +// - case_a_float : exponential / shortest-decimal floats -> MATCH (verified) +// - case_b_html : strings containing & < > -> MATCH (since fix) +// - case_c_opt : optional field absent -> MATCH (verified) +// +// RESOLVED DIVERGENCE (case_b_html), reported 2026-06-05, fixed in +// hash.go via marshalString (json.Encoder.SetEscapeHTML(false)): +// Go's encoding/json escapes &,<,> as &,<,> by default +// (SetEscapeHTML(true)); TS JSON.stringify does NOT. hash.go now disables +// HTML escaping for both string values and object keys so the canonical +// form is byte-identical to canonicalize.ts §3. case_b_html is now a +// permanent regression golden locking the TS hash — any future SDK change +// that reintroduces escaping turns this test red. + +type xlangGolden struct { + name string + bundle string // raw LSML 1.1 JSON, scene_version already zeroed + tsHash string // sha256 from @lumencast/compiler.hashBundle + tsCanon string // canonical JSON string from canonicalize.ts + expectGap bool // true = known divergence, gate intentionally red +} + +func xlangGoldenCases() []xlangGolden { + return []xlangGolden{ + { + name: "case_a_float", + bundle: `{"lsml":"1.1","scene_id":"s","scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000","layout":{"kind":"stack"},"defaults":{"tiny":0.0000001,"exp":1.5e-10,"whole":2.0,"big":1234567890123456789}}`, + tsHash: "16dee731508082b869796d77d45832e1d780866259ab48f5918e12c547c94662", + tsCanon: `{"defaults":{"big":1234567890123456800,"exp":1.5e-10,"tiny":1e-7,"whole":2},"layout":{"kind":"stack"},"lsml":"1.1","scene_id":"s","scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000"}`, + }, + { + name: "case_b_html", + bundle: `{"lsml":"1.1","scene_id":"s","scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000","layout":{"kind":"stack"},"metadata":{"title":"A & B "}}`, + tsHash: "7050dd0c6c1a92a174db87b457eb66205519cd87ac583694f97c8c3fb7da097c", + tsCanon: `{"layout":{"kind":"stack"},"lsml":"1.1","metadata":{"title":"A & B "},"scene_id":"s","scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000"}`, + }, + { + name: "case_c_optional_absent", + bundle: `{"lsml":"1.1","scene_id":"s","scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000","layout":{"kind":"stack"}}`, + tsHash: "f3f9db9b4436fe3ba31794e74d5c5959f94e90360c78d783adcd71989e2bd85c", + tsCanon: `{"layout":{"kind":"stack"},"lsml":"1.1","scene_id":"s","scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000"}`, + }, + } +} + +func TestHashBundle_CrossLanguageGolden(t *testing.T) { + for _, tc := range xlangGoldenCases() { + t.Run(tc.name, func(t *testing.T) { + var b lsml.Bundle + if err := json.Unmarshal([]byte(tc.bundle), &b); err != nil { + t.Fatalf("unmarshal bundle: %v", err) + } + goHash, goCanon, err := lsml.HashBundle(&b) + if err != nil { + t.Fatalf("HashBundle: %v", err) + } + + canonMatch := string(goCanon) == tc.tsCanon + hashMatch := goHash == tc.tsHash + + if tc.expectGap { + // Known SDK divergence. We assert it is STILL divergent so + // the gate flags the moment the fix lands (then flip expectGap). + if canonMatch && hashMatch { + t.Fatalf("KNOWN DIVERGENCE RESOLVED for %s — Go and TS now agree. "+ + "Remove expectGap and treat this case as a normal golden.", tc.name) + } + t.Logf("known divergence (expected) — Go canon: %s | TS canon: %s", goCanon, tc.tsCanon) + t.Logf("Go hash: %s | TS hash: %s", goHash, tc.tsHash) + return + } + + if !canonMatch { + t.Errorf("canonical bytes diverge for %s\n go: %s\n ts: %s", tc.name, goCanon, tc.tsCanon) + } + if !hashMatch { + t.Errorf("sha256 diverges for %s\n go: %s\n ts: %s", tc.name, goHash, tc.tsHash) + } + }) + } +} + +// TestHashRaw_CrossLanguageGolden pins HashRaw on the SAME TS-produced +// goldens, fed as the raw bytes they are — no struct in the path. Every +// golden here is struct-representable, so this is the case where HashRaw and +// HashBundle MUST agree; the divergence HashRaw exists for is covered by +// TestHashRaw_PreservesMembersBundleDoesNotDeclare. +func TestHashRaw_CrossLanguageGolden(t *testing.T) { + for _, tc := range xlangGoldenCases() { + if tc.expectGap { + continue + } + t.Run(tc.name, func(t *testing.T) { + rawHash, rawCanon, err := lsml.HashRaw([]byte(tc.bundle)) + if err != nil { + t.Fatalf("HashRaw: %v", err) + } + if string(rawCanon) != tc.tsCanon { + t.Errorf("canonical bytes diverge from TS\n go: %s\n ts: %s", rawCanon, tc.tsCanon) + } + if rawHash != tc.tsHash { + t.Errorf("sha256 diverges from TS\n go: %s\n ts: %s", rawHash, tc.tsHash) + } + + // And it agrees with the struct path on the inputs the struct can + // carry — HashBundle delegates here, so a divergence would mean + // the marshal step is not the identity it claims to be. + var b lsml.Bundle + if err := json.Unmarshal([]byte(tc.bundle), &b); err != nil { + t.Fatalf("unmarshal bundle: %v", err) + } + bundleHash, _, err := lsml.HashBundle(&b) + if err != nil { + t.Fatalf("HashBundle: %v", err) + } + if bundleHash != rawHash { + t.Errorf("HashBundle %s != HashRaw %s on a struct-representable bundle", + bundleHash, rawHash) + } + }) + } +} + +// The reason HashRaw exists. Bundle is a typed VIEW: a member it does not +// declare is dropped on unmarshal, so hashing the struct hashes something +// the sender never sent. A verifier built on HashBundle would report drift +// on every document carrying such a member — here `animations`, which real +// producers do carry — and the report would be about this struct's field +// list, not about the document. +func TestHashRaw_PreservesMembersBundleDoesNotDeclare(t *testing.T) { + const raw = `{"lsml":"1.1","scene_id":"s",` + + `"scene_version":"sha256:0000000000000000000000000000000000000000000000000000000000000000",` + + `"layout":{"kind":"stack"},"animations":{"pop":{"target":"score","keyframes":[]}}}` + + rawHash, rawCanon, err := lsml.HashRaw([]byte(raw)) + if err != nil { + t.Fatalf("HashRaw: %v", err) + } + if !strings.Contains(string(rawCanon), `"animations"`) { + t.Fatalf("HashRaw dropped a member it must preserve: %s", rawCanon) + } + + var b lsml.Bundle + if err := json.Unmarshal([]byte(raw), &b); err != nil { + t.Fatalf("unmarshal: %v", err) + } + structHash, structCanon, err := lsml.HashBundle(&b) + if err != nil { + t.Fatalf("HashBundle: %v", err) + } + if strings.Contains(string(structCanon), `"animations"`) { + t.Fatal("Bundle now declares animations — this test's premise is stale, revisit it") + } + if structHash == rawHash { + t.Fatal("struct and raw hashes agree despite a dropped member: the loss is undetectable") + } +} + +// A bundle with no scene_version at all still hashes: setSceneVersion only +// substitutes a member that exists. Guards the verifier against panicking on +// a malformed document instead of simply reporting a mismatch. +func TestHashRaw_ToleratesAbsentSceneVersion(t *testing.T) { + if _, _, err := lsml.HashRaw([]byte(`{"lsml":"1.1","layout":{"kind":"stack"}}`)); err != nil { + t.Fatalf("HashRaw on a bundle without scene_version: %v", err) + } +} + +// Malformed JSON is an error, never a hash — a verifier must not be able to +// mistake garbage for a value that simply differs. +func TestHashRaw_RejectsMalformedJSON(t *testing.T) { + if _, _, err := lsml.HashRaw([]byte(`{"lsml":`)); err == nil { + t.Fatal("HashRaw accepted malformed JSON") + } +} diff --git a/third_party/lumencast-go/lsml/lsml_test.go b/third_party/lumencast-go/lsml/lsml_test.go new file mode 100644 index 00000000..a67f8dbc --- /dev/null +++ b/third_party/lumencast-go/lsml/lsml_test.go @@ -0,0 +1,122 @@ +package lsml_test + +import ( + "encoding/json" + "testing" + + "github.com/Lumencast/lumencast-go/lsml" +) + +func TestValidate_Minimal(t *testing.T) { + b := &lsml.Bundle{ + LSML: "1.0", + SceneID: "main", + SceneVersion: "sha256:abc", + Layout: json.RawMessage(`{"kind":"text","bind":{"value":"x"}}`), + } + rep := lsml.Validate(b) + if len(rep.Errors) != 0 { + t.Fatalf("unexpected errors: %+v", rep.Errors) + } +} + +func TestValidate_ImageRequiresAlt(t *testing.T) { + b := &lsml.Bundle{ + LSML: "1.0", + SceneID: "main", + SceneVersion: "sha256:abc", + Layout: json.RawMessage(`{ + "kind": "frame", + "size": {"w":100,"h":100}, + "children": [ + {"kind":"image","bind":{"src":"team.logo"},"size":{"w":10,"h":10}} + ] + }`), + } + rep := lsml.Validate(b) + if len(rep.Errors) == 0 { + t.Fatal("missing alt should error") + } +} + +func TestValidate_AnimateDiscipline(t *testing.T) { + b := &lsml.Bundle{ + LSML: "1.0", + SceneID: "main", + SceneVersion: "sha256:abc", + Layout: json.RawMessage(`{ + "kind": "frame", + "animate": { "width": 200 } + }`), + } + rep := lsml.Validate(b) + if len(rep.Errors) == 0 { + t.Fatal("animating width should error") + } +} + +func TestValidate_UnknownPrimitive(t *testing.T) { + b := &lsml.Bundle{ + LSML: "1.0", + SceneID: "main", + SceneVersion: "sha256:abc", + Layout: json.RawMessage(`{"kind":"unicorn"}`), + } + rep := lsml.Validate(b) + if len(rep.Errors) == 0 { + t.Fatal("unknown primitive should error") + } +} + +func TestValidate_RejectsBadVersion(t *testing.T) { + b := &lsml.Bundle{ + LSML: "2.0", + SceneID: "main", + SceneVersion: "sha256:abc", + Layout: json.RawMessage(`{"kind":"text","bind":{"value":"x"}}`), + } + rep := lsml.Validate(b) + if len(rep.Errors) == 0 { + t.Fatal("LSML 2.0 should error") + } +} + +func TestHashBundle_Stable(t *testing.T) { + b := &lsml.Bundle{ + LSML: "1.0", + SceneID: "main", + SceneVersion: "sha256:placeholder", + Layout: json.RawMessage(`{"kind":"text","bind":{"value":"x"}}`), + Defaults: map[string]any{"x": "Hello"}, + } + h1, _, err := lsml.HashBundle(b) + if err != nil { + t.Fatal(err) + } + h2, _, err := lsml.HashBundle(b) + if err != nil { + t.Fatal(err) + } + if h1 != h2 { + t.Fatalf("hash unstable: %s vs %s", h1, h2) + } + if len(h1) != 64 { + t.Fatalf("hex length = %d, want 64", len(h1)) + } +} + +func TestHashBundle_IndependentOfSceneVersion(t *testing.T) { + b1 := &lsml.Bundle{ + LSML: "1.0", + SceneID: "main", + SceneVersion: "sha256:aaa", + Layout: json.RawMessage(`{"kind":"text","bind":{"value":"x"}}`), + } + b2 := *b1 + b2.SceneVersion = "sha256:bbb" + h1, _, _ := lsml.HashBundle(b1) + h2, _, _ := lsml.HashBundle(&b2) + if h1 != h2 { + t.Fatalf("scene_version influences hash: %s vs %s", h1, h2) + } +} diff --git a/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/README.md b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/README.md new file mode 100644 index 00000000..6d38788c --- /dev/null +++ b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/README.md @@ -0,0 +1,50 @@ +# Cross-language hashBundle golden — reproduction harness + +Gate for **ADR 007 §C4** (adopt-on-verify). Verifies that Go +`lsml.HashBundle` agrees byte-for-byte with the TS reference +`@lumencast/compiler.hashBundle` (`canonicalize.ts`) for the same +logical LSML 1.1 bundle. + +The encoded golden values live in +`../../hash_xlang_golden_test.go`. This directory documents how they +were captured so they can be regenerated when the SDK fix lands. + +## Bundles under test + +| Case | Risk | Verdict | +|---|---|---| +| `case_a_float` | exponential / shortest-decimal floats, >2^53 int | MATCH | +| `case_b_html` | strings with `&` `<` `>` | MATCH (since fix, 2026-06-05) | +| `case_c_optional_absent` | optional field absent vs `omitempty` | MATCH | + +## Resolved divergence (case_b_html) + +Go `encoding/json` escaped `&`→`&`, `<`→`<`, `>`→`>` by +default (`SetEscapeHTML(true)`); TS `JSON.stringify` does not. Same §3 +discipline on paper, divergent serializers in practice. + +Fixed in `lsml/hash.go` by routing every string emission (both object +values and object keys) through `marshalString`, which uses a +`json.Encoder` with `SetEscapeHTML(false)`. The canonical form is now +byte-identical to `canonicalize.ts`. `case_b_html` is a permanent +regression golden locking the TS hash. + +## Regenerate the TS golden + +```bash +# TS side (Node >= 22), from a checkout of lumencast-js with compiler built: +node -e ' +import("@lumencast/compiler").then(async ({canonicalize, ZERO_HASH}) => { + const fs = await import("node:fs"); + const b = JSON.parse(fs.readFileSync(process.argv[1], "utf8")); + const canon = canonicalize({ ...b, scene_version: ZERO_HASH }); + const dg = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(canon)); + const hex = [...new Uint8Array(dg)].map(x=>x.toString(16).padStart(2,"0")).join(""); + console.log(JSON.stringify({ hash: hex, canonical: canon }, null, 2)); +})' bundle.json +``` + +```bash +# Go side, from lumencast-go root: +go test ./lsml/ -run HashBundle_CrossLanguageGolden -v +``` diff --git a/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_a_float.json b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_a_float.json new file mode 100644 index 00000000..850879da --- /dev/null +++ b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_a_float.json @@ -0,0 +1,7 @@ +{ + "lsml": "1.1", + "scene_id": "s", + "scene_version": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "layout": { "kind": "stack" }, + "defaults": { "tiny": 0.0000001, "exp": 1.5e-10, "whole": 2.0, "big": 1234567890123456789 } +} diff --git a/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_b_htmlchars.json b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_b_htmlchars.json new file mode 100644 index 00000000..9b928609 --- /dev/null +++ b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_b_htmlchars.json @@ -0,0 +1,7 @@ +{ + "lsml": "1.1", + "scene_id": "s", + "scene_version": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "layout": { "kind": "stack" }, + "metadata": { "title": "A & B " } +} diff --git a/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_c_optional_absent.json b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_c_optional_absent.json new file mode 100644 index 00000000..cc9b2e17 --- /dev/null +++ b/third_party/lumencast-go/lsml/testdata/hashbundle-xlang/case_c_optional_absent.json @@ -0,0 +1,6 @@ +{ + "lsml": "1.1", + "scene_id": "s", + "scene_version": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "layout": { "kind": "stack" } +} diff --git a/third_party/lumencast-go/lsml/validate.go b/third_party/lumencast-go/lsml/validate.go new file mode 100644 index 00000000..83b06f2d --- /dev/null +++ b/third_party/lumencast-go/lsml/validate.go @@ -0,0 +1,149 @@ +package lsml + +import ( + "encoding/json" + "fmt" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// Issue is one validation finding. +type Issue struct { + // Path is the JSON path inside the bundle (e.g. "layout.children[0].bind.value"). + Path string + // Message is human-readable. + Message string +} + +// Report aggregates errors and warnings from a single Validate call. +type Report struct { + Errors []Issue + Warnings []Issue +} + +// Validate runs the LSML 1.0 schema, animation discipline, +// accessibility, and bind-path checks. Returns a non-empty Report on +// any finding ; len(Report.Errors) == 0 means the bundle passes. +func Validate(b *Bundle) *Report { + r := &Report{} + + if b == nil { + r.Errors = append(r.Errors, Issue{"", "nil bundle"}) + return r + } + if b.LSML != Version { + r.Errors = append(r.Errors, Issue{"lsml", fmt.Sprintf("unsupported version %q (this validator implements %s)", b.LSML, Version)}) + } + if b.SceneID == "" { + r.Errors = append(r.Errors, Issue{"scene_id", "required"}) + } + if b.SceneVersion == "" { + r.Errors = append(r.Errors, Issue{"scene_version", "required"}) + } + if len(b.Layout) == 0 { + r.Errors = append(r.Errors, Issue{"layout", "required"}) + } else { + validateNode(r, "layout", b.Layout, b.Assets) + } + + for i, oi := range b.OperatorInputs { + path := fmt.Sprintf("operator_inputs[%d]", i) + if err := protocol.LeafPath(oi.Path).Validate(); err != nil { + r.Errors = append(r.Errors, Issue{path + ".path", err.Error()}) + } + if oi.Label == "" { + r.Errors = append(r.Errors, Issue{path + ".label", "required"}) + } + if oi.Type == "" { + r.Errors = append(r.Errors, Issue{path + ".type", "required"}) + } + if len(oi.WritableBy) == 0 { + r.Errors = append(r.Errors, Issue{path + ".writable_by", "required, non-empty"}) + } + } + + for path := range b.Defaults { + if err := protocol.LeafPath(path).Validate(); err != nil { + r.Errors = append(r.Errors, Issue{"defaults." + path, err.Error()}) + } + } + + return r +} + +// validateNode recursively inspects a primitive subtree. +func validateNode(r *Report, base string, raw json.RawMessage, assets *Assets) { + var node map[string]any + if err := json.Unmarshal(raw, &node); err != nil { + r.Errors = append(r.Errors, Issue{base, "invalid JSON: " + err.Error()}) + return + } + kind, _ := node["kind"].(string) + if kind == "" { + r.Errors = append(r.Errors, Issue{base + ".kind", "required"}) + return + } + if !knownPrimitive(kind) { + r.Errors = append(r.Errors, Issue{base + ".kind", fmt.Sprintf("unknown primitive %q (LSML 1.0 supports : stack, grid, frame, text, image, shape, media, repeat)", kind)}) + return + } + + // Bind paths must be valid LeafPath. Scope placeholders ({name}) + // are accepted because primitives may be inside a repeat template. + if bind, ok := node["bind"].(map[string]any); ok { + for k, v := range bind { + s, ok := v.(string) + if !ok { + continue + } + if err := protocol.LeafPath(s).ValidateTemplate(); err != nil { + r.Errors = append(r.Errors, Issue{base + ".bind." + k, err.Error()}) + } + } + } + + // Animate discipline : transform / opacity / filter only. + if anim, ok := node["animate"].(map[string]any); ok { + for k := range anim { + if k == "transition" || k == "transform" || k == "opacity" || k == "filter" || k == "respectsReducedMotion" { + continue + } + r.Errors = append(r.Errors, Issue{base + ".animate." + k, + "only transform, opacity, filter are animatable in LSML 1.0"}) + } + } + + // Accessibility : image MUST have alt. + if kind == "image" { + if _, hasAlt := node["alt"]; !hasAlt { + r.Errors = append(r.Errors, Issue{base + ".alt", + "required for image (LSML 1.0 § 13). Use \"\" for decorative images."}) + } + // Asset host check. + if assets != nil && len(assets.AllowedHosts) > 0 { + // Bind src → can't statically check the URL ; warn only. + r.Warnings = append(r.Warnings, Issue{base + ".bind.src", + "image URLs are bound at runtime ; ensure your operator UI restricts to allowedHosts"}) + } + } + + // Recurse into children. + if children, ok := node["children"].([]any); ok { + for i, child := range children { + b, _ := json.Marshal(child) + validateNode(r, fmt.Sprintf("%s.children[%d]", base, i), b, assets) + } + } + if tmpl, ok := node["template"]; ok && kind == "repeat" { + b, _ := json.Marshal(tmpl) + validateNode(r, base+".template", b, assets) + } +} + +func knownPrimitive(kind string) bool { + switch kind { + case "stack", "grid", "frame", "text", "image", "shape", "media", "repeat": + return true + } + return false +} diff --git a/third_party/lumencast-go/protocol/codec.go b/third_party/lumencast-go/protocol/codec.go new file mode 100644 index 00000000..9afea3e0 --- /dev/null +++ b/third_party/lumencast-go/protocol/codec.go @@ -0,0 +1,233 @@ +package protocol + +import ( + "fmt" +) + +// Encode marshals a server-emitted frame to its canonical JSON +// representation. The envelope `v` and `type` fields are stamped +// regardless of what the caller put on the value, so callers can +// leave them zero-valued when constructing frames. +// +// Accepts both value and pointer receivers for ergonomics. +func Encode(msg any) ([]byte, error) { + switch m := msg.(type) { + case Snapshot: + m.V, m.Type = Version, TypeSnapshot + return marshal(m) + case *Snapshot: + c := *m + c.V, c.Type = Version, TypeSnapshot + return marshal(c) + case Delta: + m.V, m.Type = Version, TypeDelta + return marshal(m) + case *Delta: + c := *m + c.V, c.Type = Version, TypeDelta + return marshal(c) + case SceneChanged: + m.V, m.Type = Version, TypeSceneChanged + return marshal(m) + case *SceneChanged: + c := *m + c.V, c.Type = Version, TypeSceneChanged + return marshal(c) + case SceneRoster: + m.V, m.Type = Version, TypeSceneRoster + if m.Entries == nil { + m.Entries = []RosterEntry{} + } + return marshal(m) + case *SceneRoster: + c := *m + c.V, c.Type = Version, TypeSceneRoster + if c.Entries == nil { + c.Entries = []RosterEntry{} + } + return marshal(c) + case OverlayApps: + m.V, m.Type = Version, TypeOverlayApps + if m.Apps == nil { + m.Apps = map[string]OverlayAppState{} + } + return marshal(m) + case *OverlayApps: + c := *m + c.V, c.Type = Version, TypeOverlayApps + if c.Apps == nil { + c.Apps = map[string]OverlayAppState{} + } + return marshal(c) + case Error: + m.V, m.Type = Version, TypeError + return marshal(m) + case *Error: + c := *m + c.V, c.Type = Version, TypeError + return marshal(c) + case Pong: + m.V, m.Type = Version, TypePong + return marshal(m) + case *Pong: + c := *m + c.V, c.Type = Version, TypePong + return marshal(c) + case Ping: + m.V, m.Type = Version, TypePing + return marshal(m) + case *Ping: + c := *m + c.V, c.Type = Version, TypePing + return marshal(c) + case Subscribe: + m.V, m.Type = Version, TypeSubscribe + return marshal(m) + case *Subscribe: + c := *m + c.V, c.Type = Version, TypeSubscribe + return marshal(c) + case Input: + m.V, m.Type = Version, TypeInput + return marshal(m) + case *Input: + c := *m + c.V, c.Type = Version, TypeInput + return marshal(c) + case Unsubscribe: + m.V, m.Type = Version, TypeUnsubscribe + return marshal(m) + case *Unsubscribe: + c := *m + c.V, c.Type = Version, TypeUnsubscribe + return marshal(c) + default: + return nil, fmt.Errorf("protocol: cannot encode %T", msg) + } +} + +// Decode parses a client-emitted frame and dispatches on `type`. +// Returns one of (*Subscribe, *Input, *Ping, *Pong) — Pong because +// a client may answer a server-initiated ping. Forward-compatibility : +// unknown frame types yield ErrUnknownType so the WS layer can map it +// to an Error{Code: INTERNAL} response. +// +// Servers SHOULD use DecodeServer when they know they are reading +// from a client connection — it rejects server-only frame types. +func Decode(raw []byte) (any, error) { + var env envelope + if err := unmarshal(raw, &env); err != nil { + return nil, err + } + if env.V != Version { + return nil, fmt.Errorf("%w: got v=%d", ErrVersionMismatch, env.V) + } + switch env.Type { + case TypeSubscribe: + var m Subscribe + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeInput: + var m Input + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypePing: + // Decode the full Ping struct so the optional Nonce + // (LSDP/1.1 §4.3) round-trips. 1.0 clients omit Nonce ; + // the field stays empty. + var m Ping + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypePong: + // Same treatment — 1.1 clients may also send Pong with a + // Nonce (servers can ping clients per spec §3.5). + var m Pong + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeUnsubscribe: + var m Unsubscribe + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + default: + return nil, fmt.Errorf("%w: %q", ErrUnknownType, env.Type) + } +} + +// DecodeServer parses a server-emitted frame, used by clients (and +// the conformance harness). Returns one of (*Snapshot, *Delta, +// *SceneChanged, *SceneRoster, *Error, *Pong, *Ping). Per spec § 13, +// runtimes that +// receive an unknown frame type MUST silently ignore it ; the harness +// surfaces the unknown via ErrUnknownType so test code can choose. +func DecodeServer(raw []byte) (any, error) { + var env envelope + if err := unmarshal(raw, &env); err != nil { + return nil, err + } + if env.V != Version { + return nil, fmt.Errorf("%w: got v=%d", ErrVersionMismatch, env.V) + } + switch env.Type { + case TypeSnapshot: + var m Snapshot + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeDelta: + var m Delta + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeSceneChanged: + var m SceneChanged + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeSceneRoster: + var m SceneRoster + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeOverlayApps: + var m OverlayApps + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypeError: + var m Error + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypePong: + // Decode full Pong so the optional Nonce (1.1) round-trips. + var m Pong + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + case TypePing: + var m Ping + if err := unmarshal(raw, &m); err != nil { + return nil, err + } + return &m, nil + default: + return nil, fmt.Errorf("%w: %q", ErrUnknownType, env.Type) + } +} diff --git a/third_party/lumencast-go/protocol/envelope.go b/third_party/lumencast-go/protocol/envelope.go new file mode 100644 index 00000000..d9f561a8 --- /dev/null +++ b/third_party/lumencast-go/protocol/envelope.go @@ -0,0 +1,119 @@ +// Package protocol implements LSDP/1 — the Leaf State Delta Protocol, +// version 1. It is the wire layer that Lumencast servers and runtimes +// speak over WebSocket. +// +// The package is transport-agnostic : it does not import net/http or +// anything WebSocket-related. Every frame round-trips through these +// types ; nothing else in the SDK is allowed to assemble or parse a +// wire frame by hand. +// +// Spec : https://github.com/Lumencast/lumencast-protocol/blob/main/spec/LSDP-1.md +// +// Design rules : +// +// - Every envelope carries `v` and `type`. v == 1 in this package ; +// bumping to 2 is a separate, parallel implementation. +// - Server frames carry `seq` (per-subscription monotonic counter +// starting at 1). +// - Leaf values are passed as json.RawMessage so we do not lose +// fidelity on round-trip — null vs missing, integer vs float, etc. +// - Field tags match the on-wire spec exactly. Do not rename. +// - Receivers MUST ignore unknown top-level fields (forward compat). +package protocol + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" +) + +// Version is the protocol major. Always 1 for LSDP/1. The constant is +// the source of truth for both encode and decode. +const Version = 1 + +// SubProtocol is the LSDP/1.0 WebSocket subprotocol tag, kept for +// backwards-compatible negotiation. Clients that speak only 1.0 +// advertise this. Servers MUST reject upgrade requests that do not +// advertise either SubProtocol or SubProtocolV1_1 with HTTP 426. +const SubProtocol = "lsdp.v1" + +// SubProtocolV1_1 is the LSDP/1.1 WebSocket subprotocol tag. Clients +// advertising this opt into the additive 1.1 frame surface +// (since_sequence resume, unsubscribe frame, per-leaf transition +// directive, cause, nonce on ping/pong, client_msg_id on input, +// from_scene_id + show transition on scene_changed). Servers MUST +// continue to accept SubProtocol for 1.0 clients. +const SubProtocolV1_1 = "lsdp.v1.1" + +// SubProtocols is the canonical advertise/accept list, ordered by +// preference (1.1 preferred over 1.0). Pass this to the websocket +// upgrader's Subprotocols field — the library performs RFC-6455 +// preference negotiation. +var SubProtocols = []string{SubProtocolV1_1, SubProtocol} + +// Frame type discriminators. Constants instead of strings everywhere +// so a typo in a handler is a compile error, not a silent runtime +// mismatch. +const ( + TypeSnapshot = "snapshot" + TypeDelta = "delta" + TypeSceneChanged = "scene_changed" + TypeSceneRoster = "scene_roster" // LSDP/1.1 — additive show-level preload roster + TypeOverlayApps = "overlay_apps" // LSDP/1.1 — additive show-level overlay-app control + TypeError = "error" + TypePong = "pong" + TypeSubscribe = "subscribe" + TypeInput = "input" + TypePing = "ping" + TypeUnsubscribe = "unsubscribe" // LSDP/1.1 §4.4 +) + +// envelope is the minimal shape used to peek at `type` and `v` on +// incoming frames before dispatching to the right typed struct. +type envelope struct { + V int `json:"v"` + Type string `json:"type"` +} + +// ErrVersionMismatch is returned by Decode when the envelope `v` does +// not match the protocol major. The caller (server) is expected to +// answer with an Error frame and close. +var ErrVersionMismatch = errors.New("protocol: envelope v mismatch") + +// ErrUnknownType is returned by Decode when the envelope `type` is not +// one of the LSDP/1 client-side frames. Forward compatibility for +// server-emitted types is the runtime's responsibility (silently ignore). +var ErrUnknownType = errors.New("protocol: unknown frame type") + +// ErrInvalidEnvelope wraps a JSON syntax error or a missing required +// field on the envelope. +var ErrInvalidEnvelope = errors.New("protocol: invalid envelope") + +// marshal encodes a value with HTML escaping disabled so leaf paths +// containing `<`, `>`, `&` are preserved on the wire (instead of +// being rewritten as \u00xx, which would break canonical-form +// comparisons in the conformance suite). It also strips the trailing +// newline json.Encoder writes — a frame is exactly one JSON object. +func marshal(v any) ([]byte, error) { + buf := &bytes.Buffer{} + enc := json.NewEncoder(buf) + enc.SetEscapeHTML(false) + if err := enc.Encode(v); err != nil { + return nil, err + } + out := buf.Bytes() + if n := len(out); n > 0 && out[n-1] == '\n' { + out = out[:n-1] + } + return out, nil +} + +// unmarshal is the symmetric decode helper. Wraps the JSON error with +// the package-level ErrInvalidEnvelope so callers can match on it. +func unmarshal(raw []byte, dst any) error { + if err := json.Unmarshal(raw, dst); err != nil { + return fmt.Errorf("%w: %v", ErrInvalidEnvelope, err) + } + return nil +} diff --git a/third_party/lumencast-go/protocol/errors.go b/third_party/lumencast-go/protocol/errors.go new file mode 100644 index 00000000..649775e3 --- /dev/null +++ b/third_party/lumencast-go/protocol/errors.go @@ -0,0 +1,138 @@ +package protocol + +// ErrorCode is a closed taxonomy of LSDP/1 error codes. The set is +// frozen for LSDP/1.x ; new codes require a minor version bump +// (LSDP/1.1) per spec § 13. +// +// Every code has a documented recoverability semantics — see +// Recoverable() and the per-code commentary in ERROR-CODES.md. +type ErrorCode string + +const ( + // CodeAuthDenied — token invalid, expired, or revoked. + // Recoverable : false. Server closes. + CodeAuthDenied ErrorCode = "AUTH_DENIED" + + // CodeWriteForbidden — connection role does not permit the input. + // Recoverable : true. Connection stays open ; only the input is + // rejected. + CodeWriteForbidden ErrorCode = "WRITE_FORBIDDEN" + + // CodeSceneNotFound — scene field in subscribe is unknown. + // Recoverable : false. Server closes. + CodeSceneNotFound ErrorCode = "SCENE_NOT_FOUND" + + // CodeBundleFetchFailed — runtime cannot retrieve the LSML bundle. + // Recoverable : true. Runtime retries with backoff (≤ 3 attempts). + CodeBundleFetchFailed ErrorCode = "BUNDLE_FETCH_FAILED" + + // CodeBundleIncompatible — bundle declares an LSML major newer + // than the runtime supports. Recoverable : false. + CodeBundleIncompatible ErrorCode = "BUNDLE_INCOMPATIBLE" + + // CodeVersionGap — runtime detected a missing seq in the server + // stream. Recoverable : true via reconnect (close, reopen). + CodeVersionGap ErrorCode = "VERSION_GAP" + + // CodeVersionMismatch — protocol major mismatch (e.g. v=2 client + // against a v=1 server). Recoverable : false. + CodeVersionMismatch ErrorCode = "VERSION_MISMATCH" + + // CodeUnknownPath — input frame references a path not in the + // active scene's operator_inputs. Recoverable : true. Server + // rejects the entire input frame. + CodeUnknownPath ErrorCode = "UNKNOWN_PATH" + + // CodeInvalidValue — input value violates the type / constraint + // declared in the bundle. Recoverable : true. Server rejects + // the entire input frame. + CodeInvalidValue ErrorCode = "INVALID_VALUE" + + // CodeRateLimit — connection exceeded a server-side rate limit + // (commonly inputs/second). Recoverable : true with backoff. + // The Error frame MAY include retry_after_ms. + CodeRateLimit ErrorCode = "RATE_LIMIT" + + // CodeTestSessionExpired — test session past TTL. Recoverable : + // false. Server closes. + CodeTestSessionExpired ErrorCode = "TEST_SESSION_EXPIRED" + + // CodeInternal — server-side error not covered by a specific code. + // Recoverable : varies (server sets per case). + CodeInternal ErrorCode = "INTERNAL" +) + +// Recoverable returns the canonical recoverability for a code. The +// CodeInternal case returns the supplied default since recoverability +// varies per scenario for that code. +func (c ErrorCode) Recoverable(internalDefault bool) bool { + switch c { + case CodeWriteForbidden, + CodeBundleFetchFailed, + CodeVersionGap, + CodeUnknownPath, + CodeInvalidValue, + CodeRateLimit: + return true + case CodeAuthDenied, + CodeSceneNotFound, + CodeBundleIncompatible, + CodeVersionMismatch, + CodeTestSessionExpired: + return false + case CodeInternal: + return internalDefault + } + return false +} + +// IsKnown reports whether c is a documented LSDP/1 error code. +// Useful for runtime telemetry — surfaces a "spec drift" signal if a +// server emits an unrecognised code. +func (c ErrorCode) IsKnown() bool { + switch c { + case CodeAuthDenied, + CodeWriteForbidden, + CodeSceneNotFound, + CodeBundleFetchFailed, + CodeBundleIncompatible, + CodeVersionGap, + CodeVersionMismatch, + CodeUnknownPath, + CodeInvalidValue, + CodeRateLimit, + CodeTestSessionExpired, + CodeInternal: + return true + } + return false +} + +// LumencastError is the runtime-friendly Go counterpart to the wire +// Error frame. Server emit code is via Error{} ; clients (and the +// conformance harness) consume LumencastError. +type LumencastError struct { + Code ErrorCode `json:"code"` + Message string `json:"message"` + Recoverable bool `json:"recoverable"` + + // Path is the offending leaf path. Set on the path-scoped codes + // (WRITE_FORBIDDEN, UNKNOWN_PATH, INVALID_VALUE), empty otherwise + // — LSDP/1 §3.4.1. + Path string `json:"path,omitempty"` +} + +// Error implements the standard library error interface. +func (e *LumencastError) Error() string { + return string(e.Code) + ": " + e.Message +} + +// FromFrame converts an Error wire frame to a LumencastError. +func FromFrame(f *Error) *LumencastError { + return &LumencastError{ + Code: ErrorCode(f.Code), + Message: f.Message, + Recoverable: f.Recoverable, + Path: f.Path, + } +} diff --git a/third_party/lumencast-go/protocol/frames.go b/third_party/lumencast-go/protocol/frames.go new file mode 100644 index 00000000..37776e33 --- /dev/null +++ b/third_party/lumencast-go/protocol/frames.go @@ -0,0 +1,293 @@ +package protocol + +import "encoding/json" + +// TransitionSpec is a per-leaf animation directive on a delta patch +// (LSDP/1.1 §3.2.2). Servers MAY emit it ; runtimes interpret it when +// applying the new value. 1.0 receivers ignore it. +// +// Kind is one of "tween", "spring", or "snap". Each kind reads a +// different subset of the remaining fields ; servers SHOULD only +// emit fields appropriate to the chosen kind. +type TransitionSpec struct { + Kind string `json:"kind"` + DurationMs int `json:"duration_ms,omitempty"` // tween only + Easing string `json:"easing,omitempty"` // tween only — "linear", "ease-in", "ease-out", "ease-in-out" + Stiffness float64 `json:"stiffness,omitempty"` // spring only + Damping float64 `json:"damping,omitempty"` // spring only +} + +// Cause is the optional provenance metadata on a delta (LSDP/1.1 +// §3.2.3). Debug- and audit-only ; receivers MUST NOT use it for +// semantic decisions. +type Cause struct { + Source string `json:"source"` // e.g. "operator:user-abc", "adapter:http_poll" + InputID string `json:"input_id,omitempty"` // echoes Input.ClientMsgID +} + +// ProjectionMetadata carries optional, non-semantic metadata attached +// to a delta. Receivers MAY store it for traceability and diagnostics. +type ProjectionMetadata struct { + SchemaVersion string `json:"schema_version,omitempty"` + SceneDigest string `json:"scene_digest,omitempty"` + RuntimeInstanceID string `json:"runtime_instance_id,omitempty"` + Target string `json:"target,omitempty"` + RenderRevision string `json:"render_revision,omitempty"` + CorrelationID string `json:"correlation_id,omitempty"` +} + +// SceneTransition is a show-level scene-swap transition on a +// scene_changed frame (LSDP/1.1 §3.3.1). +type SceneTransition struct { + Kind string `json:"kind"` // "crossfade" (more kinds reserved for future minors) + DurationMs int `json:"duration_ms,omitempty"` +} + +// Snapshot is the full state of a subscription at a point in time. +// Server emits exactly one Snapshot per subscription, immediately +// after a successful Subscribe. Reconnection or SceneChanged +// triggers a new Snapshot with seq reset to 1. +// +// The State map MUST be flat : keys are dotted leaf paths, values +// are arbitrary JSON. Nested objects whose keys overlap with +// declared scene paths are forbidden. +type Snapshot struct { + V int `json:"v"` + Type string `json:"type"` + Seq uint64 `json:"seq"` + TS string `json:"ts,omitempty"` + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + State map[string]json.RawMessage `json:"state"` + + // Projection metadata is optional and non-semantic — the same six + // fields carried on Delta (below). These are additive and unknown to + // legacy readers (which should ignore them). A server that knows the + // scene's last projection identity SHOULD stamp it here too, so a + // subscriber that never saw the originating Delta — because it + // resumed via a fresh Snapshot, joined late, or collapsed out of + // back-pressure — does not lose correlation identity. + SchemaVersion string `json:"schema_version,omitempty"` + SceneDigest string `json:"scene_digest,omitempty"` + RuntimeInstanceID string `json:"runtime_instance_id,omitempty"` + Target string `json:"target,omitempty"` + RenderRevision string `json:"render_revision,omitempty"` + CorrelationID string `json:"correlation_id,omitempty"` +} + +// Delta carries one or more leaf patches. Patches are applied +// left-to-right ; the receiver MUST treat the whole delta as +// atomic — no partial application visible to the renderer. +// +// Patch.Value MUST NOT be a JSON object. Push leaf-grain patches +// for nested updates instead. +type Delta struct { + V int `json:"v"` + Type string `json:"type"` + Seq uint64 `json:"seq"` + TS string `json:"ts,omitempty"` + Patches []Patch `json:"patches"` + + // Cause is the optional provenance metadata for this delta + // (LSDP/1.1 §3.2.3). Receivers MUST NOT use it for semantic + // decisions — debug/audit only. 1.0 servers omit this field. + Cause *Cause `json:"cause,omitempty"` + + // Projection metadata is optional and non-semantic. These fields are + // additive and unknown to legacy readers (which should ignore them). + SchemaVersion string `json:"schema_version,omitempty"` + SceneDigest string `json:"scene_digest,omitempty"` + RuntimeInstanceID string `json:"runtime_instance_id,omitempty"` + Target string `json:"target,omitempty"` + RenderRevision string `json:"render_revision,omitempty"` + CorrelationID string `json:"correlation_id,omitempty"` +} + +// Patch addresses a single leaf with its new value. +type Patch struct { + Path string `json:"path"` + Value json.RawMessage `json:"value"` + + // Transition is an optional per-leaf animation directive + // (LSDP/1.1 §3.2.2). When present, the runtime applies the + // described transition while interpolating to the new Value. + // 1.0 receivers ignore. 1.0 servers omit. + Transition *TransitionSpec `json:"transition,omitempty"` +} + +// SceneChanged signals the active scene has been swapped. The +// runtime MUST refetch the bundle at SceneVersion and crossfade. +// The next server frame after a SceneChanged MUST be a Snapshot +// with seq = 1. +type SceneChanged struct { + V int `json:"v"` + Type string `json:"type"` + Seq uint64 `json:"seq"` + TS string `json:"ts,omitempty"` + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` + + // FromSceneID is the previously active scene id (LSDP/1.1 + // §3.3.1). Lets the runtime render layered crossfades that need + // both endpoints. 1.0 receivers ignore. + FromSceneID string `json:"from_scene_id,omitempty"` + + // Transition is the show-level scene-swap directive (LSDP/1.1 + // §3.3.1). When absent, the runtime falls back to its default + // crossfade. 1.0 receivers ignore. + Transition *SceneTransition `json:"transition,omitempty"` +} + +// RosterEntry is one scene in a show's preload roster : the scene id +// and the content hash (scene_version) the runtime should preload the +// bundle at. +type RosterEntry struct { + SceneID string `json:"scene_id"` + SceneVersion string `json:"scene_version"` +} + +// SceneRoster is an additive, show-level frame advertising the full set +// of scenes (and their versions) available on the live show, so a +// runtime can preload every bundle ahead of a scene swap (Prism#230, +// Lumencast/lumencast-js#88). +// +// It carries no `seq` : it is out-of-band show metadata, not a +// per-subscription state frame — parity with pong heartbeats (spec §5). +// Servers SHOULD emit it only to subscribers that negotiated +// lsdp.v1.1 ; 1.0 receivers silently ignore unknown frame types +// (spec §13). The server emits one on subscribe (right after the +// initial snapshot) and again whenever the roster changes. +// +// Entries is required and MUST encode as a JSON array (never null) ; +// an empty roster is `[]`. +type SceneRoster struct { + V int `json:"v"` + Type string `json:"type"` + Entries []RosterEntry `json:"entries"` + TS string `json:"ts,omitempty"` +} + +// OverlayAppState is the control state of one show-level overlay app: the +// desired process state (Running) and on-air compositing state (OnAir). Both +// are OPTIONAL (nil = "this dimension was never set", so a consumer leaves it +// unchanged) — mirroring the partial-update semantics of the two boolean +// leaves the state used to ride as (`__overlay..running|on_air`). A +// consumer that reconciles an overlay app reads whichever dimensions are +// present. +type OverlayAppState struct { + Running *bool `json:"running,omitempty"` + OnAir *bool `json:"on_air,omitempty"` +} + +// OverlayApps is an additive, show-level frame carrying the COMPLETE desired +// state of every stream-level overlay app (ADR 016 Prism §3.2, Marker). It is +// the overlay analogue of SceneRoster: show metadata, not per-scene state, so +// it is deliverable to a subscriber even when NO scene is active (the overlay +// control lives above any single scene and survives scene switches). +// +// Like SceneRoster it carries no `seq` (out-of-band show metadata), is emitted +// only to lsdp.v1.1 subscribers (1.0 silently ignore unknown types, spec §13), +// and is sent once on subscribe (after the initial snapshot / roster) and again +// whenever the overlay-app set changes. Apps is a FULL snapshot each time (not +// a delta) and MUST encode as a JSON object (never null); an empty set is `{}`. +type OverlayApps struct { + V int `json:"v"` + Type string `json:"type"` + Apps map[string]OverlayAppState `json:"apps"` + TS string `json:"ts,omitempty"` +} + +// Error is the server-emitted error frame. Recoverable=false signals +// "stop trying" ; the server MUST close the WebSocket within 1 second +// of sending. Recoverable=true keeps the connection open. +type Error struct { + V int `json:"v"` + Type string `json:"type"` + Seq uint64 `json:"seq"` + TS string `json:"ts,omitempty"` + Code string `json:"code"` + Message string `json:"message"` + Recoverable bool `json:"recoverable"` + + // Path is REQUIRED on the path-scoped codes — WRITE_FORBIDDEN, + // UNKNOWN_PATH and INVALID_VALUE (§3.4.1) — and MUST be absent + // otherwise, hence `omitempty`. + Path string `json:"path,omitempty"` + + // RetryAfterMs is optional and MAY be set on RATE_LIMIT errors. + // Encoded as `retry_after_ms` ; runtimes MAY honour it as a + // throttle hint. + RetryAfterMs int `json:"retry_after_ms,omitempty"` +} + +// Pong is the server's reply to a client Ping. Heartbeats carry no +// `seq` ; they are out-of-band per spec § 5. +type Pong struct { + V int `json:"v"` + Type string `json:"type"` + + // Nonce echoes the matching Ping.Nonce verbatim (LSDP/1.1 §3.5). + // 1.0 servers reply with a bare pong. + Nonce string `json:"nonce,omitempty"` +} + +// Subscribe is the first frame a client sends after WebSocket open. +// Identifies the client (Token) and the subscription target. +// +// - Token : opaque, server-validated. +// - Scene : required for test mode, forbidden in live mode (server +// picks the active scene). Encode/decode is permissive ; the +// server enforces the conditional. +// - Session : required for test mode with isolated session. +type Subscribe struct { + V int `json:"v"` + Type string `json:"type"` + Token string `json:"token"` + Scene string `json:"scene,omitempty"` + Session string `json:"session,omitempty"` + + // SinceSequence requests an incremental resume from a known + // last-seen seq (LSDP/1.1 §4.1, §18). When the server's replay + // buffer covers the gap, it responds with deltas resuming from + // SinceSequence+1 ; otherwise it falls back to a fresh snapshot + // (sequence reset). 1.0 servers MUST ignore this field. Zero + // means "no resume requested" — start with a fresh snapshot. + SinceSequence uint64 `json:"since_sequence,omitempty"` +} + +// Input mutates operator inputs. Allowed for clients with operator, +// service or test role. Patches are atomic — if any patch is invalid, +// the server MUST reject the entire frame and apply nothing. +type Input struct { + V int `json:"v"` + Type string `json:"type"` + Patches []Patch `json:"patches"` + + // ClientMsgID is a free-form correlation tag (LSDP/1.1 §4.2). + // The server MUST echo this value verbatim in Cause.InputID of + // the resulting delta — enables optimistic-UI reconciliation. + // 1.0 servers ignore. Empty string means "no correlation". + ClientMsgID string `json:"client_msg_id,omitempty"` +} + +// Ping is a client-initiated heartbeat. Receiver MUST reply with Pong +// within 5 seconds. +type Ping struct { + V int `json:"v"` + Type string `json:"type"` + + // Nonce is a free-form correlation identifier (LSDP/1.1 §4.3). + // The receiver MUST echo it verbatim in the Pong reply. 1.0 + // receivers reply with a bare Pong. + Nonce string `json:"nonce,omitempty"` +} + +// Unsubscribe is the clean-teardown signal a 1.1 client sends to +// indicate it is done with the subscription (LSDP/1.1 §4.4). The +// server MUST close the WebSocket within 1 second of receipt. No +// data flows after this frame. 1.0 servers receiving this MUST +// respond with an Error{Code: INTERNAL or UNKNOWN_TYPE} and close. +type Unsubscribe struct { + V int `json:"v"` + Type string `json:"type"` +} diff --git a/third_party/lumencast-go/protocol/leaf_path.go b/third_party/lumencast-go/protocol/leaf_path.go new file mode 100644 index 00000000..c8ebb80a --- /dev/null +++ b/third_party/lumencast-go/protocol/leaf_path.go @@ -0,0 +1,178 @@ +package protocol + +import ( + "fmt" + "strings" + "unicode" +) + +// LeafPath is a dotted reference to a single leaf in the subscription +// state map. Examples : "show.title", "players.0.name", "__inputs.locale". +// +// Syntax (from LSDP/1 § 10 + LSML 1.0 § 5) : +// +// - Segments are alphanumeric + underscore. The first character of a +// segment MUST be a letter, an underscore, or a digit (numeric +// indices). Hyphens, spaces and other punctuation are forbidden. +// - Reserved namespaces start with double underscore : __inputs, +// __system, __test, __schema. User-defined paths MUST NOT start +// with double underscore. +// - A path MAY contain scope substitution placeholders in the +// {name} form, but ONLY inside an LSML repeat template. The +// wire-level path that travels in a Patch MUST be fully +// substituted (no braces). +type LeafPath string + +// Validate checks the path is syntactically well-formed for the +// wire layer (no scope placeholders allowed). Use ValidateTemplate +// for the LSML pre-substitution form. +func (p LeafPath) Validate() error { + return validatePath(string(p), false) +} + +// ValidateTemplate is the lenient form used to validate a path inside +// an LSML repeat template. {scope} placeholders are accepted. +func (p LeafPath) ValidateTemplate() error { + return validatePath(string(p), true) +} + +// IsReserved reports whether the path begins with a reserved namespace +// segment ("__inputs", "__system", "__test", "__schema"). +func (p LeafPath) IsReserved() bool { + for _, ns := range reservedNamespaces { + if string(p) == ns || strings.HasPrefix(string(p), ns+".") { + return true + } + } + return false +} + +// Namespace returns the leading segment (e.g. "__inputs") or the +// empty string if the path is empty. +func (p LeafPath) Namespace() string { + if i := strings.IndexByte(string(p), '.'); i >= 0 { + return string(p)[:i] + } + return string(p) +} + +// HasPrefix reports whether the leaf path falls under a parent prefix. +// Prefix matching is segment-aware : "players" matches "players.0.score" +// but not "playerstats.0". +func (p LeafPath) HasPrefix(prefix string) bool { + if string(p) == prefix { + return true + } + return strings.HasPrefix(string(p), prefix+".") +} + +// Substitute replaces all {name} placeholders in the path using the +// supplied scope map. Returns an error if the template contains a +// placeholder that is not in the map, or if the resulting path is +// not a valid wire-level LeafPath. +// +// Example : +// +// LeafPath("{player}.score").Substitute(map[string]string{"player": "players.0"}) +// // → "players.0.score" +func (p LeafPath) Substitute(scope map[string]string) (LeafPath, error) { + src := string(p) + if !strings.ContainsRune(src, '{') { + // Fast path : no placeholders. + out := LeafPath(src) + if err := out.Validate(); err != nil { + return "", err + } + return out, nil + } + var b strings.Builder + b.Grow(len(src)) + for i := 0; i < len(src); { + if src[i] != '{' { + b.WriteByte(src[i]) + i++ + continue + } + end := strings.IndexByte(src[i+1:], '}') + if end < 0 { + return "", fmt.Errorf("leaf path: unterminated scope placeholder at %d", i) + } + name := src[i+1 : i+1+end] + v, ok := scope[name] + if !ok { + return "", fmt.Errorf("leaf path: unknown scope %q", name) + } + b.WriteString(v) + i += end + 2 + } + out := LeafPath(b.String()) + if err := out.Validate(); err != nil { + return "", err + } + return out, nil +} + +var reservedNamespaces = []string{"__inputs", "__system", "__test", "__schema"} + +// validatePath is the shared implementation. allowTemplate=true keeps +// {name} placeholders intact for the LSML editor-side validation. +func validatePath(s string, allowTemplate bool) error { + if s == "" { + return fmt.Errorf("leaf path: empty") + } + segments := strings.Split(s, ".") + for i, seg := range segments { + if seg == "" { + return fmt.Errorf("leaf path: empty segment at %d", i) + } + if allowTemplate && strings.HasPrefix(seg, "{") && strings.HasSuffix(seg, "}") { + inner := seg[1 : len(seg)-1] + if inner == "" { + return fmt.Errorf("leaf path: empty scope at %d", i) + } + if !isIdentifier(inner) { + return fmt.Errorf("leaf path: invalid scope %q", inner) + } + continue + } + if !validSegment(seg) { + return fmt.Errorf("leaf path: invalid segment %q at %d", seg, i) + } + } + return nil +} + +// validSegment accepts letters, digits, underscores. The first char +// may be a digit (numeric indices like "players.0"). +func validSegment(seg string) bool { + for i, r := range seg { + switch { + case unicode.IsLetter(r), r == '_': + // always allowed + case unicode.IsDigit(r): + if i == 0 { + continue + } + default: + return false + } + } + return true +} + +// isIdentifier is stricter : letters, digits, underscores, MUST start +// with a letter or underscore. Used for scope names. +func isIdentifier(s string) bool { + if s == "" { + return false + } + for i, r := range s { + switch { + case unicode.IsLetter(r), r == '_': + case unicode.IsDigit(r) && i > 0: + default: + return false + } + } + return true +} diff --git a/third_party/lumencast-go/protocol/overlay_apps_test.go b/third_party/lumencast-go/protocol/overlay_apps_test.go new file mode 100644 index 00000000..037b5117 --- /dev/null +++ b/third_party/lumencast-go/protocol/overlay_apps_test.go @@ -0,0 +1,88 @@ +package protocol + +import ( + "testing" +) + +func bp(b bool) *bool { return &b } + +// TestEncodeOverlayApps pins the on-wire shape of the overlay_apps frame: +// { v, type, apps{}, ts? }, no seq. Optional dimensions are omitted when nil. +func TestEncodeOverlayApps(t *testing.T) { + tests := []struct { + name string + in any + want string + }{ + { + name: "single dimension omitted when nil", + in: OverlayApps{ + Apps: map[string]OverlayAppState{ + "cam": {Running: bp(true)}, + }, + }, + want: `{"v":1,"type":"overlay_apps","apps":{"cam":{"running":true}}}`, + }, + { + name: "both dimensions", + in: OverlayApps{ + Apps: map[string]OverlayAppState{ + "cam": {Running: bp(false), OnAir: bp(true)}, + }, + }, + want: `{"v":1,"type":"overlay_apps","apps":{"cam":{"running":false,"on_air":true}}}`, + }, + { + // apps is required and MUST encode as {} — never null. + name: "empty apps render as object", + in: OverlayApps{}, + want: `{"v":1,"type":"overlay_apps","apps":{}}`, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, err := Encode(tc.in) + if err != nil { + t.Fatalf("encode: %v", err) + } + if string(got) != tc.want { + t.Fatalf("encode mismatch\n got: %s\nwant: %s", got, tc.want) + } + }) + } +} + +// TestOverlayAppsRoundTrip proves a server-emitted overlay_apps decodes back to +// the same typed frame (the parity check a runtime relies on), preserving the +// "dimension absent" (nil) vs "set to false" distinction. +func TestOverlayAppsRoundTrip(t *testing.T) { + orig := OverlayApps{ + Apps: map[string]OverlayAppState{ + "cam": {Running: bp(true), OnAir: bp(false)}, + "lt": {Running: bp(true)}, // on_air absent + }, + } + raw, err := Encode(orig) + if err != nil { + t.Fatalf("encode: %v", err) + } + decoded, err := DecodeServer(raw) + if err != nil { + t.Fatalf("decode: %v", err) + } + got, ok := decoded.(*OverlayApps) + if !ok { + t.Fatalf("decoded type = %T, want *OverlayApps", decoded) + } + if got.Type != TypeOverlayApps || got.V != Version { + t.Fatalf("envelope wrong: v=%d type=%q", got.V, got.Type) + } + cam := got.Apps["cam"] + if cam.Running == nil || !*cam.Running || cam.OnAir == nil || *cam.OnAir { + t.Fatalf("cam round-trip wrong: %+v", cam) + } + lt := got.Apps["lt"] + if lt.Running == nil || !*lt.Running || lt.OnAir != nil { + t.Fatalf("lt on_air must stay absent (nil): %+v", lt) + } +} diff --git a/third_party/lumencast-go/protocol/protocol_test.go b/third_party/lumencast-go/protocol/protocol_test.go new file mode 100644 index 00000000..1fd2307c --- /dev/null +++ b/third_party/lumencast-go/protocol/protocol_test.go @@ -0,0 +1,728 @@ +package protocol + +import ( + "bytes" + "encoding/json" + "errors" + "strings" + "testing" +) + +func TestEncodeServerFrames(t *testing.T) { + tests := []struct { + name string + in any + want string + }{ + { + name: "snapshot", + in: Snapshot{ + Seq: 1, + SceneID: "main-stage", + SceneVersion: "sha256:abc", + State: map[string]json.RawMessage{ + "show.title": json.RawMessage(`"Hello"`), + }, + }, + want: `{"v":1,"type":"snapshot","seq":1,"scene_id":"main-stage","scene_version":"sha256:abc","state":{"show.title":"Hello"}}`, + }, + { + name: "delta", + in: Delta{ + Seq: 42, + Patches: []Patch{ + {Path: "players.0.score", Value: json.RawMessage(`7`)}, + }, + }, + want: `{"v":1,"type":"delta","seq":42,"patches":[{"path":"players.0.score","value":7}]}`, + }, + { + name: "scene_changed", + in: SceneChanged{ + Seq: 100, + SceneID: "intermission", + SceneVersion: "sha256:def", + }, + want: `{"v":1,"type":"scene_changed","seq":100,"scene_id":"intermission","scene_version":"sha256:def"}`, + }, + { + name: "error", + in: Error{ + Seq: 50, + Code: string(CodeWriteForbidden), + Message: "viewer cannot send input", + Recoverable: false, + }, + want: `{"v":1,"type":"error","seq":50,"code":"WRITE_FORBIDDEN","message":"viewer cannot send input","recoverable":false}`, + }, + { + name: "pong", + in: Pong{}, + want: `{"v":1,"type":"pong"}`, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, err := Encode(tc.in) + if err != nil { + t.Fatalf("encode: %v", err) + } + if string(got) != tc.want { + t.Fatalf("\nwant: %s\n got: %s", tc.want, got) + } + }) + } +} + +func TestEncodeStampsEnvelope(t *testing.T) { + // Caller leaves V/Type zero — Encode MUST stamp them. + raw, err := Encode(Delta{Seq: 1, Patches: []Patch{{Path: "x", Value: json.RawMessage(`1`)}}}) + if err != nil { + t.Fatal(err) + } + var env envelope + if err := json.Unmarshal(raw, &env); err != nil { + t.Fatal(err) + } + if env.V != Version || env.Type != TypeDelta { + t.Fatalf("envelope not stamped: %+v", env) + } +} + +func TestDecodeClientFrames(t *testing.T) { + tests := []struct { + name string + raw string + want any + }{ + { + name: "subscribe live", + raw: `{"v":1,"type":"subscribe","token":"tok"}`, + want: &Subscribe{V: 1, Type: TypeSubscribe, Token: "tok"}, + }, + { + name: "subscribe test", + raw: `{"v":1,"type":"subscribe","token":"tok","scene":"s","session":"sess"}`, + want: &Subscribe{V: 1, Type: TypeSubscribe, Token: "tok", Scene: "s", Session: "sess"}, + }, + { + name: "input", + raw: `{"v":1,"type":"input","patches":[{"path":"__inputs.title","value":"hi"}]}`, + want: &Input{V: 1, Type: TypeInput, Patches: []Patch{{Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}}}, + }, + { + name: "ping", + raw: `{"v":1,"type":"ping"}`, + want: &Ping{V: 1, Type: TypePing}, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, err := Decode([]byte(tc.raw)) + if err != nil { + t.Fatalf("decode: %v", err) + } + gotJSON, _ := json.Marshal(got) + wantJSON, _ := json.Marshal(tc.want) + if !bytes.Equal(gotJSON, wantJSON) { + t.Fatalf("\nwant: %s\n got: %s", wantJSON, gotJSON) + } + }) + } +} + +func TestDecodeRejectsBadVersion(t *testing.T) { + _, err := Decode([]byte(`{"v":2,"type":"subscribe","token":"x"}`)) + if !errors.Is(err, ErrVersionMismatch) { + t.Fatalf("want ErrVersionMismatch, got %v", err) + } +} + +func TestDecodeRejectsUnknownType(t *testing.T) { + _, err := Decode([]byte(`{"v":1,"type":"banana"}`)) + if !errors.Is(err, ErrUnknownType) { + t.Fatalf("want ErrUnknownType, got %v", err) + } +} + +func TestDecodeServerFrames(t *testing.T) { + raw := `{"v":1,"type":"snapshot","seq":1,"scene_id":"x","scene_version":"sha256:y","state":{}}` + msg, err := DecodeServer([]byte(raw)) + if err != nil { + t.Fatal(err) + } + snap, ok := msg.(*Snapshot) + if !ok { + t.Fatalf("got %T, want *Snapshot", msg) + } + if snap.SceneID != "x" || snap.Seq != 1 { + t.Fatalf("unexpected: %+v", snap) + } +} + +func TestRoundTripPreservesRawValues(t *testing.T) { + // Ensures we don't lose fidelity on null vs missing, integer vs + // float, etc. + original := `{"v":1,"type":"delta","seq":2,"patches":[{"path":"a","value":null},{"path":"b","value":3.14},{"path":"c","value":[1,2,3]}]}` + msg, err := DecodeServer([]byte(original)) + if err != nil { + t.Fatal(err) + } + d := msg.(*Delta) + out, err := Encode(d) + if err != nil { + t.Fatal(err) + } + if string(out) != original { + t.Fatalf("\nwant: %s\n got: %s", original, out) + } +} + +func TestEncodeNoHTMLEscape(t *testing.T) { + // Paths with `<`, `>`, `&` MUST survive on the wire. + d := Delta{Seq: 1, Patches: []Patch{{Path: "a&c", Value: json.RawMessage(`"x"`)}}} + out, err := Encode(d) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(out), "a&c") { + t.Fatalf("HTML chars escaped: %s", out) + } +} + +func TestSequenceTracker_ServerEmit(t *testing.T) { + s := NewSequenceTracker() + if got := s.NextServer(); got != 1 { + t.Fatalf("first NextServer = %d, want 1", got) + } + if got := s.NextServer(); got != 2 { + t.Fatalf("second NextServer = %d, want 2", got) + } + s.Reset() + if got := s.NextServer(); got != 1 { + t.Fatalf("after reset NextServer = %d, want 1", got) + } +} + +func TestSequenceTracker_ObserveServer(t *testing.T) { + s := NewSequenceTracker() + + // First frame must be seq=1. + if skip, err := s.ObserveServer(1); err != nil || skip { + t.Fatalf("seq=1 first: skip=%v err=%v", skip, err) + } + // Contiguous. + if skip, err := s.ObserveServer(2); err != nil || skip { + t.Fatalf("seq=2: skip=%v err=%v", skip, err) + } + // Replay. + if skip, err := s.ObserveServer(2); err != nil || !skip { + t.Fatalf("replay seq=2: skip=%v err=%v", skip, err) + } + // Gap. + if _, err := s.ObserveServer(5); !errors.Is(err, ErrGap) { + t.Fatalf("seq=5: want ErrGap, got %v", err) + } +} + +func TestSequenceTracker_AcceptsAnyPositiveStart(t *testing.T) { + // LSDP/1.1 §18.1.1 — fresh tracker accepts any positive seq as + // the baseline (per-scene seq, late-joining subscribers may see + // snapshot at seq > 1). Only seq=0 is rejected. + s := NewSequenceTracker() + if skip, err := s.ObserveServer(42); err != nil || skip { + t.Fatalf("first frame at 42: want OK, got skip=%v err=%v", skip, err) + } + if skip, err := s.ObserveServer(43); err != nil || skip { + t.Fatalf("subsequent +1: want OK, got skip=%v err=%v", skip, err) + } + // seq=0 is still invalid. + s2 := NewSequenceTracker() + if _, err := s2.ObserveServer(0); !errors.Is(err, ErrInvalidSeqStart) { + t.Fatalf("seq=0: want ErrInvalidSeqStart, got %v", err) + } +} + +func TestSequenceTracker_SceneChangedReset(t *testing.T) { + // After SceneChanged, the runtime calls ObserveSnapshot to rebase + // to the new scene's snapshot seq (typically 1, but per §18.1.1 + // it can be any positive value). + s := NewSequenceTracker() + _, _ = s.ObserveServer(1) + _, _ = s.ObserveServer(2) + _, _ = s.ObserveServer(3) + if err := s.ObserveSnapshot(1); err != nil { + t.Fatalf("rebase to 1: %v", err) + } + // Subsequent deltas continue from there. + if skip, err := s.ObserveServer(2); err != nil || skip { + t.Fatalf("seq=2 after rebase: skip=%v err=%v", skip, err) + } +} + +func TestLeafPath_Validate(t *testing.T) { + good := []string{ + "a", + "a.b.c", + "players.0.name", + "__inputs.title", + "__inputs.platform.twitch.last_chat", + } + for _, p := range good { + if err := LeafPath(p).Validate(); err != nil { + t.Errorf("%q: unexpected error %v", p, err) + } + } + bad := []string{ + "", + ".a", + "a.", + "a..b", + "a-b", + "a.b c", + "{x}.y", // template form rejected by Validate + } + for _, p := range bad { + if err := LeafPath(p).Validate(); err == nil { + t.Errorf("%q: expected error", p) + } + } +} + +func TestLeafPath_ValidateTemplate(t *testing.T) { + if err := LeafPath("{player}.score").ValidateTemplate(); err != nil { + t.Fatalf("template: %v", err) + } + if err := LeafPath("{}").ValidateTemplate(); err == nil { + t.Fatal("empty scope should fail") + } + if err := LeafPath("{x-y}").ValidateTemplate(); err == nil { + t.Fatal("invalid scope should fail") + } +} + +func TestLeafPath_Substitute(t *testing.T) { + got, err := LeafPath("{player}.score").Substitute(map[string]string{"player": "players.0"}) + if err != nil { + t.Fatal(err) + } + if got != "players.0.score" { + t.Fatalf("got %q", got) + } + + if _, err := LeafPath("{missing}.x").Substitute(map[string]string{}); err == nil { + t.Fatal("missing scope should fail") + } + if _, err := LeafPath("{a.score").Substitute(map[string]string{}); err == nil { + t.Fatal("unterminated should fail") + } +} + +func TestLeafPath_IsReserved(t *testing.T) { + cases := map[string]bool{ + "__inputs": true, + "__inputs.title": true, + "__system.adapter.x": true, + "__test.input": true, + "__schema.x": true, + "foo": false, + "_partial": false, + "__custom": false, // not in the reserved set + } + for p, want := range cases { + if got := LeafPath(p).IsReserved(); got != want { + t.Errorf("%q: got %v want %v", p, got, want) + } + } +} + +func TestLeafPath_HasPrefix(t *testing.T) { + p := LeafPath("players.0.score") + if !p.HasPrefix("players") { + t.Fail() + } + if !p.HasPrefix("players.0") { + t.Fail() + } + if p.HasPrefix("playerstats") { + t.Fail() + } +} + +func TestErrorCode_Recoverable(t *testing.T) { + cases := map[ErrorCode]bool{ + CodeWriteForbidden: true, + CodeBundleFetchFailed: true, + CodeVersionGap: true, + CodeUnknownPath: true, + CodeInvalidValue: true, + CodeRateLimit: true, + CodeAuthDenied: false, + CodeSceneNotFound: false, + CodeBundleIncompatible: false, + CodeVersionMismatch: false, + CodeTestSessionExpired: false, + } + for code, want := range cases { + if got := code.Recoverable(false); got != want { + t.Errorf("%s: got %v want %v", code, got, want) + } + } + // CodeInternal honours the supplied default. + if !CodeInternal.Recoverable(true) { + t.Fatal("internal recoverable=true not honoured") + } + if CodeInternal.Recoverable(false) { + t.Fatal("internal recoverable=false not honoured") + } +} + +func TestRole_Validity(t *testing.T) { + if !RoleOperator.IsValid() || !RoleViewer.IsValid() || + !RoleService.IsValid() || !RoleTest.IsValid() { + t.Fatal("known roles must be valid") + } + if Role("admin").IsValid() { + t.Fatal("unknown role must not be valid") + } +} + +// ────────────────────────────────────────────────────────────────────── +// LSDP/1.1 — additive frame surface. +// ────────────────────────────────────────────────────────────────────── + +func TestSubProtocolNegotiation(t *testing.T) { + if SubProtocol != "lsdp.v1" { + t.Fatalf("1.0 subprotocol drift: %s", SubProtocol) + } + if SubProtocolV1_1 != "lsdp.v1.1" { + t.Fatalf("1.1 subprotocol drift: %s", SubProtocolV1_1) + } + if len(SubProtocols) != 2 || SubProtocols[0] != SubProtocolV1_1 || SubProtocols[1] != SubProtocol { + t.Fatalf("preference order broken: %v", SubProtocols) + } +} + +func TestSubscribeWithSinceSequence_RoundTrip(t *testing.T) { + in := Subscribe{Token: "t", SinceSequence: 12345} + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + want := `{"v":1,"type":"subscribe","token":"t","since_sequence":12345}` + if string(raw) != want { + t.Fatalf("\nwant: %s\n got: %s", want, raw) + } + msg, err := Decode(raw) + if err != nil { + t.Fatal(err) + } + got, ok := msg.(*Subscribe) + if !ok { + t.Fatalf("decoded type %T", msg) + } + if got.SinceSequence != 12345 { + t.Fatalf("since_sequence not round-tripped: %d", got.SinceSequence) + } +} + +func TestSubscribeWithoutSinceSequence_OmitsField(t *testing.T) { + // 1.0-compatible : zero SinceSequence MUST omit on the wire. + raw, err := Encode(Subscribe{Token: "t"}) + if err != nil { + t.Fatal(err) + } + if strings.Contains(string(raw), "since_sequence") { + t.Fatalf("zero since_sequence leaked: %s", raw) + } +} + +func TestInputWithClientMsgID_RoundTrip(t *testing.T) { + in := Input{ + Patches: []Patch{{Path: "x", Value: json.RawMessage(`1`)}}, + ClientMsgID: "ui-9f3a", + } + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + want := `{"v":1,"type":"input","patches":[{"path":"x","value":1}],"client_msg_id":"ui-9f3a"}` + if string(raw) != want { + t.Fatalf("\nwant: %s\n got: %s", want, raw) + } + msg, err := Decode(raw) + if err != nil { + t.Fatal(err) + } + got := msg.(*Input) + if got.ClientMsgID != "ui-9f3a" { + t.Fatalf("client_msg_id not round-tripped: %q", got.ClientMsgID) + } +} + +func TestPingPongNonce_RoundTrip(t *testing.T) { + rawPing, _ := Encode(Ping{Nonce: "probe-7a2c"}) + if !strings.Contains(string(rawPing), `"nonce":"probe-7a2c"`) { + t.Fatalf("ping nonce missing on wire: %s", rawPing) + } + msg, err := Decode(rawPing) + if err != nil { + t.Fatal(err) + } + if got := msg.(*Ping).Nonce; got != "probe-7a2c" { + t.Fatalf("ping nonce not round-tripped: %q", got) + } + + rawPong, _ := Encode(Pong{Nonce: "probe-7a2c"}) + if !strings.Contains(string(rawPong), `"nonce":"probe-7a2c"`) { + t.Fatalf("pong nonce missing on wire: %s", rawPong) + } + msg, err = DecodeServer(rawPong) + if err != nil { + t.Fatal(err) + } + if got := msg.(*Pong).Nonce; got != "probe-7a2c" { + t.Fatalf("pong nonce not round-tripped: %q", got) + } + + // 1.0-compat : empty nonce omitted from wire. + rawBare, _ := Encode(Pong{}) + if string(rawBare) != `{"v":1,"type":"pong"}` { + t.Fatalf("bare pong leaked nonce: %s", rawBare) + } +} + +func TestUnsubscribe_RoundTrip(t *testing.T) { + raw, err := Encode(Unsubscribe{}) + if err != nil { + t.Fatal(err) + } + want := `{"v":1,"type":"unsubscribe"}` + if string(raw) != want { + t.Fatalf("\nwant: %s\n got: %s", want, raw) + } + msg, err := Decode(raw) + if err != nil { + t.Fatal(err) + } + if _, ok := msg.(*Unsubscribe); !ok { + t.Fatalf("decoded type %T (want *Unsubscribe)", msg) + } +} + +func TestDeltaWithCauseAndTransition_RoundTrip(t *testing.T) { + in := Delta{ + Seq: 7, + Patches: []Patch{ + { + Path: "score", + Value: json.RawMessage(`42`), + Transition: &TransitionSpec{ + Kind: "tween", + DurationMs: 500, + Easing: "ease-out", + }, + }, + }, + Cause: &Cause{Source: "operator:alice", InputID: "ui-9f3a"}, + } + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(raw), `"transition":{"kind":"tween"`) { + t.Fatalf("transition not encoded: %s", raw) + } + if !strings.Contains(string(raw), `"cause":{"source":"operator:alice"`) { + t.Fatalf("cause not encoded: %s", raw) + } + msg, err := DecodeServer(raw) + if err != nil { + t.Fatal(err) + } + got := msg.(*Delta) + if got.Cause == nil || got.Cause.InputID != "ui-9f3a" { + t.Fatalf("cause.input_id not round-tripped: %+v", got.Cause) + } + if got.Patches[0].Transition == nil || got.Patches[0].Transition.Kind != "tween" { + t.Fatalf("transition not round-tripped: %+v", got.Patches[0].Transition) + } +} + +func TestDeltaWithProjectionMetadata_RoundTrip(t *testing.T) { + in := Delta{ + Seq: 7, + Patches: []Patch{ + { + Path: "score", + Value: json.RawMessage(`42`), + }, + }, + Cause: &Cause{Source: "operator:alice", InputID: "ui-9f3a"}, + SchemaVersion: "schema-v1", + SceneDigest: "scene-abc", + RuntimeInstanceID: "rt-123", + Target: "preview", + RenderRevision: "rev-456", + CorrelationID: "corr-789", + } + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(raw), `"schema_version":"schema-v1"`) { + t.Fatalf("schema_version not encoded: %s", raw) + } + msg, err := DecodeServer(raw) + if err != nil { + t.Fatal(err) + } + got := msg.(*Delta) + if got.SchemaVersion != "schema-v1" || got.SceneDigest != "scene-abc" || got.RuntimeInstanceID != "rt-123" || got.Target != "preview" || got.RenderRevision != "rev-456" || got.CorrelationID != "corr-789" { + t.Fatalf("projection metadata not round-tripped: %+v", got) + } +} + +func TestSnapshotWithProjectionMetadata_RoundTrip(t *testing.T) { + in := Snapshot{ + Seq: 3, + SceneID: "main-stage", + SceneVersion: "sha256:abc", + State: map[string]json.RawMessage{ + "show.title": json.RawMessage(`"Hello"`), + }, + SchemaVersion: "schema-v1", + SceneDigest: "scene-abc", + RuntimeInstanceID: "rt-123", + Target: "preview", + RenderRevision: "rev-456", + CorrelationID: "corr-789", + } + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(raw), `"schema_version":"schema-v1"`) { + t.Fatalf("schema_version not encoded: %s", raw) + } + msg, err := DecodeServer(raw) + if err != nil { + t.Fatal(err) + } + got := msg.(*Snapshot) + if got.SchemaVersion != "schema-v1" || got.SceneDigest != "scene-abc" || got.RuntimeInstanceID != "rt-123" || got.Target != "preview" || got.RenderRevision != "rev-456" || got.CorrelationID != "corr-789" { + t.Fatalf("projection metadata not round-tripped: %+v", got) + } +} + +func TestSnapshotWithoutProjectionMetadata_OmitsFields(t *testing.T) { + in := Snapshot{ + Seq: 1, + SceneID: "main-stage", + SceneVersion: "sha256:abc", + State: map[string]json.RawMessage{}, + } + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + if strings.Contains(string(raw), "schema_version") || strings.Contains(string(raw), "scene_digest") || strings.Contains(string(raw), "correlation_id") { + t.Fatalf("unset projection metadata must be omitted, not fabricated: %s", raw) + } +} + +func TestSceneChangedWithTransition_RoundTrip(t *testing.T) { + in := SceneChanged{ + Seq: 100, + SceneID: "scene-b", + SceneVersion: "sha256:b0", + FromSceneID: "scene-a", + Transition: &SceneTransition{Kind: "crossfade", DurationMs: 600}, + } + raw, err := Encode(in) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(raw), `"from_scene_id":"scene-a"`) { + t.Fatalf("from_scene_id missing: %s", raw) + } + if !strings.Contains(string(raw), `"transition":{"kind":"crossfade","duration_ms":600}`) { + t.Fatalf("transition missing or wrong: %s", raw) + } + msg, err := DecodeServer(raw) + if err != nil { + t.Fatal(err) + } + got := msg.(*SceneChanged) + if got.FromSceneID != "scene-a" { + t.Fatalf("from_scene_id not round-tripped: %q", got.FromSceneID) + } + if got.Transition == nil || got.Transition.Kind != "crossfade" || got.Transition.DurationMs != 600 { + t.Fatalf("transition not round-tripped: %+v", got.Transition) + } +} + +func TestBackwardCompat_1_0_BundlesStillEncode(t *testing.T) { + // A pure-1.0 caller (no 1.1 fields populated) MUST produce the + // exact same bytes as before. Regression check. + in := Subscribe{Token: "t"} + raw, _ := Encode(in) + want := `{"v":1,"type":"subscribe","token":"t"}` + if string(raw) != want { + t.Fatalf("1.0 subscribe shape changed:\nwant: %s\n got: %s", want, raw) + } + + in2 := Delta{Seq: 1, Patches: []Patch{{Path: "x", Value: json.RawMessage(`1`)}}} + raw, _ = Encode(in2) + want = `{"v":1,"type":"delta","seq":1,"patches":[{"path":"x","value":1}]}` + if string(raw) != want { + t.Fatalf("1.0 delta shape changed:\nwant: %s\n got: %s", want, raw) + } +} + +func TestForwardCompat_1_0Server_Ignores_1_1_Fields(t *testing.T) { + // A 1.0 client receiving a 1.1 frame with optional fields SHOULD + // decode it cleanly (the additional fields are tolerated by Go's + // stdlib JSON decoder by default — they go into nil pointers). + raw := []byte(`{"v":1,"type":"delta","seq":1,"patches":[{"path":"x","value":1}],"cause":{"source":"adapter:http_poll"},"schema_version":"schema-v1","scene_digest":"scene-abc","runtime_instance_id":"rt-123","target":"preview","render_revision":"rev-456","correlation_id":"corr-789"}`) + msg, err := DecodeServer(raw) + if err != nil { + t.Fatal(err) + } + got := msg.(*Delta) + if got.Seq != 1 || len(got.Patches) != 1 { + t.Fatal("1.0-only fields lost") + } + if got.Cause == nil || got.Cause.Source != "adapter:http_poll" { + t.Fatalf("optional cause not decoded: %+v", got.Cause) + } +} + +// Bundle-shape preservation : ensure the bytes JSON consumers see for +// 1.0 frames have not drifted because we added omitempty fields to +// every struct. +func TestNoUnintendedFieldLeak(t *testing.T) { + cases := []struct { + in any + want string + }{ + {Snapshot{Seq: 1, SceneID: "s", SceneVersion: "sha256:0", State: map[string]json.RawMessage{}}, + `{"v":1,"type":"snapshot","seq":1,"scene_id":"s","scene_version":"sha256:0","state":{}}`}, + {Pong{}, `{"v":1,"type":"pong"}`}, + {Ping{}, `{"v":1,"type":"ping"}`}, + {Subscribe{Token: "t"}, `{"v":1,"type":"subscribe","token":"t"}`}, + {Input{Patches: []Patch{{Path: "x", Value: json.RawMessage(`1`)}}}, + `{"v":1,"type":"input","patches":[{"path":"x","value":1}]}`}, + {SceneChanged{Seq: 1, SceneID: "s", SceneVersion: "sha256:0"}, + `{"v":1,"type":"scene_changed","seq":1,"scene_id":"s","scene_version":"sha256:0"}`}, + } + for _, tc := range cases { + raw, err := Encode(tc.in) + if err != nil { + t.Fatal(err) + } + if string(raw) != tc.want { + t.Errorf("\nwant: %s\n got: %s", tc.want, raw) + } + } +} diff --git a/third_party/lumencast-go/protocol/roster_test.go b/third_party/lumencast-go/protocol/roster_test.go new file mode 100644 index 00000000..fd0bb18a --- /dev/null +++ b/third_party/lumencast-go/protocol/roster_test.go @@ -0,0 +1,85 @@ +package protocol + +import ( + "testing" +) + +// TestEncodeSceneRoster pins the on-wire shape of the scene_roster +// frame against the contract mirrored by @lumencast/protocol +// (Lumencast/lumencast-js#88) : { v, type, entries[], ts? }, no seq. +func TestEncodeSceneRoster(t *testing.T) { + tests := []struct { + name string + in any + want string + }{ + { + name: "populated", + in: SceneRoster{ + Entries: []RosterEntry{ + {SceneID: "main-stage", SceneVersion: "sha256:abc"}, + {SceneID: "intermission", SceneVersion: "sha256:def"}, + }, + }, + want: `{"v":1,"type":"scene_roster","entries":[{"scene_id":"main-stage","scene_version":"sha256:abc"},{"scene_id":"intermission","scene_version":"sha256:def"}]}`, + }, + { + // entries is required and MUST encode as [] — never null. + name: "empty entries render as array", + in: SceneRoster{}, + want: `{"v":1,"type":"scene_roster","entries":[]}`, + }, + { + name: "with ts", + in: SceneRoster{ + Entries: []RosterEntry{{SceneID: "s", SceneVersion: "sha256:0"}}, + TS: "2026-07-02T10:00:00Z", + }, + want: `{"v":1,"type":"scene_roster","entries":[{"scene_id":"s","scene_version":"sha256:0"}],"ts":"2026-07-02T10:00:00Z"}`, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, err := Encode(tc.in) + if err != nil { + t.Fatalf("encode: %v", err) + } + if string(got) != tc.want { + t.Fatalf("encode mismatch\n got: %s\nwant: %s", got, tc.want) + } + }) + } +} + +// TestSceneRosterRoundTrip proves a server-emitted roster decodes back +// to the same typed frame — the parity check a runtime relies on. +func TestSceneRosterRoundTrip(t *testing.T) { + orig := SceneRoster{ + Entries: []RosterEntry{ + {SceneID: "main-stage", SceneVersion: "sha256:abc"}, + }, + TS: "2026-07-02T10:00:00Z", + } + raw, err := Encode(orig) + if err != nil { + t.Fatalf("encode: %v", err) + } + msg, err := DecodeServer(raw) + if err != nil { + t.Fatalf("decode: %v", err) + } + got, ok := msg.(*SceneRoster) + if !ok { + t.Fatalf("decoded %T, want *SceneRoster", msg) + } + if got.V != Version || got.Type != TypeSceneRoster { + t.Fatalf("envelope not stamped: v=%d type=%q", got.V, got.Type) + } + if len(got.Entries) != 1 || got.Entries[0].SceneID != "main-stage" || + got.Entries[0].SceneVersion != "sha256:abc" { + t.Fatalf("entries round-trip mismatch: %+v", got.Entries) + } + if got.TS != orig.TS { + t.Fatalf("ts round-trip mismatch: %q", got.TS) + } +} diff --git a/third_party/lumencast-go/protocol/sequence.go b/third_party/lumencast-go/protocol/sequence.go new file mode 100644 index 00000000..b9200214 --- /dev/null +++ b/third_party/lumencast-go/protocol/sequence.go @@ -0,0 +1,111 @@ +package protocol + +import ( + "errors" + "sync" +) + +// SequenceTracker is a goroutine-safe counter that implements the +// LSDP/1.x sequencing rules : +// +// - The first frame of a subscription establishes the baseline. Under +// 1.0 it was always seq = 1 ; under 1.1 (per spec §18.1.1) it can +// be any value because seq is per-scene, not per-subscription. +// - Each subsequent Delta / SceneChanged / Error increments by 1. +// - A snapshot frame received mid-stream resets the baseline (used +// after SceneChanged or back-pressure recovery). +// +// On the receiver side, ObserveServer detects gaps (seq > last + 1) +// and returns ErrGap so the caller can close + reconnect with a +// VERSION_GAP reason. seq <= last is silently dropped (replay). +type SequenceTracker struct { + mu sync.Mutex + cur uint64 +} + +// ErrGap signals a missing sequence number on the server-to-client +// stream. The receiver MUST close the WebSocket and reconnect ; a +// fresh Snapshot will reset state. +var ErrGap = errors.New("protocol: sequence gap") + +// ErrInvalidSeqStart is returned by ObserveServer if the first frame +// of a subscription carries seq == 0. (Under 1.0 the constraint was +// stricter — first frame must be seq == 1 ; relaxed in 1.1 to accept +// any positive value.) +var ErrInvalidSeqStart = errors.New("protocol: subscription must start at seq>=1") + +// NewSequenceTracker returns a tracker with cur = 0 (no frame seen). +func NewSequenceTracker() *SequenceTracker { + return &SequenceTracker{} +} + +// NextServer returns the next outgoing seq for a server emitting a +// frame on this subscription. Use Reset() when emitting the snapshot +// after a SceneChanged. +func (s *SequenceTracker) NextServer() uint64 { + s.mu.Lock() + defer s.mu.Unlock() + s.cur++ + return s.cur +} + +// Reset rewinds the counter so the next NextServer call returns 1. +// Call this immediately before emitting the Snapshot that follows a +// SceneChanged. +func (s *SequenceTracker) Reset() { + s.mu.Lock() + defer s.mu.Unlock() + s.cur = 0 +} + +// Current returns the last seq emitted (0 if none yet). +func (s *SequenceTracker) Current() uint64 { + s.mu.Lock() + defer s.mu.Unlock() + return s.cur +} + +// ObserveServer is the receiver-side check. Pass the seq from the +// most recently received server frame. Returns : +// +// - nil : seq is the expected next value, advance. +// - ErrGap : seq > last+1, caller MUST close and reconnect. +// - nil with skip=true : seq <= last, replay — caller MUST drop frame. +// +// The first call on a fresh tracker accepts any seq >= 1 as the +// baseline (see [SequenceTracker] doc — under 1.1, scene seq is global +// so late-joining subscribers may start at seq > 1). +func (s *SequenceTracker) ObserveServer(seq uint64) (skip bool, err error) { + s.mu.Lock() + defer s.mu.Unlock() + switch { + case s.cur == 0: + // Fresh tracker — any seq >= 1 establishes the baseline. + if seq < 1 { + return false, ErrInvalidSeqStart + } + s.cur = seq + return false, nil + case seq == s.cur+1: + s.cur = seq + return false, nil + case seq <= s.cur: + return true, nil // silent replay + default: + return false, ErrGap + } +} + +// ObserveSnapshot resets the tracker to the seq carried by a snapshot +// frame. Use this when receiving a snapshot after a SceneChanged or +// back-pressure recovery — the seq baseline jumps to the snapshot +// value regardless of previous state. +func (s *SequenceTracker) ObserveSnapshot(seq uint64) error { + s.mu.Lock() + defer s.mu.Unlock() + if seq < 1 { + return ErrInvalidSeqStart + } + s.cur = seq + return nil +} diff --git a/third_party/lumencast-go/protocol/types.go b/third_party/lumencast-go/protocol/types.go new file mode 100644 index 00000000..6caaecdc --- /dev/null +++ b/third_party/lumencast-go/protocol/types.go @@ -0,0 +1,45 @@ +package protocol + +// Role is the connection-level authority assigned by token validation. +// Roles are enforced by the server kit ; runtimes never assume a role +// — they just react to the frames they receive. +type Role string + +const ( + // RoleViewer receives snapshot/delta/scene_changed. Cannot send + // input frames. + RoleViewer Role = "viewer" + + // RoleOperator can send input frames in the __inputs.* namespace. + RoleOperator Role = "operator" + + // RoleService can send input frames in __inputs.*, optionally + // scoped further by a `paths` claim on the token. + RoleService Role = "service" + + // RoleTest is for test-mode subscriptions. Can write __test.* and + // (depending on server policy) __inputs.*. + RoleTest Role = "test" +) + +// IsValid reports whether r is one of the four LSDP/1 roles. +func (r Role) IsValid() bool { + switch r { + case RoleViewer, RoleOperator, RoleService, RoleTest: + return true + } + return false +} + +// CanWriteInputs reports whether the role is permitted to mutate the +// __inputs.* namespace. Servers MUST ALSO check the `paths` claim for +// service tokens — see server.Identity. +func (r Role) CanWriteInputs() bool { + return r == RoleOperator || r == RoleService +} + +// CanWriteTest reports whether the role is permitted to mutate the +// __test.* namespace. Only test sessions qualify. +func (r Role) CanWriteTest() bool { + return r == RoleTest +} diff --git a/third_party/lumencast-go/server/adapters/adapters_test.go b/third_party/lumencast-go/server/adapters/adapters_test.go new file mode 100644 index 00000000..e5dec7ee --- /dev/null +++ b/third_party/lumencast-go/server/adapters/adapters_test.go @@ -0,0 +1,123 @@ +package adapters_test + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/Lumencast/lumencast-go/protocol" + "github.com/Lumencast/lumencast-go/server" + "github.com/Lumencast/lumencast-go/server/adapters" +) + +func newScene(t *testing.T) *server.Scene { + t.Helper() + srv, err := server.New(server.Config{ + ListenAddr: "127.0.0.1:0", + Auth: server.NewStaticTokens(map[string]server.Identity{"x": {Subject: "x", Role: protocol.RoleViewer}}), + }) + if err != nil { + t.Fatal(err) + } + scene := srv.NewScene("s") + _ = scene.Set(map[string]any{"k": 0}) + return scene +} + +func TestHTTPPoll_DecodesAndEmits(t *testing.T) { + var calls atomic.Int32 + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"k": 7}`)) + calls.Add(1) + })) + defer srv.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 600*time.Millisecond) + defer cancel() + + sc := newScene(t) + go func() { + _ = adapters.HTTPPoll(ctx, sc, adapters.HTTPPollConfig{ + URL: srv.URL, + Interval: 50 * time.Millisecond, + Decode: adapters.JSONFlatDecode(""), + }) + }() + + // Wait for at least one poll to complete. + deadline := time.Now().Add(500 * time.Millisecond) + for time.Now().Before(deadline) && calls.Load() == 0 { + time.Sleep(20 * time.Millisecond) + } + if calls.Load() == 0 { + t.Fatal("HTTPPoll never called the upstream") + } +} + +func TestPgListen_DecodesAndEmits(t *testing.T) { + sc := newScene(t) + notifications := make(chan adapters.PgNotification, 4) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + done := make(chan struct{}) + go func() { + _ = adapters.PgListen(ctx, sc, notifications, + func(channel, payload string) (map[string]any, error) { + if channel != "score_updates" { + return nil, errors.New("unexpected channel") + } + var m map[string]any + if err := json.Unmarshal([]byte(payload), &m); err != nil { + return nil, err + } + return m, nil + }, + nil) + close(done) + }() + + notifications <- adapters.PgNotification{ + Channel: "score_updates", + Payload: `{"k": 42}`, + } + + // Allow the goroutine to drain. + time.Sleep(50 * time.Millisecond) + close(notifications) + <-done +} + +func TestPgListen_RequiresDecode(t *testing.T) { + sc := newScene(t) + notifications := make(chan adapters.PgNotification) + close(notifications) + if err := adapters.PgListen(context.Background(), sc, notifications, nil, nil); err == nil { + t.Fatal("expected error for nil decode") + } +} + +func TestPgxListen_RejectsBadConfig(t *testing.T) { + sc := newScene(t) + if err := adapters.PgxListen(context.Background(), sc, adapters.PgxListenConfig{}); err == nil { + t.Fatal("expected DSN required") + } + if err := adapters.PgxListen(context.Background(), sc, adapters.PgxListenConfig{ + DSN: "postgres://nowhere", Channels: nil, + }); err == nil || !strings.Contains(err.Error(), "Channels") { + t.Fatalf("expected Channels-required error, got %v", err) + } + if err := adapters.PgxListen(context.Background(), sc, adapters.PgxListenConfig{ + DSN: "postgres://nowhere", Channels: []string{"x"}, + }); err == nil || !strings.Contains(err.Error(), "Decode") { + t.Fatalf("expected Decode-required error, got %v", err) + } +} diff --git a/third_party/lumencast-go/server/adapters/http_poll.go b/third_party/lumencast-go/server/adapters/http_poll.go new file mode 100644 index 00000000..e74cc496 --- /dev/null +++ b/third_party/lumencast-go/server/adapters/http_poll.go @@ -0,0 +1,187 @@ +// Package adapters ships server-side adapters that pump external data +// into a Lumencast Scene. Adapters are user-driven goroutines : the +// kit hands them a Scene reference and they call Scene.Emit when new +// values arrive. +// +// Three reference adapters live here : +// +// - HTTPPoll — periodic GET against a JSON endpoint +// - WSSubscribe — WebSocket consumer that forwards JSON messages +// - PgNotify — Postgres LISTEN/NOTIFY consumer (interface-based, +// no pgx dependency) +// +// Each adapter is a stand-alone goroutine ; cancel via context. The +// kit is opinion-free about retries and error reporting beyond the +// minimal exponential backoff for transient transport failures. +package adapters + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/Lumencast/lumencast-go/server" +) + +// HTTPPollConfig parameterises an HTTPPoll adapter. URL and Decode +// are required. +type HTTPPollConfig struct { + // URL is the endpoint polled at every Interval. + URL string + + // Interval is the steady-state poll cadence. Defaults to 200 ms. + Interval time.Duration + + // Header optionally injects request headers on every poll + // (Authorization, etc.). + Header http.Header + + // Decode converts a successful response body to a patches map. + // Returning a non-nil error skips the emit for this iteration. + Decode func(body []byte) (map[string]any, error) + + // Client is the HTTP client. Defaults to http.DefaultClient with + // a 10 s timeout if nil. + Client *http.Client + + // MaxBackoff caps the exponential backoff applied to consecutive + // transport errors. Defaults to 30 s. + MaxBackoff time.Duration + + // OnError, if non-nil, is invoked on every transport / decode + // error. Use it to feed your observability stack ; the adapter + // keeps retrying regardless of what you return. + OnError func(error) +} + +// HTTPPoll polls cfg.URL at cfg.Interval, decodes each response via +// cfg.Decode, and emits the resulting patches on scene. +// +// The function returns when ctx is cancelled. Transient HTTP / decode +// errors trigger exponential backoff capped at cfg.MaxBackoff. +func HTTPPoll(ctx context.Context, scene *server.Scene, cfg HTTPPollConfig) error { + if cfg.URL == "" { + return fmt.Errorf("adapters: HTTPPollConfig.URL is required") + } + if cfg.Decode == nil { + return fmt.Errorf("adapters: HTTPPollConfig.Decode is required") + } + if cfg.Interval == 0 { + cfg.Interval = 200 * time.Millisecond + } + if cfg.MaxBackoff == 0 { + cfg.MaxBackoff = 30 * time.Second + } + client := cfg.Client + if client == nil { + client = &http.Client{Timeout: 10 * time.Second} + } + + var backoff time.Duration + for { + patches, err := pollOnce(ctx, client, cfg) + switch { + case err == nil: + backoff = 0 + if len(patches) > 0 { + if emitErr := scene.Emit(patches); emitErr != nil && cfg.OnError != nil { + cfg.OnError(fmt.Errorf("emit: %w", emitErr)) + } + } + default: + if cfg.OnError != nil { + cfg.OnError(err) + } + backoff = nextBackoff(backoff, cfg.MaxBackoff) + } + + wait := cfg.Interval + if backoff > wait { + wait = backoff + } + select { + case <-ctx.Done(): + return nil + case <-time.After(wait): + } + } +} + +// pollOnce performs a single HTTP request and returns the decoded +// patches. Returns (nil, nil) when the body decodes to an empty map. +func pollOnce(ctx context.Context, client *http.Client, cfg HTTPPollConfig) (map[string]any, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, cfg.URL, nil) + if err != nil { + return nil, fmt.Errorf("build request: %w", err) + } + for k, vs := range cfg.Header { + for _, v := range vs { + req.Header.Add(k, v) + } + } + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("http: %w", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("read body: %w", err) + } + if resp.StatusCode >= 400 { + return nil, fmt.Errorf("http %d: %s", resp.StatusCode, body) + } + patches, err := cfg.Decode(body) + if err != nil { + return nil, fmt.Errorf("decode: %w", err) + } + return patches, nil +} + +// JSONFlatDecode is a convenience cfg.Decode that flattens a JSON +// object's top-level keys into patches under writePrefix. Nested +// objects become dotted leaf paths ; arrays are passed verbatim +// (clients can use repeat() over them). +func JSONFlatDecode(writePrefix string) func([]byte) (map[string]any, error) { + return func(body []byte) (map[string]any, error) { + var v map[string]any + if err := json.Unmarshal(body, &v); err != nil { + return nil, err + } + out := make(map[string]any, len(v)) + flatten(writePrefix, v, out) + return out, nil + } +} + +func flatten(prefix string, src map[string]any, out map[string]any) { + for k, v := range src { + key := k + if prefix != "" { + key = prefix + "." + k + } + if sub, ok := v.(map[string]any); ok { + flatten(key, sub, out) + continue + } + out[key] = v + } +} + +// nextBackoff doubles the previous duration with a 250 ms floor and a +// caller-supplied cap. Pure function, easy to unit-test. +func nextBackoff(prev, max time.Duration) time.Duration { + const floor = 250 * time.Millisecond + if prev < floor { + return floor + } + next := prev * 2 + if next > max { + return max + } + return next +} diff --git a/third_party/lumencast-go/server/adapters/pg_listen.go b/third_party/lumencast-go/server/adapters/pg_listen.go new file mode 100644 index 00000000..e239ab26 --- /dev/null +++ b/third_party/lumencast-go/server/adapters/pg_listen.go @@ -0,0 +1,65 @@ +package adapters + +import ( + "context" + "fmt" + + "github.com/Lumencast/lumencast-go/server" +) + +// PgNotification is the minimal abstraction over a Postgres +// LISTEN/NOTIFY payload. It is library-agnostic so the kit does not +// depend on pgx (or any specific driver). Wire it up like : +// +// notifications := make(chan adapters.PgNotification, 32) +// go pumpFromPgxConn(notifications, conn) // your code +// adapters.PgListen(ctx, scene, notifications, decode) +// +// See examples/basic-scoreboard for a working pgx integration. +type PgNotification struct { + Channel string + Payload string +} + +// PgListenDecode converts a raw LISTEN/NOTIFY payload into a patches +// map. The kit ships no opinionated default ; the caller chooses +// JSON, line-delimited fields, or any other shape. +type PgListenDecode func(channel, payload string) (map[string]any, error) + +// PgListen consumes notifications from the supplied channel and emits +// the resulting patches on scene. Returns when ctx is cancelled or +// the notifications channel is closed. +func PgListen( + ctx context.Context, + scene *server.Scene, + notifications <-chan PgNotification, + decode PgListenDecode, + onError func(error), +) error { + if decode == nil { + return fmt.Errorf("adapters: PgListen decode is required") + } + for { + select { + case <-ctx.Done(): + return nil + case n, ok := <-notifications: + if !ok { + return nil + } + patches, err := decode(n.Channel, n.Payload) + if err != nil { + if onError != nil { + onError(fmt.Errorf("decode %s: %w", n.Channel, err)) + } + continue + } + if len(patches) == 0 { + continue + } + if err := scene.Emit(patches); err != nil && onError != nil { + onError(fmt.Errorf("emit: %w", err)) + } + } + } +} diff --git a/third_party/lumencast-go/server/adapters/pgx_listen.go b/third_party/lumencast-go/server/adapters/pgx_listen.go new file mode 100644 index 00000000..0651c8b1 --- /dev/null +++ b/third_party/lumencast-go/server/adapters/pgx_listen.go @@ -0,0 +1,137 @@ +package adapters + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/jackc/pgx/v5" + + "github.com/Lumencast/lumencast-go/server" +) + +// PgxListenConfig parameterises a PgxListen adapter that connects to +// Postgres directly and pumps LISTEN/NOTIFY events into a Scene. +type PgxListenConfig struct { + // DSN is a libpq-style connection string accepted by pgx.Connect. + // Required. + DSN string + + // Channels names every Postgres LISTEN target. Required, non-empty. + Channels []string + + // Decode converts a (channel, payload) pair into a patches map. + // Returning a non-nil error skips the emit ; (nil, nil) skips + // silently. + Decode PgListenDecode + + // MaxBackoff caps the reconnect backoff. Defaults to 30 s. + MaxBackoff time.Duration + + // OnError surfaces transport / decode errors. + OnError func(error) +} + +// PgxListen is a turn-key LISTEN/NOTIFY adapter. It opens a pgx +// connection, runs LISTEN on every configured channel, and emits the +// decoded patches on scene. Reconnects with exponential backoff on +// transport failures. Returns when ctx is cancelled. +// +// Internally it pipes into PgListen (the library-agnostic core) so +// the same Decode signature is reused. +func PgxListen(ctx context.Context, scene *server.Scene, cfg PgxListenConfig) error { + if cfg.DSN == "" { + return errors.New("adapters: PgxListenConfig.DSN is required") + } + if len(cfg.Channels) == 0 { + return errors.New("adapters: PgxListenConfig.Channels is required") + } + if cfg.Decode == nil { + return errors.New("adapters: PgxListenConfig.Decode is required") + } + if cfg.MaxBackoff == 0 { + cfg.MaxBackoff = 30 * time.Second + } + + var backoff time.Duration + for { + err := pgxRunOnce(ctx, scene, cfg) + if ctx.Err() != nil { + return nil + } + if err != nil && cfg.OnError != nil { + cfg.OnError(err) + } + backoff = nextBackoff(backoff, cfg.MaxBackoff) + select { + case <-ctx.Done(): + return nil + case <-time.After(backoff): + } + } +} + +func pgxRunOnce(ctx context.Context, scene *server.Scene, cfg PgxListenConfig) error { + conn, err := pgx.Connect(ctx, cfg.DSN) + if err != nil { + return fmt.Errorf("pgx connect: %w", err) + } + defer func() { _ = conn.Close(context.Background()) }() + + for _, ch := range cfg.Channels { + if _, err := conn.Exec(ctx, "LISTEN "+pgxQuoteIdent(ch)); err != nil { + return fmt.Errorf("LISTEN %q: %w", ch, err) + } + } + + notifications := make(chan PgNotification, 64) + pumpErr := make(chan error, 1) + go func() { + defer close(notifications) + for { + n, err := conn.WaitForNotification(ctx) + if err != nil { + pumpErr <- err + return + } + select { + case notifications <- PgNotification{Channel: n.Channel, Payload: n.Payload}: + case <-ctx.Done(): + pumpErr <- ctx.Err() + return + } + } + }() + + listenErr := PgListen(ctx, scene, notifications, cfg.Decode, cfg.OnError) + if listenErr != nil { + return listenErr + } + select { + case err := <-pumpErr: + if errors.Is(err, context.Canceled) { + return nil + } + return fmt.Errorf("notification pump: %w", err) + default: + return nil + } +} + +// pgxQuoteIdent quotes a Postgres identifier per the rules pgx itself +// uses : double-quote, escape interior double-quotes by doubling. We +// implement it here to avoid pulling pgx/internal helpers. +func pgxQuoteIdent(s string) string { + out := make([]byte, 0, len(s)+2) + out = append(out, '"') + for i := 0; i < len(s); i++ { + if s[i] == '"' { + out = append(out, '"', '"') + continue + } + out = append(out, s[i]) + } + out = append(out, '"') + return string(out) +} diff --git a/third_party/lumencast-go/server/adapters/ws_subscribe.go b/third_party/lumencast-go/server/adapters/ws_subscribe.go new file mode 100644 index 00000000..6c2270fc --- /dev/null +++ b/third_party/lumencast-go/server/adapters/ws_subscribe.go @@ -0,0 +1,102 @@ +package adapters + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/coder/websocket" + + "github.com/Lumencast/lumencast-go/server" +) + +// WSSubscribeConfig parameterises a WebSocket adapter. URL and Decode +// are required. +type WSSubscribeConfig struct { + // URL is the upstream WebSocket endpoint (ws:// or wss://). + URL string + + // Header is sent on the upgrade. + Header http.Header + + // Subprotocols negotiated with the upstream. + Subprotocols []string + + // Decode converts a single received frame's payload into a + // patches map. Returning (nil, nil) skips the emit ; non-nil + // error backs off. + Decode func(messageType websocket.MessageType, data []byte) (map[string]any, error) + + // MaxBackoff caps the reconnect backoff after a transport error. + // Defaults to 30 s. + MaxBackoff time.Duration + + // OnError, if non-nil, surfaces transport / decode errors. + OnError func(error) +} + +// WSSubscribe connects to cfg.URL, decodes incoming frames via +// cfg.Decode, and emits the resulting patches on scene. Returns +// when ctx is cancelled. Reconnects with exponential backoff on +// disconnect. +func WSSubscribe(ctx context.Context, scene *server.Scene, cfg WSSubscribeConfig) error { + if cfg.URL == "" { + return fmt.Errorf("adapters: WSSubscribeConfig.URL is required") + } + if cfg.Decode == nil { + return fmt.Errorf("adapters: WSSubscribeConfig.Decode is required") + } + if cfg.MaxBackoff == 0 { + cfg.MaxBackoff = 30 * time.Second + } + + var backoff time.Duration + for { + err := wsRunOnce(ctx, scene, cfg) + if ctx.Err() != nil { + return nil + } + if err != nil && cfg.OnError != nil { + cfg.OnError(err) + } + backoff = nextBackoff(backoff, cfg.MaxBackoff) + select { + case <-ctx.Done(): + return nil + case <-time.After(backoff): + } + } +} + +// wsRunOnce dials and pumps until the connection drops or ctx ends. +func wsRunOnce(ctx context.Context, scene *server.Scene, cfg WSSubscribeConfig) error { + dialOpts := &websocket.DialOptions{ + HTTPHeader: cfg.Header, + Subprotocols: cfg.Subprotocols, + } + c, _, err := websocket.Dial(ctx, cfg.URL, dialOpts) + if err != nil { + return fmt.Errorf("ws dial: %w", err) + } + defer func() { _ = c.Close(websocket.StatusNormalClosure, "") }() + + for { + mt, data, err := c.Read(ctx) + if err != nil { + return fmt.Errorf("ws read: %w", err) + } + patches, err := cfg.Decode(mt, data) + if err != nil { + if cfg.OnError != nil { + cfg.OnError(fmt.Errorf("decode: %w", err)) + } + continue + } + if len(patches) > 0 { + if emitErr := scene.Emit(patches); emitErr != nil && cfg.OnError != nil { + cfg.OnError(fmt.Errorf("emit: %w", emitErr)) + } + } + } +} diff --git a/third_party/lumencast-go/server/auth.go b/third_party/lumencast-go/server/auth.go new file mode 100644 index 00000000..efd7d983 --- /dev/null +++ b/third_party/lumencast-go/server/auth.go @@ -0,0 +1,200 @@ +// Package server is the Lumencast server kit. It provides a +// WebSocket subscription handler, a leaf-grain scene store, role +// enforcement, and adapter helpers — wrapping the LSDP/1 codec from +// the protocol package. +// +// The kit is opinionated about the wire format (it implements LSDP/1 +// verbatim) and unopinionated about everything else : credentials, +// persistence, business logic. The user provides an Authenticator +// implementation ; the kit calls it on every WebSocket upgrade. +package server + +import ( + "context" + "errors" + "net/http" + "sync" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// Identity is the principal returned by an Authenticator after a +// successful token validation, or by a RequestIdentityFunc derived +// from trusted request headers (ADR 007 §C.3a, no token involved). +// The server uses it to enforce role and path scoping on incoming +// Input frames. +type Identity struct { + // Subject is the human-readable principal identifier — a user + // name, a service name. Used in audit logs ; not load-bearing + // for authorisation decisions. + Subject string + + // Role drives the authorisation matrix (see protocol.Role). + Role protocol.Role + + // Paths optionally restricts a service token to a subset of the + // __inputs.* tree. Empty Paths on a service token means no + // restriction beyond the role default. Patterns may end with + // `*` to match any descendant. + Paths []string +} + +// Anonymous returns an unauthenticated Identity. Authenticators that +// reject a token MUST return (Anonymous, an error). +func Anonymous() Identity { return Identity{} } + +// IsAuthenticated reports whether the identity carries a non-empty +// role. The empty Identity is considered anonymous. +func (i Identity) IsAuthenticated() bool { + return i.Role.IsValid() +} + +// CanWrite reports whether the identity is allowed to mutate the given +// leaf path. Operators write everywhere under __inputs.* ; service +// tokens are scoped to their Paths claim ; test-mode connections +// write __test.*. +// +// This is the role/scope gate. The server applies an *additional* +// check that the path is declared in the active scene's +// operator_inputs ; that one lives in Scene.applyInput. +func (i Identity) CanWrite(path string) bool { + switch i.Role { + case protocol.RoleOperator: + return protocol.LeafPath(path).HasPrefix("__inputs") + case protocol.RoleService: + if !protocol.LeafPath(path).HasPrefix("__inputs") { + return false + } + if len(i.Paths) == 0 { + return true + } + for _, prefix := range i.Paths { + if matchPathPattern(prefix, path) { + return true + } + } + return false + case protocol.RoleTest: + return protocol.LeafPath(path).HasPrefix("__test") + default: + return false + } +} + +// matchPathPattern compares a service-token path pattern against a +// concrete path. `*` and `.*` suffixes match anything below ; bare +// patterns match exact + segment-aware prefix. +func matchPathPattern(pattern, path string) bool { + if pattern == "" { + return false + } + if pattern == path { + return true + } + if len(pattern) >= 2 && pattern[len(pattern)-2:] == ".*" { + return protocol.LeafPath(path).HasPrefix(pattern[:len(pattern)-2]) + } + if pattern[len(pattern)-1] == '*' { + // "__inputs.*" → match any path under __inputs + root := pattern[:len(pattern)-1] + if root != "" && root[len(root)-1] == '.' { + return protocol.LeafPath(path).HasPrefix(root[:len(root)-1]) + } + } + return protocol.LeafPath(path).HasPrefix(pattern) +} + +// Authenticator validates a token and yields an Identity. It is the +// single extension point for credential handling. Production +// implementations typically wrap a JWT verifier, an mTLS-derived +// principal, or a remote token-introspection endpoint. +type Authenticator interface { + // Authenticate is called on every WebSocket subscribe frame. + // The supplied token comes verbatim from the wire ; the + // implementation MUST validate it. Returning a nil error AND + // an Identity with an invalid role is treated as authentication + // failure. + Authenticate(ctx context.Context, token string) (Identity, error) +} + +// RequestIdentityFunc derives an Identity from the HTTP request that +// carried the WebSocket upgrade, instead of from the Subscribe frame's +// token. It is the header-trust seam (ADR 007 §C.3a) : a trusted +// front-proxy or gateway authenticates the caller and injects the +// principal as request headers, and the server reads it from there. +// +// When configured on Config.IdentityFromRequest, the server calls this +// on every upgrade and IGNORES Subscribe.Token. Returning a non-nil +// error, or an Identity with an invalid role, is treated as +// authentication failure (the server replies AUTH_DENIED and closes). +// +// It is mutually additive with Auth : if both are set, the request +// function wins. The token path (Auth only) is unchanged. +type RequestIdentityFunc func(r *http.Request) (Identity, error) + +// AuthenticatorFunc adapts an ordinary function to the Authenticator +// interface for one-off use. Useful in tests and the lumencast init +// template. +type AuthenticatorFunc func(ctx context.Context, token string) (Identity, error) + +// Authenticate implements Authenticator. +func (f AuthenticatorFunc) Authenticate(ctx context.Context, token string) (Identity, error) { + return f(ctx, token) +} + +// ErrAuthDenied is the canonical authentication failure. Wraps it +// from your Authenticator when you want the server to reply with +// AUTH_DENIED on the wire. +var ErrAuthDenied = errors.New("auth: token invalid, expired, or revoked") + +// StaticTokens is a development-only Authenticator that maps fixed +// token strings to identities. The lumencast init template flags it +// as a TODO ; do not deploy this to production. +type StaticTokens struct { + mu sync.RWMutex + tokens map[string]Identity +} + +// NewStaticTokens returns a StaticTokens authenticator pre-populated +// with the given map. The map is copied — later mutations to the +// caller's map have no effect. +func NewStaticTokens(tokens map[string]Identity) *StaticTokens { + cp := make(map[string]Identity, len(tokens)) + for k, v := range tokens { + cp[k] = v + } + return &StaticTokens{tokens: cp} +} + +// Set adds or replaces a token mapping. Safe for concurrent use. +func (s *StaticTokens) Set(token string, id Identity) { + s.mu.Lock() + defer s.mu.Unlock() + s.tokens[token] = id +} + +// Delete removes a token mapping. Safe for concurrent use. +func (s *StaticTokens) Delete(token string) { + s.mu.Lock() + defer s.mu.Unlock() + delete(s.tokens, token) +} + +// Reset removes every token mapping. Safe for concurrent use. Used by +// the interop control plane between scenarios. +func (s *StaticTokens) Reset() { + s.mu.Lock() + defer s.mu.Unlock() + s.tokens = map[string]Identity{} +} + +// Authenticate implements Authenticator. +func (s *StaticTokens) Authenticate(_ context.Context, token string) (Identity, error) { + s.mu.RLock() + defer s.mu.RUnlock() + id, ok := s.tokens[token] + if !ok { + return Anonymous(), ErrAuthDenied + } + return id, nil +} diff --git a/third_party/lumencast-go/server/identity_from_request_test.go b/third_party/lumencast-go/server/identity_from_request_test.go new file mode 100644 index 00000000..d94a19d7 --- /dev/null +++ b/third_party/lumencast-go/server/identity_from_request_test.go @@ -0,0 +1,284 @@ +package server_test + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "testing" + "time" + + "github.com/coder/websocket" + + "github.com/Lumencast/lumencast-go/protocol" + "github.com/Lumencast/lumencast-go/server" +) + +// startTestServerWithConfig launches a Server from a full Config (the +// caller fills Auth and/or IdentityFromRequest) and returns its base +// WebSocket URL. It mirrors startTestServer's run/teardown plumbing so +// the header-trust seam exercises the exact same lifecycle as the token +// path. +func startTestServerWithConfig(t *testing.T, cfg server.Config) (*server.Server, string) { + t.Helper() + cfg.ListenAddr = "127.0.0.1:0" + if cfg.PingInterval == 0 { + cfg.PingInterval = 5 * time.Second + } + if cfg.SubscribeTimeout == 0 { + cfg.SubscribeTimeout = 2 * time.Second + } + srv, err := server.New(cfg) + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + done := make(chan struct{}) + go func() { + _ = srv.Run(ctx) + close(done) + }() + t.Cleanup(func() { + cancel() + select { + case <-done: + case <-time.After(3 * time.Second): + } + }) + deadline := time.Now().Add(2 * time.Second) + for srv.Addr() == "" { + if time.Now().After(deadline) { + t.Fatal("server never reported Addr()") + } + time.Sleep(5 * time.Millisecond) + } + return srv, "ws://" + srv.Addr() + "/lsdp.v1" +} + +// dialWithHeader dials the LSDP endpoint with extra HTTP headers on the +// upgrade request — the channel a trusted front-proxy uses to convey an +// already-authenticated principal to the header-trust seam. +func dialWithHeader(t *testing.T, url string, header http.Header) *websocket.Conn { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + c, _, err := websocket.Dial(ctx, url, &websocket.DialOptions{ + Subprotocols: []string{protocol.SubProtocol}, + HTTPClient: &http.Client{Timeout: 2 * time.Second}, + HTTPHeader: header, + }) + if err != nil { + t.Fatalf("dial: %v", err) + } + t.Cleanup(func() { _ = c.Close(websocket.StatusNormalClosure, "") }) + return c +} + +// headerTrust reads the test header X-Test-User and maps it to an +// operator Identity. An empty header yields an anonymous Identity, which +// the server rejects — proving the seam still gates unauthenticated +// callers. +func headerTrust(r *http.Request) (server.Identity, error) { + switch r.Header.Get("X-Test-User") { + case "op": + return server.Identity{Subject: "op", Role: protocol.RoleOperator}, nil + case "viewer": + return server.Identity{Subject: "v", Role: protocol.RoleViewer}, nil + case "": + return server.Anonymous(), errors.New("no X-Test-User header") + default: + return server.Anonymous(), errors.New("unknown X-Test-User") + } +} + +// --- New() validation ------------------------------------------------- + +func TestNew_AcceptsIdentityFromRequestAlone(t *testing.T) { + srv, err := server.New(server.Config{ + ListenAddr: "127.0.0.1:0", + IdentityFromRequest: headerTrust, + }) + if err != nil { + t.Fatalf("IdentityFromRequest alone must be accepted: %v", err) + } + if srv == nil { + t.Fatal("expected non-nil server") + } +} + +func TestNew_RejectsBothAuthSourcesNil(t *testing.T) { + _, err := server.New(server.Config{ListenAddr: "127.0.0.1:0"}) + if err == nil { + t.Fatal("Config with neither Auth nor IdentityFromRequest must error") + } +} + +func TestNew_AcceptsAuthAlone(t *testing.T) { + // Backward-compat guard : the historical "Auth only" Config stays valid. + _, err := server.New(server.Config{ + ListenAddr: "127.0.0.1:0", + Auth: opAuth(), + }) + if err != nil { + t.Fatalf("Auth alone must remain valid: %v", err) + } +} + +// --- Token path unchanged -------------------------------------------- + +// TestTokenPath_UnchangedWithoutSeam asserts the default (Auth-only) +// configuration produces the exact same subscribe → snapshot → input → +// delta sequence as before the seam was introduced. This is the +// non-breaking guarantee : with IdentityFromRequest nil, nothing about +// the token path moves. +func TestTokenPath_UnchangedWithoutSeam(t *testing.T) { + srv, url := startTestServerWithConfig(t, server.Config{Auth: opAuth()}) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + + snap, ok := recv(t, c).(*protocol.Snapshot) + if !ok { + t.Fatalf("first frame is not snapshot") + } + if snap.Seq != 1 || snap.SceneID != "main" { + t.Fatalf("unexpected snapshot: %+v", snap) + } + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{{Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}}, + }) + d, ok := recv(t, c).(*protocol.Delta) + if !ok { + t.Fatalf("expected delta echo") + } + if d.Seq != 2 || len(d.Patches) != 1 || d.Patches[0].Path != "__inputs.title" { + t.Fatalf("unexpected delta: %+v", d) + } +} + +// TestTokenPath_StillRejectsBadToken proves the Auth path still validates +// the token when the seam is absent. +func TestTokenPath_StillRejectsBadToken(t *testing.T) { + srv, url := startTestServerWithConfig(t, server.Config{Auth: opAuth()}) + srv.NewScene("main") + _ = srv.ActiveScene().Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "nope"}) + e, ok := recv(t, c).(*protocol.Error) + if !ok { + t.Fatalf("got %T, want *Error", e) + } + if e.Code != string(protocol.CodeAuthDenied) { + t.Fatalf("got code %q", e.Code) + } +} + +// --- Header-trust path ------------------------------------------------ + +// TestHeaderTrust_SnapshotDeltaResume drives the full lifecycle through +// the seam : a valid header yields an operator Identity, the connection +// gets snapshot + delta, and a reconnect with since_sequence resumes +// from the replay buffer. The Subscribe carries a bogus token to prove +// it is ignored when IdentityFromRequest is set. +func TestHeaderTrust_SnapshotDeltaResume(t *testing.T) { + srv, url := startTestServerWithConfig(t, server.Config{IdentityFromRequest: headerTrust}) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + h := http.Header{} + h.Set("X-Test-User", "op") + + c := dialWithHeader(t, url, h) + // Bogus token : there is no such token in any Authenticator (none is + // even configured). If the server validated it, auth would fail. + send(t, c, &protocol.Subscribe{Token: "this-token-is-never-validated"}) + + snap, ok := recv(t, c).(*protocol.Snapshot) + if !ok { + t.Fatalf("first frame is not snapshot") + } + if snap.Seq != 1 { + t.Fatalf("snapshot seq: got %d want 1", snap.Seq) + } + + // Operator role from the header lets us write — proving the Identity + // (not just authentication) flows through from the seam. + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{{Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}}, + }) + d, ok := recv(t, c).(*protocol.Delta) + if !ok || d.Seq != 2 { + t.Fatalf("expected delta seq=2, got %+v", d) + } + _ = c.CloseNow() + + // Resume with since_sequence=1 → replay buffer ships delta(seq=2) + // instead of a fresh snapshot, identical to the token path. + c2 := dialWithHeader(t, url, h) + send(t, c2, &protocol.Subscribe{Token: "still-ignored", SinceSequence: 1}) + d2, ok := recv(t, c2).(*protocol.Delta) + if !ok { + t.Fatalf("expected delta on resume, got non-delta") + } + if d2.Seq != 2 { + t.Fatalf("resume delta seq: got %d want 2", d2.Seq) + } +} + +// TestHeaderTrust_IgnoresValidTokenIdentity is the sharpest proof that +// the token is not consulted : an Authenticator IS configured alongside +// the seam, and the Subscribe carries a real viewer token. If the token +// were honoured the connection would be a viewer (cannot write). Because +// the header maps to operator, the input is accepted. +func TestHeaderTrust_IgnoresValidTokenIdentity(t *testing.T) { + srv, url := startTestServerWithConfig(t, server.Config{ + Auth: opAuth(), + IdentityFromRequest: headerTrust, + }) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + h := http.Header{} + h.Set("X-Test-User", "op") + + c := dialWithHeader(t, url, h) + // viewer-tok is a real, valid token — but for a viewer, who cannot + // write. The seam must override it with the operator from the header. + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) // snapshot + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{{Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}}, + }) + frame := recv(t, c) + if e, ok := frame.(*protocol.Error); ok { + t.Fatalf("write rejected (%s) — token identity leaked through the seam", e.Code) + } + if _, ok := frame.(*protocol.Delta); !ok { + t.Fatalf("got %T, want *Delta — operator from header should write", frame) + } +} + +// TestHeaderTrust_RejectsUnauthenticated confirms the seam still gates : +// a missing header yields an error from the func and the server closes +// with AUTH_DENIED, just like a bad token would. +func TestHeaderTrust_RejectsUnauthenticated(t *testing.T) { + srv, url := startTestServerWithConfig(t, server.Config{IdentityFromRequest: headerTrust}) + srv.NewScene("main") + _ = srv.ActiveScene().Set(map[string]any{"x": 1}) + + c := dial(t, url) // no X-Test-User header + send(t, c, &protocol.Subscribe{Token: "irrelevant"}) + e, ok := recv(t, c).(*protocol.Error) + if !ok { + t.Fatalf("got %T, want *Error", e) + } + if e.Code != string(protocol.CodeAuthDenied) { + t.Fatalf("got code %q, want %s", e.Code, protocol.CodeAuthDenied) + } +} diff --git a/third_party/lumencast-go/server/listen.go b/third_party/lumencast-go/server/listen.go new file mode 100644 index 00000000..d154307b --- /dev/null +++ b/third_party/lumencast-go/server/listen.go @@ -0,0 +1,10 @@ +package server + +import "net" + +// netListen wraps net.Listen so the server package keeps a single +// import path for the standard library — convenient when swapping in +// a fake listener in tests via dependency injection. +func netListen(network, addr string) (net.Listener, error) { + return net.Listen(network, addr) +} diff --git a/third_party/lumencast-go/server/overlay_apps_test.go b/third_party/lumencast-go/server/overlay_apps_test.go new file mode 100644 index 00000000..498e42a1 --- /dev/null +++ b/third_party/lumencast-go/server/overlay_apps_test.go @@ -0,0 +1,154 @@ +package server_test + +import ( + "testing" + + "github.com/Lumencast/lumencast-go/protocol" +) + +func boolPtr(b bool) *bool { return &b } + +func appsFixture() map[string]protocol.OverlayAppState { + return map[string]protocol.OverlayAppState{ + "cam": {Running: boolPtr(true), OnAir: boolPtr(false)}, + "lt": {Running: boolPtr(true)}, // partial: only the running dimension + } +} + +// TestOverlayApps_ReplayedAfterSnapshot: a fresh 1.1 live subscriber receives +// the cached overlay-app state right after its snapshot (mirror of the roster). +func TestOverlayApps_ReplayedAfterSnapshot(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + srv.SetOverlayApps(appsFixture()) + + c := dialV11(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("first frame is not snapshot") + } + overlay, ok := recv(t, c).(*protocol.OverlayApps) + if !ok { + t.Fatalf("second frame is not overlay_apps") + } + assertApps(t, overlay) +} + +// TestOverlayApps_DeliverableWithNoActiveScene is THE blocking criterion: with +// NO scene ever registered (an empty show, empty roster), a live 1.1 subscriber +// can still connect and receives the overlay_apps frame. This is the Marker +// case — an overlay consumer with no active scene. +func TestOverlayApps_DeliverableWithNoActiveScene(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + srv.SetOverlayApps(appsFixture()) + + c := dialV11(t, url) // no NewScene, no SetActive — the show is empty + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + + // The scene-less join still yields a (holding) snapshot, then the overlay. + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("scene-less join: first frame is not snapshot") + } + overlay, ok := recv(t, c).(*protocol.OverlayApps) + if !ok { + t.Fatalf("scene-less join did NOT receive overlay_apps") + } + assertApps(t, overlay) +} + +// TestOverlayApps_FanoutReachesSceneLessSubscriber: a SetOverlayApps AFTER a +// scene-less subscriber has joined still fans out to it (the holding scene is +// part of the show-level fan-out set). +func TestOverlayApps_FanoutReachesSceneLessSubscriber(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + + c := dialV11(t, url) // empty show + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("first frame is not snapshot") + } + + // State published AFTER the join reaches the holding subscriber. + srv.SetOverlayApps(appsFixture()) + overlay, ok := recv(t, c).(*protocol.OverlayApps) + if !ok { + t.Fatalf("scene-less subscriber did not receive fanned-out overlay_apps") + } + assertApps(t, overlay) +} + +// TestOverlayApps_SceneLessSubscriberMigratesOnActivation: a subscriber that +// joined with no scene is migrated onto the first scene that becomes active, +// receiving SceneChanged + a fresh snapshot — and keeps receiving overlay. +func TestOverlayApps_SceneLessSubscriberMigratesOnActivation(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + srv.SetOverlayApps(appsFixture()) + + c := dialV11(t, url) // empty show + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("holding snapshot expected") + } + if _, ok := recv(t, c).(*protocol.OverlayApps); !ok { + t.Fatalf("overlay replay expected") + } + + // First scene appears → the holding subscriber migrates onto it. + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Live"}); err != nil { + t.Fatal(err) + } + sc, ok := recv(t, c).(*protocol.SceneChanged) + if !ok { + t.Fatalf("expected SceneChanged on activation, got %T", sc) + } + if sc.SceneID != "main" { + t.Fatalf("SceneChanged to %q, want main", sc.SceneID) + } + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("expected fresh snapshot after migration") + } +} + +// TestOverlayApps_NotSentToLegacy10Subscribers: a 1.0 connection never receives +// the additive overlay_apps frame (1.1-only surface, parity with scene_roster). +func TestOverlayApps_NotSentToLegacy10Subscribers(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + srv.SetOverlayApps(appsFixture()) + + c := dial(t, url) // 1.0 subprotocol + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("first frame is not snapshot") + } + // A live update must arrive next — no overlay_apps wedged in. + if err := scene.Emit(map[string]any{"show.title": "World"}); err != nil { + t.Fatal(err) + } + if _, ok := recv(t, c).(*protocol.Delta); !ok { + t.Fatalf("1.0 subscriber received a non-delta frame (leaked overlay_apps?)") + } +} + +func assertApps(t *testing.T, overlay *protocol.OverlayApps) { + t.Helper() + if len(overlay.Apps) != 2 { + t.Fatalf("overlay apps = %+v, want 2 entries", overlay.Apps) + } + cam, ok := overlay.Apps["cam"] + if !ok || cam.Running == nil || !*cam.Running || cam.OnAir == nil || *cam.OnAir { + t.Fatalf("cam state wrong: %+v", cam) + } + lt, ok := overlay.Apps["lt"] + if !ok || lt.Running == nil || !*lt.Running || lt.OnAir != nil { + t.Fatalf("lt partial state wrong (on_air should be absent): %+v", lt) + } +} diff --git a/third_party/lumencast-go/server/replay_buffer.go b/third_party/lumencast-go/server/replay_buffer.go new file mode 100644 index 00000000..114a1bfc --- /dev/null +++ b/third_party/lumencast-go/server/replay_buffer.go @@ -0,0 +1,119 @@ +package server + +import ( + "sync" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// DefaultReplayBufferSize is the default capacity (in number of delta +// records) of a Scene's replay buffer. Per LSDP/1.1 §18.1, servers +// SHOULD hold at least 256 entries. +const DefaultReplayBufferSize = 256 + +// replayRecord is one entry in the per-scene replay buffer. +type replayRecord struct { + seq uint64 + patches []protocol.Patch + cause *protocol.Cause + // projectionMetadata carries optional, additive metadata associated + // with the delta emission path. + projectionMetadata *protocol.ProjectionMetadata +} + +// replayBuffer is a bounded ring of recent (seq, patches, cause) +// emissions for a scene. Records are pushed in monotonic seq order. +// Lookup is "give me everything strictly after sinceSeq". +type replayBuffer struct { + mu sync.RWMutex + records []replayRecord + head int // next write index + cap int + size int // number of valid entries +} + +// newReplayBuffer returns a buffer of the given capacity. cap < 1 +// silently coerces to DefaultReplayBufferSize. +func newReplayBuffer(cap int) *replayBuffer { + if cap < 1 { + cap = DefaultReplayBufferSize + } + return &replayBuffer{ + records: make([]replayRecord, cap), + cap: cap, + } +} + +// push records a new emission. Monotonic seq is the caller's +// responsibility ; the buffer does not enforce it. +func (b *replayBuffer) push(seq uint64, patches []protocol.Patch, cause *protocol.Cause, metadata *protocol.ProjectionMetadata) { + b.mu.Lock() + defer b.mu.Unlock() + // Keep a defensive copy so callers mutating the incoming metadata + // after emit cannot race with replay readers. + var copiedMetadata *protocol.ProjectionMetadata + if metadata != nil { + c := *metadata + copiedMetadata = &c + } + b.records[b.head] = replayRecord{ + seq: seq, + patches: patches, + cause: cause, + projectionMetadata: copiedMetadata, + } + b.head = (b.head + 1) % b.cap + if b.size < b.cap { + b.size++ + } +} + +// since returns every record with seq > sinceSeq, in monotonic order. +// The second return value reports whether the buffer's coverage is +// sufficient — false when sinceSeq is older than the buffer's earliest +// retained entry, which is the signal to fall back to a fresh snapshot +// (LSDP/1.1 §18.1). +func (b *replayBuffer) since(sinceSeq uint64) ([]replayRecord, bool) { + b.mu.RLock() + defer b.mu.RUnlock() + if b.size == 0 { + // Empty buffer — nothing to replay. The caller decides whether + // this is "all caught up" (sinceSeq == current) or a miss. + return nil, true + } + // Find the earliest retained seq. + tail := (b.head - b.size + b.cap) % b.cap + earliest := b.records[tail].seq + // If the requested resume point is older than what we have, the + // caller MUST fall back to a fresh snapshot. + if sinceSeq+1 < earliest { + return nil, false + } + out := make([]replayRecord, 0, b.size) + for i := 0; i < b.size; i++ { + idx := (tail + i) % b.cap + r := b.records[idx] + if r.seq > sinceSeq { + out = append(out, r) + } + } + return out, true +} + +// reset clears the buffer. Used on scene_changed. +func (b *replayBuffer) reset() { + b.mu.Lock() + defer b.mu.Unlock() + b.head = 0 + b.size = 0 + // Note: we leave the underlying slice intact ; old entries become + // unreachable on the next push wrap and GC reclaims their patch + // slices when the records overwrite. +} + +// length returns the number of retained entries (for tests / metrics). +func (b *replayBuffer) length() int { + b.mu.RLock() + defer b.mu.RUnlock() + return b.size +} diff --git a/third_party/lumencast-go/server/replay_buffer_test.go b/third_party/lumencast-go/server/replay_buffer_test.go new file mode 100644 index 00000000..83c020dd --- /dev/null +++ b/third_party/lumencast-go/server/replay_buffer_test.go @@ -0,0 +1,122 @@ +package server + +import ( + "fmt" + "testing" + + "github.com/Lumencast/lumencast-go/protocol" +) + +func TestReplayBuffer_PushAndSince(t *testing.T) { + b := newReplayBuffer(4) + for i := uint64(1); i <= 3; i++ { + b.push( + i, + []protocol.Patch{{Path: "x"}}, + nil, + &protocol.ProjectionMetadata{ + SchemaVersion: fmt.Sprintf("schema-%02d", i), + }, + ) + } + if got := b.length(); got != 3 { + t.Fatalf("length: got %d want 3", got) + } + recs, ok := b.since(1) + if !ok { + t.Fatal("since(1): want covered=true") + } + if len(recs) != 2 || recs[0].seq != 2 || recs[1].seq != 3 { + t.Fatalf("since(1): got %+v", recs) + } + if recs[0].projectionMetadata == nil || recs[1].projectionMetadata == nil { + t.Fatal("expected metadata to be preserved") + } + if recs[0].projectionMetadata.SchemaVersion != "schema-02" || recs[1].projectionMetadata.SchemaVersion != "schema-03" { + t.Fatalf("unexpected metadata: %+v %+v", recs[0].projectionMetadata, recs[1].projectionMetadata) + } +} + +func TestReplayBuffer_PreservationIsDefensiveCopy(t *testing.T) { + b := newReplayBuffer(4) + md := &protocol.ProjectionMetadata{ + SchemaVersion: "schema-01", + SceneDigest: "digest", + } + b.push(1, nil, nil, md) + md.SchemaVersion = "changed" + + recs, ok := b.since(0) + if !ok { + t.Fatal("since(0): want covered=true") + } + if len(recs) != 1 { + t.Fatalf("expected 1 record, got %d", len(recs)) + } + if recs[0].projectionMetadata == nil { + t.Fatal("metadata is nil after push") + } + if recs[0].projectionMetadata.SchemaVersion != "schema-01" { + t.Fatalf("metadata should be copied defensively, got %s", recs[0].projectionMetadata.SchemaVersion) + } +} + +func TestReplayBuffer_RingWraparound(t *testing.T) { + b := newReplayBuffer(4) + for i := uint64(1); i <= 10; i++ { + b.push(i, nil, nil, nil) + } + // Buffer holds the last 4 (seq 7..10). Earliest is 7. + if got := b.length(); got != 4 { + t.Fatalf("length: got %d want 4", got) + } + // since(6) → covered=true (we have 7..10) + recs, ok := b.since(6) + if !ok || len(recs) != 4 { + t.Fatalf("since(6) covered=%v len=%d (want 4)", ok, len(recs)) + } + if recs[0].seq != 7 || recs[3].seq != 10 { + t.Fatalf("since(6) seqs: %d..%d", recs[0].seq, recs[3].seq) + } +} + +func TestReplayBuffer_GapNotCovered(t *testing.T) { + b := newReplayBuffer(4) + for i := uint64(1); i <= 10; i++ { + b.push(i, nil, nil, nil) + } + // since(2) → not covered (we only have 7..10 ; 2 is too old) + if _, ok := b.since(2); ok { + t.Fatal("since(2): want covered=false (buffer earliest is 7)") + } +} + +func TestReplayBuffer_AllCaughtUp(t *testing.T) { + b := newReplayBuffer(4) + for i := uint64(1); i <= 3; i++ { + b.push(i, nil, nil, nil) + } + recs, ok := b.since(3) + if !ok || len(recs) != 0 { + t.Fatalf("since(3) (caught up): covered=%v len=%d (want covered=true len=0)", ok, len(recs)) + } +} + +func TestReplayBuffer_Reset(t *testing.T) { + b := newReplayBuffer(4) + b.push(1, nil, nil, nil) + b.reset() + if got := b.length(); got != 0 { + t.Fatalf("after reset: length=%d", got) + } + if _, ok := b.since(0); !ok { + t.Fatal("since(0) on empty buffer: want covered=true (nothing to replay)") + } +} + +func TestReplayBuffer_EmptyBufferAlwaysCovered(t *testing.T) { + b := newReplayBuffer(4) + if _, ok := b.since(99); !ok { + t.Fatal("empty buffer: want covered=true regardless of sinceSeq") + } +} diff --git a/third_party/lumencast-go/server/roster_test.go b/third_party/lumencast-go/server/roster_test.go new file mode 100644 index 00000000..ebb23d43 --- /dev/null +++ b/third_party/lumencast-go/server/roster_test.go @@ -0,0 +1,142 @@ +package server_test + +import ( + "context" + "net/http" + "testing" + "time" + + "github.com/coder/websocket" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// dialV11 opens a connection advertising the lsdp.v1.1 subprotocol so +// the server tags the subscription as 1.1-capable (roster-eligible). +func dialV11(t *testing.T, url string) *websocket.Conn { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + c, _, err := websocket.Dial(ctx, url, &websocket.DialOptions{ + Subprotocols: []string{protocol.SubProtocolV1_1}, + HTTPClient: &http.Client{Timeout: 2 * time.Second}, + }) + if err != nil { + t.Fatalf("dial v1.1: %v", err) + } + t.Cleanup(func() { _ = c.Close(websocket.StatusNormalClosure, "") }) + return c +} + +// TestRoster_ReplayedAfterSnapshot : a fresh 1.1 live subscriber +// receives the cached roster immediately after its initial snapshot. +func TestRoster_ReplayedAfterSnapshot(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + srv.SetRoster([]protocol.RosterEntry{ + {SceneID: "main", SceneVersion: "sha256:aaa"}, + {SceneID: "brb", SceneVersion: "sha256:bbb"}, + }) + + c := dialV11(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("first frame is not snapshot") + } + roster, ok := recv(t, c).(*protocol.SceneRoster) + if !ok { + t.Fatalf("second frame is not scene_roster") + } + if len(roster.Entries) != 2 || roster.Entries[0].SceneID != "main" || + roster.Entries[1].SceneVersion != "sha256:bbb" { + t.Fatalf("unexpected roster entries: %+v", roster.Entries) + } +} + +// TestRoster_NoReplayBeforeSet : with no roster ever set, a subscriber +// gets its snapshot and then live frames — never a spurious roster. +func TestRoster_NoReplayBeforeSet(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + + c := dialV11(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("first frame is not snapshot") + } + + // Emit a delta ; the very next frame must be that delta, proving no + // roster was injected after the snapshot. + if err := scene.Emit(map[string]any{"show.title": "World"}); err != nil { + t.Fatal(err) + } + if _, ok := recv(t, c).(*protocol.Delta); !ok { + t.Fatalf("expected delta, got a different frame (spurious roster?)") + } +} + +// TestRoster_FannedOutToAllLiveSubs : SetRoster reaches every live 1.1 +// subscriber already attached. +func TestRoster_FannedOutToAllLiveSubs(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + + c1 := dialV11(t, url) + send(t, c1, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c1).(*protocol.Snapshot); !ok { + t.Fatalf("c1 first frame is not snapshot") + } + c2 := dialV11(t, url) + send(t, c2, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c2).(*protocol.Snapshot); !ok { + t.Fatalf("c2 first frame is not snapshot") + } + + srv.SetRoster([]protocol.RosterEntry{{SceneID: "main", SceneVersion: "sha256:v1"}}) + + for i, c := range []*websocket.Conn{c1, c2} { + roster, ok := recv(t, c).(*protocol.SceneRoster) + if !ok { + t.Fatalf("sub %d did not receive roster", i) + } + if len(roster.Entries) != 1 || roster.Entries[0].SceneVersion != "sha256:v1" { + t.Fatalf("sub %d unexpected roster: %+v", i, roster.Entries) + } + } +} + +// TestRoster_NotSentToLegacy10Subscribers : a 1.0 connection never +// receives the additive scene_roster frame (parity with from_scene_id / +// transition — 1.1-only surface). +func TestRoster_NotSentToLegacy10Subscribers(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + srv.SetRoster([]protocol.RosterEntry{{SceneID: "main", SceneVersion: "sha256:v1"}}) + + c := dial(t, url) // 1.0 subprotocol + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatalf("first frame is not snapshot") + } + + // A live update must arrive as the next frame — no roster wedged in. + if err := scene.Emit(map[string]any{"show.title": "World"}); err != nil { + t.Fatal(err) + } + if _, ok := recv(t, c).(*protocol.Delta); !ok { + t.Fatalf("1.0 subscriber received a non-delta frame (leaked roster?)") + } +} diff --git a/third_party/lumencast-go/server/scene.go b/third_party/lumencast-go/server/scene.go new file mode 100644 index 00000000..ff2dc926 --- /dev/null +++ b/third_party/lumencast-go/server/scene.go @@ -0,0 +1,595 @@ +package server + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "sync" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// ErrEmptyPatches is returned by Scene.Emit / Scene.Set when called +// with an empty map. +var ErrEmptyPatches = errors.New("server: empty patches map") + +// Scene is the server-side abstraction of a Lumencast scene : an +// id, a current state, and a fan-out of subscribers. Adapter +// goroutines call Set (initial seed) and Emit (live deltas). The +// fan-out runs on a single goroutine per subscriber ; back-pressured +// subscribers get coalesced into a fresh snapshot rather than a +// growing delta queue. +// +// A Scene is safe for concurrent use. +type Scene struct { + id string + version string + store *store + + mu sync.Mutex + // seq is the per-scene monotonic counter (LSDP/1.1 §18.1.1). All + // concurrent subscribers see the same seq value on a given delta ; + // late-joining subscribers receive a snapshot whose seq matches + // this counter, NOT seq=1. The first emission on a fresh scene + // returns seq=1 from NextServer. + seq *protocol.SequenceTracker + // replay holds the recent (seq, patches, cause, projection metadata) + // emissions so a 1.1 + // client reconnecting with `since_sequence` can resume without a + // fresh snapshot (LSDP/1.1 §18.1). + replay *replayBuffer + subscribers map[*subscription]struct{} + + // lastMetadata is the most recently known projection metadata from + // an EmitWithCauseAndMetadata call — the scene's last known + // correlation identity. Every Snapshot construction site (collapse + // recovery, refreshAll, late-join subscribe, live migration) stamps + // it onto the outgoing frame so a subscriber that never saw the + // originating Delta still gets a correlatable identity. Nil until + // the first EmitWithCauseAndMetadata call ; Snapshot fields are then + // omitted entirely rather than fabricated. + lastMetadata *protocol.ProjectionMetadata + + // declaredInputs is the subset of __inputs.* paths the scene + // accepts, keyed by path. Empty means "accept anything under + // __inputs.*". The CLI's lumencast validate would normally + // populate this from an LSML bundle ; for code-driven scenes the + // user calls DeclareInputs / WithOperatorInputs explicitly. + declaredInputs map[string]InputSpec + + // rejection, when non-nil, marks the scene unservable : every + // subscriber gets this error frame instead of a snapshot. Set by + // Reject when the backing bundle failed validation. + rejection *SceneRejection +} + +// SceneRejection is the error a rejected scene serves in place of its +// snapshot. +type SceneRejection struct { + Code protocol.ErrorCode + Message string +} + +// SceneOption configures a Scene at creation time. +type SceneOption func(*Scene) + +// WithSceneVersion sets the scene_version field that flows on +// snapshot / scene_changed frames. Defaults to "sha256:0..." (a +// sentinel) so test code does not need to compute a hash. +func WithSceneVersion(v string) SceneOption { + return func(s *Scene) { s.version = v } +} + +// WithDeclaredInputs restricts the set of __inputs.* paths the scene +// accepts. Inputs to undeclared paths are rejected with UNKNOWN_PATH. +// Equivalent to WithOperatorInputs with no constraint metadata. +func WithDeclaredInputs(paths []string) SceneOption { + return func(s *Scene) { + if s.declaredInputs == nil { + s.declaredInputs = make(map[string]InputSpec, len(paths)) + } + for _, p := range paths { + s.declaredInputs[p] = InputSpec{Path: p} + } + } +} + +// WithOperatorInputs declares operator-controllable paths AND their +// constraints. Inputs that violate a constraint (string longer than +// MaxLength, number out of [Min, Max], enum not in Values) are rejected +// with INVALID_VALUE atomically — the entire frame is dropped. +func WithOperatorInputs(specs []InputSpec) SceneOption { + return func(s *Scene) { + if s.declaredInputs == nil { + s.declaredInputs = make(map[string]InputSpec, len(specs)) + } + for _, spec := range specs { + s.declaredInputs[spec.Path] = spec + } + } +} + +// InputSpec describes one operator-controllable path and the type / +// constraint metadata the server enforces. Mirrors LSML 1.0 § 8. +// +// Type values : "string", "number", "boolean", "enum", "color", +// "date", "time", "path-ref", "image-ref". The empty string skips +// type checking but still enforces declaredness. +type InputSpec struct { + Path string + + Type string + + // MaxLength applies to strings (Type == "string"). + MaxLength int + + // Min and Max apply to numbers (Type == "number"). + Min *float64 + Max *float64 + + // Values is the enum domain for Type == "enum". + Values []string +} + +// newScene constructs a fresh Scene. Call NewScene on a Server to +// register one with the kit. +func newScene(id string, opts ...SceneOption) *Scene { + seq := protocol.NewSequenceTracker() + // Pre-seed the scene seq to 1 so the very first subscriber's + // snapshot ships at seq=1 (matching the LSDP/1.0 baseline that all + // existing conformance scenarios assume). Subsequent deltas + // increment to 2, 3, etc. Late-joining subscribers see the + // current value, not 1. + seq.NextServer() + s := &Scene{ + id: id, + version: defaultSceneVersion, + store: newStore(), + seq: seq, + replay: newReplayBuffer(DefaultReplayBufferSize), + subscribers: make(map[*subscription]struct{}), + } + for _, opt := range opts { + opt(s) + } + return s +} + +const defaultSceneVersion = "sha256:0000000000000000000000000000000000000000000000000000000000000000" + +// ID returns the scene's identifier. +func (s *Scene) ID() string { return s.id } + +// SnapshotForConformance returns a defensive copy of the current +// authoritative state. Exposed for the conformance harness's +// expect-server-state step ; ordinary callers use Set / Emit. +func (s *Scene) SnapshotForConformance() map[string]json.RawMessage { + return s.store.snapshot() +} + +// Version returns the current scene_version (content hash). +func (s *Scene) Version() string { return s.version } + +// SetVersion updates the scene_version. Triggering a SceneChanged +// frame is the caller's responsibility (Server.SwitchScene). +func (s *Scene) SetVersion(v string) { + s.mu.Lock() + defer s.mu.Unlock() + s.version = v +} + +// Reject marks the scene unservable : every subscriber receives code / +// message as a non-recoverable error frame in place of the snapshot. +// Used when the bundle backing the scene fails validation. +func (s *Scene) Reject(code protocol.ErrorCode, message string) { + s.mu.Lock() + defer s.mu.Unlock() + s.rejection = &SceneRejection{Code: code, Message: message} +} + +// Rejection returns the rejection recorded by Reject, or nil. +func (s *Scene) Rejection() *SceneRejection { + s.mu.Lock() + defer s.mu.Unlock() + return s.rejection +} + +// Set seeds initial state. Existing subscribers receive a fresh +// Snapshot reflecting the new state ; new subscribers see the same. +// Call Set before subscribers attach when bootstrapping ; for live +// updates use Emit. +func (s *Scene) Set(patches map[string]any) error { + if len(patches) == 0 { + return ErrEmptyPatches + } + if _, err := s.store.applyPatches(patches); err != nil { + return err + } + // Notify subscribers with a fresh snapshot so they re-base. + return s.refreshAll() +} + +// Emit applies a leaf-grain delta : updates the store and fans out +// a Delta frame to every subscriber. Subscribers whose buffer is +// full collapse to a snapshot to avoid unbounded growth. +func (s *Scene) Emit(patches map[string]any) error { + return s.emitWithCause(patches, nil, nil) +} + +// EmitWithCause is the LSDP/1.1 entry point — same as Emit, but the +// resulting Delta carries the supplied Cause as provenance metadata +// (§3.2.3). Adapters and operator-input pipelines use this to thread +// origin info through to the wire. 1.0 callers stay on Emit and +// produce cause-less deltas. +func (s *Scene) EmitWithCause(patches map[string]any, cause *protocol.Cause) error { + return s.emitWithCause(patches, cause, nil) +} + +// EmitWithCauseAndMetadata is LSDP/1.1 entry point for caller-provided +// projection metadata, in addition to Cause. +// Solar/Orion can pass the six projection fields without forcing any +// caller-side contract changes outside the 1.1 wire surface. +func (s *Scene) EmitWithCauseAndMetadata(patches map[string]any, cause *protocol.Cause, metadata *protocol.ProjectionMetadata) error { + return s.emitWithCause(patches, cause, metadata) +} + +func (s *Scene) emitWithCause(patches map[string]any, cause *protocol.Cause, metadata *protocol.ProjectionMetadata) error { + if len(patches) == 0 { + return ErrEmptyPatches + } + raw, err := s.store.applyPatches(patches) + if err != nil { + return err + } + wirePatches := make([]protocol.Patch, len(raw)) + for i, p := range raw { + wirePatches[i] = protocol.Patch{Path: p.Path, Value: p.Value} + } + + s.mu.Lock() + defer s.mu.Unlock() + if metadata != nil { + // Defensive copy — same rationale as replayBuffer.push : a caller + // mutating the metadata it just passed in must not race with a + // later Snapshot construction reading s.lastMetadata. + md := *metadata + s.lastMetadata = &md + } + // LSDP/1.1 §18.1.1 — per-scene monotonic seq. All concurrent + // subscribers receive the same delta with the same seq. + seq := s.seq.NextServer() + s.replay.push(seq, wirePatches, cause, metadata) + for sub := range s.subscribers { + s.sendDelta(sub, seq, wirePatches, cause, metadata) + } + return nil +} + +// stampMetadata copies the scene's last known projection metadata (if +// any) onto snap. Caller MUST hold s.mu. No-op when no metadata is +// known yet — omission, never fabrication. +func (s *Scene) stampMetadata(snap *protocol.Snapshot) { + if s.lastMetadata == nil { + return + } + snap.SchemaVersion = s.lastMetadata.SchemaVersion + snap.SceneDigest = s.lastMetadata.SceneDigest + snap.RuntimeInstanceID = s.lastMetadata.RuntimeInstanceID + snap.Target = s.lastMetadata.Target + snap.RenderRevision = s.lastMetadata.RenderRevision + snap.CorrelationID = s.lastMetadata.CorrelationID +} + +// sendDelta enqueues a Delta on a subscription, falling back to a +// fresh Snapshot if the buffer is full (back-pressure protection). +// Caller MUST hold s.mu. +func (s *Scene) sendDelta( + sub *subscription, + seq uint64, + patches []protocol.Patch, + cause *protocol.Cause, + metadata *protocol.ProjectionMetadata, +) { + d := &protocol.Delta{ + Seq: seq, + Patches: patches, + Cause: cause, + SchemaVersion: "", + SceneDigest: "", + RuntimeInstanceID: "", + Target: "", + RenderRevision: "", + CorrelationID: "", + } + if metadata != nil { + d.SchemaVersion = metadata.SchemaVersion + d.SceneDigest = metadata.SceneDigest + d.RuntimeInstanceID = metadata.RuntimeInstanceID + d.Target = metadata.Target + d.RenderRevision = metadata.RenderRevision + d.CorrelationID = metadata.CorrelationID + } + select { + case sub.out <- d: + default: + // Buffer full : drop into snapshot recovery. Under the per-scene + // seq model (§18.1.1), the snapshot ships at the current scene + // seq — the subscriber rebases via ObserveSnapshot and continues + // from there. We do NOT reset the scene seq (other subscribers + // keep advancing fine). + snap := &protocol.Snapshot{ + Seq: s.seq.Current(), + SceneID: s.id, + SceneVersion: s.version, + State: s.store.snapshot(), + } + s.stampMetadata(snap) + // Best-effort send — if even the snapshot can't be enqueued, + // the subscription is dead and the writer goroutine will close. + select { + case sub.out <- snap: + default: + sub.markStale() + } + } +} + +// refreshAll sends a fresh Snapshot to every subscriber. Used after +// a Set() or after a SceneChanged inside the same Scene. +func (s *Scene) refreshAll() error { + s.mu.Lock() + defer s.mu.Unlock() + state := s.store.snapshot() + curSeq := s.seq.Current() + for sub := range s.subscribers { + snap := &protocol.Snapshot{ + Seq: curSeq, + SceneID: s.id, + SceneVersion: s.version, + State: state, + } + s.stampMetadata(snap) + select { + case sub.out <- snap: + default: + sub.markStale() + } + } + return nil +} + +// applyInput is the server-internal entry point for an Input frame. +// It runs the scope check, the declared-input check, the constraint +// check, then commits the patches via Emit. +// +// The second return value is the offending leaf path : LSDP/1 §3.4.1 +// makes `path` REQUIRED on the WRITE_FORBIDDEN, UNKNOWN_PATH and +// INVALID_VALUE error frames, so the rejection site — the only place +// that knows which patch failed — hands it back to the caller. It is +// empty for the codes that carry no path (and on success). +func (s *Scene) applyInput(_ context.Context, id Identity, frame *protocol.Input) (protocol.ErrorCode, string, error) { + if len(frame.Patches) == 0 { + return protocol.CodeInvalidValue, "", errors.New("input: empty patches") + } + + // Pre-validate every patch : either ALL apply or NONE. + for _, p := range frame.Patches { + if !id.CanWrite(p.Path) { + return protocol.CodeWriteForbidden, p.Path, errors.New("write forbidden: " + p.Path) + } + if !s.acceptsInputPath(id.Role, p.Path) { + return protocol.CodeUnknownPath, p.Path, errors.New("unknown path: " + p.Path) + } + if !json.Valid(p.Value) { + return protocol.CodeInvalidValue, p.Path, errors.New("invalid JSON value at " + p.Path) + } + if err := s.checkConstraint(p.Path, p.Value); err != nil { + return protocol.CodeInvalidValue, p.Path, fmt.Errorf("invalid value at %s: %w", p.Path, err) + } + } + + patches := make(map[string]any, len(frame.Patches)) + for _, p := range frame.Patches { + patches[p.Path] = p.Value + } + + // LSDP/1.1 §4.2 + §3.2.3 : when the input carries a client_msg_id, + // echo it verbatim into the resulting delta's cause.input_id so + // optimistic-UI clients can correlate the echo with their predicted + // state. Subject convention is ":" — falling back to + // the role alone when no subject claim is on the token. + var cause *protocol.Cause + if frame.ClientMsgID != "" { + subject := id.Subject + if subject == "" { + subject = string(id.Role) + } + cause = &protocol.Cause{ + Source: string(id.Role) + ":" + subject, + InputID: frame.ClientMsgID, + } + } + if err := s.emitWithCause(patches, cause, nil); err != nil { + return protocol.CodeInternal, "", err + } + return "", "", nil +} + +// acceptsInputPath enforces the per-namespace policy : +// - __inputs.* : if declaredInputs is non-empty, the path MUST be +// listed. +// - __test.* : accepted only on test sessions (Role == test). +// - other reserved namespaces : rejected. +// - non-reserved : rejected (no implicit-creation). +func (s *Scene) acceptsInputPath(role protocol.Role, path string) bool { + p := protocol.LeafPath(path) + if p.HasPrefix("__inputs") { + s.mu.Lock() + defer s.mu.Unlock() + if len(s.declaredInputs) == 0 { + return true + } + _, ok := s.declaredInputs[path] + return ok + } + if p.HasPrefix("__test") { + return role == protocol.RoleTest + } + // __system, __schema, anything else → no client-side writes. + return false +} + +// checkConstraint validates an input value against the InputSpec +// declared for path, if any. Returns nil for paths without a spec +// (e.g. __test.* writes). The check decodes the raw JSON value once +// and matches it against the declared Type / MaxLength / Min / Max / +// Values. +func (s *Scene) checkConstraint(path string, raw json.RawMessage) error { + s.mu.Lock() + spec, ok := s.declaredInputs[path] + s.mu.Unlock() + if !ok || spec.Type == "" { + return nil + } + var v any + if err := json.Unmarshal(raw, &v); err != nil { + return err + } + switch spec.Type { + case "string": + str, ok := v.(string) + if !ok { + return fmt.Errorf("expected string, got %T", v) + } + if spec.MaxLength > 0 && len(str) > spec.MaxLength { + return fmt.Errorf("string length %d exceeds maxLength %d", len(str), spec.MaxLength) + } + case "number": + n, ok := v.(float64) + if !ok { + return fmt.Errorf("expected number, got %T", v) + } + if spec.Min != nil && n < *spec.Min { + return fmt.Errorf("number %v below min %v", n, *spec.Min) + } + if spec.Max != nil && n > *spec.Max { + return fmt.Errorf("number %v above max %v", n, *spec.Max) + } + case "boolean": + if _, ok := v.(bool); !ok { + return fmt.Errorf("expected boolean, got %T", v) + } + case "enum": + str, ok := v.(string) + if !ok { + return fmt.Errorf("expected enum string, got %T", v) + } + for _, allowed := range spec.Values { + if str == allowed { + return nil + } + } + return fmt.Errorf("value %q not in enum domain %v", str, spec.Values) + } + return nil +} + +// subscribeWithResume is the LSDP/1.1 entry point — replaces the old +// per-subscription `subscribe` helper. +// but honours the optional `since_sequence` field (§4.1, §18). When the +// replay buffer covers the gap, the returned `replay` slice contains +// the deltas to ship in lieu of a snapshot. Otherwise the returned +// snapshot carries the current scene seq and `replay` is nil. +// +// The caller MUST send EITHER the snapshot OR the replay deltas — never +// both. snap is non-nil iff replay is nil. +func (s *Scene) subscribeWithResume(buffer int, live, proto11 bool, sinceSequence uint64) (*subscription, *protocol.Snapshot, []replayRecord) { + if buffer < 1 { + buffer = 64 + } + sub := &subscription{ + out: make(chan any, buffer), + live: live, + proto11: proto11, + } + s.mu.Lock() + defer s.mu.Unlock() + s.subscribers[sub] = struct{}{} + curSeq := s.seq.Current() + + // If the client requested resume AND the buffer covers the gap, the + // server SHOULD ship a delta stream from sinceSequence+1 forward + // instead of a fresh snapshot (§18.1.1 + §18.2). + if sinceSequence > 0 && sinceSequence <= curSeq { + if records, covered := s.replay.since(sinceSequence); covered { + return sub, nil, records + } + } + + state := s.store.snapshot() + snap := &protocol.Snapshot{ + Seq: curSeq, + SceneID: s.id, + SceneVersion: s.version, + State: state, + } + s.stampMetadata(snap) + return sub, snap, nil +} + +// unsubscribe detaches a subscriber. Idempotent. +func (s *Scene) unsubscribe(sub *subscription) { + s.mu.Lock() + defer s.mu.Unlock() + if _, ok := s.subscribers[sub]; !ok { + return + } + delete(s.subscribers, sub) + sub.close() +} + +// subscription is the per-WS pipe between a Scene's fan-out goroutine +// and the connection's writer. +// +// live indicates the subscription was opened in live mode (no scene +// field on the Subscribe frame) and therefore follows whatever scene +// is currently active on the server. SetActive migrates these. +type subscription struct { + // out is the per-subscriber outgoing queue. The scene-level seq + // counter is shared across all subscribers (LSDP/1.1 §18.1.1) ; + // subscriptions don't carry their own counter. + out chan any + closed bool + stale bool + live bool + // proto11 is true when the connection negotiated the lsdp.v1.1 + // subprotocol. Gates additive 1.1-only frames (scene_roster) so 1.0 + // subscribers never receive them. + proto11 bool + mu sync.Mutex +} + +func (s *subscription) close() { + s.mu.Lock() + defer s.mu.Unlock() + if s.closed { + return + } + s.closed = true + close(s.out) +} + +func (s *subscription) markStale() { + s.mu.Lock() + defer s.mu.Unlock() + s.stale = true +} + +// IsStale reports whether the subscription was abandoned because the +// fan-out could not deliver even a snapshot. +func (s *subscription) IsStale() bool { + s.mu.Lock() + defer s.mu.Unlock() + return s.stale +} diff --git a/third_party/lumencast-go/server/scene_rejection_test.go b/third_party/lumencast-go/server/scene_rejection_test.go new file mode 100644 index 00000000..db384c7f --- /dev/null +++ b/third_party/lumencast-go/server/scene_rejection_test.go @@ -0,0 +1,56 @@ +package server_test + +import ( + "testing" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// A scene whose backing bundle failed validation serves its rejection +// in place of the snapshot (RFC-0001 : an `x-zab.capture` the server +// refuses must not surface as a healthy, empty scene). +func TestSubscribe_RejectedSceneServesErrorNotSnapshot(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("bad-bundle") + scene.Reject(protocol.CodeInvalidValue, "`x-zab.deviceRef` \"video:0\" MUST be a logical alias") + if err := srv.SetActive("bad-bundle"); err != nil { + t.Fatal(err) + } + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + + frame := recv(t, c) + errFrame, ok := frame.(*protocol.Error) + if !ok { + t.Fatalf("got %T, want *Error", frame) + } + if errFrame.Code != string(protocol.CodeInvalidValue) { + t.Fatalf("got code %q, want INVALID_VALUE", errFrame.Code) + } + if errFrame.Recoverable { + t.Fatal("a rejected bundle is not recoverable") + } + if errFrame.Seq != 1 { + t.Fatalf("got seq %d, want 1", errFrame.Seq) + } +} + +// An unrejected scene keeps serving snapshots — the seam is inert until +// Reject is called. +func TestSubscribe_UnrejectedSceneStillSnapshots(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("good") + if scene.Rejection() != nil { + t.Fatal("fresh scene must carry no rejection") + } + if err := srv.SetActive("good"); err != nil { + t.Fatal(err) + } + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + if _, ok := recv(t, c).(*protocol.Snapshot); !ok { + t.Fatal("want snapshot on a healthy scene") + } +} diff --git a/third_party/lumencast-go/server/scene_replay_test.go b/third_party/lumencast-go/server/scene_replay_test.go new file mode 100644 index 00000000..51822912 --- /dev/null +++ b/third_party/lumencast-go/server/scene_replay_test.go @@ -0,0 +1,171 @@ +package server + +import ( + "sync" + "testing" + + "github.com/Lumencast/lumencast-go/protocol" +) + +func TestSceneSubscribeWithResume_ReturnsReplayMetadata(t *testing.T) { + scene := newScene("main") + if err := scene.Set(map[string]any{"x": 1}); err != nil { + t.Fatal(err) + } + md := &protocol.ProjectionMetadata{ + SchemaVersion: "schema-v1", + SceneDigest: "digest-abc", + RuntimeInstanceID: "runtime-xyz", + Target: "preview", + RenderRevision: "rev-123", + CorrelationID: "corr-456", + } + if err := scene.EmitWithCauseAndMetadata(map[string]any{"x": 2}, &protocol.Cause{Source: "svc"}, md); err != nil { + t.Fatal(err) + } + + // Since sequence 1 should be covered by buffer and replay the last delta. + sub, snap, replay := scene.subscribeWithResume(64, true, true, 1) + if sub == nil { + t.Fatal("expected subscription") + } + if snap != nil { + t.Fatalf("did not expect snapshot when replay is available") + } + if len(replay) != 1 { + t.Fatalf("wanted 1 replay record, got %d", len(replay)) + } + rec := replay[0] + if rec.projectionMetadata == nil { + t.Fatal("replay record metadata should be present") + } + if rec.projectionMetadata.SchemaVersion != "schema-v1" || + rec.projectionMetadata.SceneDigest != "digest-abc" || + rec.projectionMetadata.RuntimeInstanceID != "runtime-xyz" || + rec.projectionMetadata.Target != "preview" || + rec.projectionMetadata.RenderRevision != "rev-123" || + rec.projectionMetadata.CorrelationID != "corr-456" { + t.Fatalf("unexpected replay metadata: %+v", rec.projectionMetadata) + } +} + +func TestSceneBackpressure_MarksSubscriptionStale(t *testing.T) { + scene := newScene("main") + if err := scene.Set(map[string]any{"x": 1}); err != nil { + t.Fatal(err) + } + + // One-slot buffer means the second emission is back-pressured quickly. + sub, snap, records := scene.subscribeWithResume(1, true, true, 0) + if sub == nil || snap == nil || records != nil { + t.Fatal("unexpected subscribe state for first connection without replay") + } + + if err := scene.Emit(map[string]any{"x": 2}); err != nil { + t.Fatal(err) + } + if err := scene.Emit(map[string]any{"x": 3}); err != nil { + t.Fatal(err) + } + + if !sub.IsStale() { + t.Fatal("expected subscription to be marked stale under backpressure") + } +} + +// TestSceneCollapse_SnapshotCarriesLastKnownMetadata forces the real +// collapse path in sendDelta (server/scene.go, the `default:` branch of +// the back-pressure select) under genuine concurrent load, and asserts +// that any Snapshot actually delivered through it carries the scene's +// last known projection metadata. It does not construct a Snapshot by +// hand : it drives the one-slot subscriber buffer to saturation with a +// burst of real Emit calls racing a real draining goroutine, so the +// fallback branch fires for real. +func TestSceneCollapse_SnapshotCarriesLastKnownMetadata(t *testing.T) { + scene := newScene("main") + if err := scene.Set(map[string]any{"x": 1}); err != nil { + t.Fatal(err) + } + + md := &protocol.ProjectionMetadata{ + SchemaVersion: "schema-v1", + SceneDigest: "digest-abc", + RuntimeInstanceID: "runtime-xyz", + Target: "preview", + RenderRevision: "rev-123", + CorrelationID: "corr-456", + } + // Establish the scene's last-known identity via a real metadata + // emit before the subscriber attaches. + if err := scene.EmitWithCauseAndMetadata(map[string]any{"x": 2}, nil, md); err != nil { + t.Fatal(err) + } + + // buffer=1 : the smallest possible window, so ordinary Emit bursts + // saturate it almost immediately. + sub, snap, _ := scene.subscribeWithResume(1, true, true, 0) + if snap == nil { + t.Fatal("expected initial snapshot") + } + if snap.SchemaVersion != "schema-v1" || snap.CorrelationID != "corr-456" { + t.Fatalf("initial snapshot should already carry last known metadata: %+v", snap) + } + + var ( + mu sync.Mutex + snapshots []*protocol.Snapshot + ) + drainDone := make(chan struct{}) + go func() { + defer close(drainDone) + for v := range sub.out { + if s, ok := v.(*protocol.Snapshot); ok { + mu.Lock() + snapshots = append(snapshots, s) + mu.Unlock() + } + } + }() + + // Hammer the scene with metadata-less emits from several goroutines + // while the drain goroutine above races to keep the single-slot + // buffer empty. Under real concurrency this reliably drives + // sendDelta into its `default:` collapse branch many times, and + // occasionally frees a slot between the delta send attempt and the + // snapshot fallback send — the exact race the production code is + // built to tolerate. + const goroutines = 8 + const roundsPerGoroutine = 4000 + var wg sync.WaitGroup + wg.Add(goroutines) + for g := 0; g < goroutines; g++ { + go func(g int) { + defer wg.Done() + for i := 0; i < roundsPerGoroutine; i++ { + if err := scene.Emit(map[string]any{"x": g*roundsPerGoroutine + i}); err != nil { + t.Error(err) + return + } + } + }(g) + } + wg.Wait() + scene.unsubscribe(sub) + <-drainDone + + mu.Lock() + defer mu.Unlock() + if len(snapshots) == 0 { + t.Fatal("collapse path never delivered a snapshot through sub.out — buffer never saturated under load") + } + for _, s := range snapshots { + if s.SchemaVersion != "schema-v1" || + s.SceneDigest != "digest-abc" || + s.RuntimeInstanceID != "runtime-xyz" || + s.Target != "preview" || + s.RenderRevision != "rev-123" || + s.CorrelationID != "corr-456" { + t.Fatalf("collapsed snapshot missing/incorrect projection metadata: %+v", s) + } + } +} diff --git a/third_party/lumencast-go/server/server.go b/third_party/lumencast-go/server/server.go new file mode 100644 index 00000000..6ba18726 --- /dev/null +++ b/third_party/lumencast-go/server/server.go @@ -0,0 +1,490 @@ +package server + +import ( + "context" + "errors" + "fmt" + "log/slog" + "net/http" + "sync" + "time" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// Config configures a Server. The zero value is not usable ; ListenAddr +// and Auth are required. +type Config struct { + // ListenAddr is the TCP address Run() binds to. Use ":0" in tests + // to get an OS-assigned port (then read it via Server.Addr()). + ListenAddr string + + // Auth is the credential validator called on every WebSocket + // subscribe frame. The kit ships StaticTokens for development. + // + // REQUIRED unless IdentityFromRequest is set : New rejects a Config + // where both Auth and IdentityFromRequest are nil. + Auth Authenticator + + // IdentityFromRequest is the optional header-trust seam (ADR 007 + // §C.3a). When non-nil, the server derives the connection's Identity + // from the upgrade *http.Request — typically a header injected by a + // trusted front-proxy — and IGNORES the Subscribe frame's token. + // When nil, the server falls back to the Auth token path. + // + // Additive and non-breaking : leaving this nil preserves the exact + // token-authentication behaviour. If both Auth and IdentityFromRequest + // are set, IdentityFromRequest takes precedence. + IdentityFromRequest RequestIdentityFunc + + // Logger receives structured server events. Defaults to + // slog.Default() if nil. + Logger *slog.Logger + + // PingInterval is the server-initiated ping cadence. Defaults to + // 30 s, matching the LSDP/1 § 12 SHOULD. + PingInterval time.Duration + + // SubscribeTimeout is how long the server waits for the first + // Subscribe frame before closing the WS. Defaults to 30 s. + SubscribeTimeout time.Duration + + // MaxFrameBytes is the largest text frame the server accepts. + // Defaults to 64 KiB per LSDP/1 § 14.3. + MaxFrameBytes int64 + + // HTTPHandler, if non-nil, is mounted at root for non-LSDP + // traffic (static assets, /healthz, ...). LSDP routes are mounted + // in front of it. Use Server.Mux() to compose. + HTTPHandler http.Handler +} + +// Server is the LSDP/1 server kit. It owns a set of Scenes and a +// WebSocket handler. Construct with New and run with Run. +type Server struct { + cfg Config + logger *slog.Logger + + mu sync.RWMutex + scenes map[string]*Scene + active string // id of the currently-active scene for the live endpoint + + // rosterMu guards the cached show roster (scene_roster frame). Kept + // separate from mu so a roster fan-out never contends with scene + // registration / SetActive. + rosterMu sync.RWMutex + roster []protocol.RosterEntry + rosterSet bool + + // overlayMu guards the cached show-level overlay-app control state + // (overlay_apps frame). Like the roster it is show metadata, fanned out + // to every live 1.1 subscriber and replayed on join — including the + // holding subscribers below, so it reaches a consumer with no active + // scene. + overlayMu sync.RWMutex + overlay map[string]protocol.OverlayAppState + overlaySet bool + + // holding carries live subscribers that connected while NO scene was + // active (an empty show). They receive show-level frames (roster, + // overlay_apps) but no scene state; when a scene first becomes active + // they are migrated onto it (migrateLive) with a fresh snapshot. Created + // once in New and never registered in scenes, so it never appears in the + // roster nor as the active scene. + holding *Scene + + httpSrv *http.Server + addr string +} + +// New constructs a Server. Returns an error if Config is incomplete. +func New(cfg Config) (*Server, error) { + if cfg.ListenAddr == "" { + return nil, errors.New("server: Config.ListenAddr is required") + } + if cfg.Auth == nil && cfg.IdentityFromRequest == nil { + return nil, errors.New("server: Config.Auth or Config.IdentityFromRequest is required") + } + if cfg.Logger == nil { + cfg.Logger = slog.Default() + } + if cfg.PingInterval == 0 { + cfg.PingInterval = 30 * time.Second + } + if cfg.SubscribeTimeout == 0 { + cfg.SubscribeTimeout = 30 * time.Second + } + if cfg.MaxFrameBytes == 0 { + cfg.MaxFrameBytes = 64 * 1024 + } + return &Server{ + cfg: cfg, + logger: cfg.Logger, + scenes: make(map[string]*Scene), + holding: newScene(holdingSceneID), + }, nil +} + +// holdingSceneID is the sentinel id of the internal holding scene a live +// subscriber attaches to while the show has no active scene. It is never a +// registered scene, so it appears in no roster and is never the active scene. +const holdingSceneID = "__holding" + +// NewScene registers a new Scene under the given id and returns a +// handle. Reusing an id replaces the previous Scene atomically and +// triggers a SceneChanged on the live endpoint. +func (s *Server) NewScene(id string, opts ...SceneOption) *Scene { + scene := newScene(id, opts...) + s.mu.Lock() + prev := s.scenes[id] + s.scenes[id] = scene + justActivated := false + if s.active == "" { + s.active = id + justActivated = true + } + s.mu.Unlock() + // First scene to go active: adopt any subscribers that were holding while + // the show was empty, so a scene-less join transitions onto the real scene. + if justActivated { + migrateLive(s.holding, scene) + } + if prev != nil { + // Best-effort : detach old subscribers. They'll reconnect + // against the new scene through the live endpoint. + prev.mu.Lock() + for sub := range prev.subscribers { + sub.close() + } + prev.subscribers = nil + prev.mu.Unlock() + } + return scene +} + +// Scene looks up a registered scene by id. +func (s *Server) Scene(id string) (*Scene, bool) { + s.mu.RLock() + defer s.mu.RUnlock() + sc, ok := s.scenes[id] + return sc, ok +} + +// SetActive changes which scene the live endpoint serves. Live +// subscribers attached to the previous active scene receive a +// SceneChanged frame followed by a fresh Snapshot at seq=1 on the new +// scene. Idempotent : setting the already-active scene is a no-op. +// Returns ErrSceneNotFound if id is unknown. +func (s *Server) SetActive(id string) error { + s.mu.Lock() + scene, ok := s.scenes[id] + if !ok { + s.mu.Unlock() + return ErrSceneNotFound + } + if s.active == id { + s.mu.Unlock() + return nil + } + wasEmpty := s.active == "" + prev := s.scenes[s.active] + s.active = id + s.mu.Unlock() + + // Activating from an empty show: adopt the holding subscribers. + if wasEmpty { + migrateLive(s.holding, scene) + } + if prev != nil && prev != scene { + migrateLive(prev, scene) + } + return nil +} + +// SetRoster caches the show's scene roster and fans a scene_roster +// frame out to every live subscriber that negotiated lsdp.v1.1. The +// cached roster is also replayed to each new subscriber right after its +// initial snapshot (see serveLSDP). Passing an empty (or nil) slice is +// valid — it advertises a show with no scenes as `entries: []`. +// +// Additive and idempotent from the caller's side : call it whenever the +// set of scenes or their versions changes. +func (s *Server) SetRoster(entries []protocol.RosterEntry) { + cloned := make([]protocol.RosterEntry, len(entries)) + copy(cloned, entries) + + s.rosterMu.Lock() + s.roster = cloned + s.rosterSet = true + s.rosterMu.Unlock() + + frame := &protocol.SceneRoster{ + Entries: cloned, + TS: time.Now().UTC().Format(time.RFC3339), + } + + s.fanoutShowFrame(frame) +} + +// allFanoutScenes returns every registered scene plus the holding scene — the +// full set a show-level frame (roster, overlay_apps) fans out to. Including +// holding is what reaches the subscribers that connected with no active scene. +func (s *Server) allFanoutScenes() []*Scene { + s.mu.RLock() + scenes := make([]*Scene, 0, len(s.scenes)+1) + for _, sc := range s.scenes { + scenes = append(scenes, sc) + } + s.mu.RUnlock() + return append(scenes, s.holding) +} + +// fanoutShowFrame sends a show-level metadata frame to every live 1.1 +// subscriber (across all scenes plus holding). Back-pressured subscribers are +// marked stale, exactly as delta fan-out does. Used for both scene_roster and +// overlay_apps. +func (s *Server) fanoutShowFrame(frame any) { + for _, sc := range s.allFanoutScenes() { + sc.mu.Lock() + for sub := range sc.subscribers { + if !sub.live || !sub.proto11 { + continue + } + select { + case sub.out <- frame: + default: + sub.markStale() + } + } + sc.mu.Unlock() + } +} + +// SetOverlayApps caches the show's complete overlay-app control state and fans +// an overlay_apps frame out to every live 1.1 subscriber — the overlay analogue +// of SetRoster. The full state (not a delta) is cached and replayed to each new +// subscriber after its snapshot (serveLSDP), INCLUDING a subscriber attached to +// the holding scene, so the state is deliverable with no active scene. Passing +// an empty (or nil) map is valid — it advertises a show with no overlay apps as +// `apps: {}`. Additive and idempotent: call it whenever the overlay-app set or +// any app's state changes. +func (s *Server) SetOverlayApps(apps map[string]protocol.OverlayAppState) { + cloned := make(map[string]protocol.OverlayAppState, len(apps)) + for k, v := range apps { + cloned[k] = v + } + + s.overlayMu.Lock() + s.overlay = cloned + s.overlaySet = true + s.overlayMu.Unlock() + + s.fanoutShowFrame(&protocol.OverlayApps{ + Apps: cloned, + TS: time.Now().UTC().Format(time.RFC3339), + }) +} + +// overlayAppsFrame returns the cached overlay-app state as a ready-to-send +// frame and whether SetOverlayApps has ever been called. Used to replay the +// state to a freshly-subscribed 1.1 live connection. +func (s *Server) overlayAppsFrame() (*protocol.OverlayApps, bool) { + s.overlayMu.RLock() + defer s.overlayMu.RUnlock() + if !s.overlaySet { + return nil, false + } + return &protocol.OverlayApps{ + Apps: s.overlay, + TS: time.Now().UTC().Format(time.RFC3339), + }, true +} + +// rosterFrame returns the cached roster as a ready-to-send frame and +// whether a roster has ever been set. Used to replay the roster to a +// freshly-subscribed 1.1 live connection. +func (s *Server) rosterFrame() (*protocol.SceneRoster, bool) { + s.rosterMu.RLock() + defer s.rosterMu.RUnlock() + if !s.rosterSet { + return nil, false + } + return &protocol.SceneRoster{ + Entries: s.roster, + TS: time.Now().UTC().Format(time.RFC3339), + }, true +} + +// detach removes a subscription from whichever scene currently owns +// it. Used as the deferred cleanup in the WS handler so a migration +// during SetActive does not leak. +func (s *Server) detach(sub *subscription) { + // Includes the holding scene, so a subscriber that connected with no + // active scene (and was never migrated) is cleaned up too. + for _, sc := range s.allFanoutScenes() { + sc.unsubscribe(sub) + } +} + +// migrateLive moves every live subscription from prev to next. It +// emits SceneChanged on prev (with prev's seq advancing one final +// step), then a fresh Snapshot at next's current seq (typically 1 +// for a freshly-created scene). Per LSDP/1.1 §18.1.1, the scene's +// seq counter is independent across scenes. +func migrateLive(prev, next *Scene) { + prev.mu.Lock() + live := make([]*subscription, 0, len(prev.subscribers)) + for sub := range prev.subscribers { + if sub.live { + live = append(live, sub) + } + } + for _, sub := range live { + delete(prev.subscribers, sub) + } + // Advance prev's seq one last time for the SceneChanged frame — + // SceneChanged is the prev scene's final wire emission. + prevSeq := prev.seq.NextServer() + prev.mu.Unlock() + + if len(live) == 0 { + return + } + + next.mu.Lock() + state := next.store.snapshot() + nextSeq := next.seq.Current() + for _, sub := range live { + sc := &protocol.SceneChanged{ + Seq: prevSeq, + SceneID: next.id, + SceneVersion: next.version, + } + select { + case sub.out <- sc: + default: + sub.markStale() + continue + } + snap := &protocol.Snapshot{ + Seq: nextSeq, + SceneID: next.id, + SceneVersion: next.version, + State: state, + } + next.stampMetadata(snap) + select { + case sub.out <- snap: + default: + sub.markStale() + continue + } + next.subscribers[sub] = struct{}{} + } + next.mu.Unlock() +} + +// ActiveScene returns the live scene, or nil if none is registered. +func (s *Server) ActiveScene() *Scene { + s.mu.RLock() + defer s.mu.RUnlock() + if s.active == "" { + return nil + } + return s.scenes[s.active] +} + +// ErrSceneNotFound is returned by SetActive and Scene when the id is +// unknown. +var ErrSceneNotFound = errors.New("server: scene not found") + +// Reset drops every registered scene and clears active state. In-flight +// subscribers are detached. Intended for test harnesses (interop +// control plane) — not for production use. +func (s *Server) Reset() { + s.mu.Lock() + scenes := s.scenes + s.scenes = make(map[string]*Scene) + s.active = "" + s.mu.Unlock() + for _, sc := range scenes { + sc.mu.Lock() + for sub := range sc.subscribers { + sub.close() + } + sc.subscribers = nil + sc.mu.Unlock() + } +} + +// Mux returns a configured http.ServeMux exposing : +// +// - /lsdp.v1 — LSDP/1 WebSocket subscribe endpoint +// - /scenes/{id} — per-scene scope (test mode + static) +// - /healthz — simple liveness probe +// - the user-supplied Config.HTTPHandler at root (lowest priority) +// +// The mux is regenerated on each call ; do not modify the returned +// instance after Server.Run is called. +func (s *Server) Mux() *http.ServeMux { + mux := http.NewServeMux() + mux.HandleFunc("/lsdp.v1", s.serveLSDP) + mux.HandleFunc("/healthz", s.serveHealth) + if s.cfg.HTTPHandler != nil { + mux.Handle("/", s.cfg.HTTPHandler) + } + return mux +} + +// Addr returns the bound address after Run() has started, or empty +// before that. Useful in tests with ListenAddr ":0". +func (s *Server) Addr() string { + s.mu.RLock() + defer s.mu.RUnlock() + return s.addr +} + +// Run binds and serves until ctx is cancelled. The returned error is +// non-nil only on listener / Serve failure ; clean shutdown via +// ctx.Done returns nil. +func (s *Server) Run(ctx context.Context) error { + mux := s.Mux() + srv := &http.Server{ + Addr: s.cfg.ListenAddr, + Handler: mux, + ReadHeaderTimeout: 5 * time.Second, + } + listener, err := netListen("tcp", s.cfg.ListenAddr) + if err != nil { + return fmt.Errorf("server: listen: %w", err) + } + + s.mu.Lock() + s.httpSrv = srv + s.addr = listener.Addr().String() + s.mu.Unlock() + + errCh := make(chan error, 1) + go func() { + errCh <- srv.Serve(listener) + }() + + select { + case <-ctx.Done(): + shutCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + _ = srv.Shutdown(shutCtx) + return nil + case err := <-errCh: + if errors.Is(err, http.ErrServerClosed) { + return nil + } + return err + } +} + +func (s *Server) serveHealth(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("ok\n")) +} diff --git a/third_party/lumencast-go/server/server_test.go b/third_party/lumencast-go/server/server_test.go new file mode 100644 index 00000000..9461664e --- /dev/null +++ b/third_party/lumencast-go/server/server_test.go @@ -0,0 +1,682 @@ +package server_test + +import ( + "bytes" + "context" + "encoding/json" + "net/http" + "strings" + "testing" + "time" + + "github.com/coder/websocket" + + "github.com/Lumencast/lumencast-go/protocol" + "github.com/Lumencast/lumencast-go/server" +) + +// startTestServer launches a Server bound to an ephemeral port and +// returns its base WebSocket URL plus a tear-down func. +func startTestServer(t *testing.T, auth server.Authenticator) (*server.Server, string) { + t.Helper() + srv, err := server.New(server.Config{ + ListenAddr: "127.0.0.1:0", + Auth: auth, + PingInterval: 5 * time.Second, + SubscribeTimeout: 2 * time.Second, + }) + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + done := make(chan struct{}) + go func() { + _ = srv.Run(ctx) + close(done) + }() + t.Cleanup(func() { + cancel() + select { + case <-done: + case <-time.After(3 * time.Second): + } + }) + // Wait for Addr() to populate. + deadline := time.Now().Add(2 * time.Second) + for srv.Addr() == "" { + if time.Now().After(deadline) { + t.Fatal("server never reported Addr()") + } + time.Sleep(5 * time.Millisecond) + } + return srv, "ws://" + srv.Addr() + "/lsdp.v1" +} + +func dial(t *testing.T, url string) *websocket.Conn { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + c, _, err := websocket.Dial(ctx, url, &websocket.DialOptions{ + Subprotocols: []string{protocol.SubProtocol}, + HTTPClient: &http.Client{Timeout: 2 * time.Second}, + }) + if err != nil { + t.Fatalf("dial: %v", err) + } + t.Cleanup(func() { _ = c.Close(websocket.StatusNormalClosure, "") }) + return c +} + +func send(t *testing.T, c *websocket.Conn, msg any) { + t.Helper() + raw, err := protocol.Encode(msg) + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + if err := c.Write(ctx, websocket.MessageText, raw); err != nil { + t.Fatal(err) + } +} + +func recv(t *testing.T, c *websocket.Conn) any { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + _, raw, err := c.Read(ctx) + if err != nil { + t.Fatal(err) + } + msg, err := protocol.DecodeServer(raw) + if err != nil { + t.Fatalf("decode %q: %v", raw, err) + } + return msg +} + +// recvRaw returns the next frame's bytes verbatim — needed when the +// assertion is about field PRESENCE, which decoding into a struct with +// omitempty would erase. +func recvRaw(t *testing.T, c *websocket.Conn) []byte { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + _, raw, err := c.Read(ctx) + if err != nil { + t.Fatal(err) + } + return raw +} + +func opAuth() server.Authenticator { + return server.NewStaticTokens(map[string]server.Identity{ + "op-tok": {Subject: "op", Role: protocol.RoleOperator}, + "viewer-tok": {Subject: "v", Role: protocol.RoleViewer}, + "svc-tok": {Subject: "svc", Role: protocol.RoleService, Paths: []string{"__inputs.score.*"}}, + }) +} + +func TestSubscribe_LiveFlow(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + if err := scene.Set(map[string]any{"show.title": "Hello"}); err != nil { + t.Fatal(err) + } + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + + snap, ok := recv(t, c).(*protocol.Snapshot) + if !ok { + t.Fatalf("first frame is not snapshot") + } + if snap.Seq != 1 || snap.SceneID != "main" { + t.Fatalf("unexpected snapshot: %+v", snap) + } + var title string + _ = json.Unmarshal(snap.State["show.title"], &title) + if title != "Hello" { + t.Fatalf("snapshot state missing title") + } +} + +func TestSubscribe_RejectsUnknownToken(t *testing.T) { + _, url := startTestServer(t, opAuth()) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "nope"}) + frame := recv(t, c) + errFrame, ok := frame.(*protocol.Error) + if !ok { + t.Fatalf("got %T, want *Error", frame) + } + if errFrame.Code != string(protocol.CodeAuthDenied) { + t.Fatalf("got code %q", errFrame.Code) + } +} + +func TestInput_OperatorWritesInputs(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + _ = recv(t, c) // discard snapshot + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{ + {Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}, + }, + }) + d, ok := recv(t, c).(*protocol.Delta) + if !ok { + t.Fatalf("expected delta echo") + } + if len(d.Patches) != 1 || d.Patches[0].Path != "__inputs.title" { + t.Fatalf("unexpected delta: %+v", d) + } +} + +func TestInput_ClientMsgIDEchoedInCause(t *testing.T) { + // LSDP/1.1 §4.2 + §3.2.3 — Input.client_msg_id MUST be echoed + // verbatim in Cause.input_id of the resulting Delta. + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + _ = recv(t, c) // discard snapshot + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{ + {Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}, + }, + ClientMsgID: "ui-9f3a", + }) + d, ok := recv(t, c).(*protocol.Delta) + if !ok { + t.Fatalf("expected delta echo") + } + if d.Cause == nil { + t.Fatalf("expected delta.cause to be set") + } + if d.Cause.InputID != "ui-9f3a" { + t.Fatalf("delta.cause.input_id mismatch: got %q", d.Cause.InputID) + } + if d.Cause.Source == "" { + t.Fatalf("delta.cause.source must be non-empty") + } +} + +func TestSubscribeWithSinceSequence_Resumes(t *testing.T) { + // LSDP/1.1 §4.1, §18 — subscribe with since_sequence covered by + // the replay buffer ships a delta stream from since_sequence+1 + // forward instead of a fresh snapshot. + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + // First subscriber : observes snapshot(seq=1) and delta(seq=2). + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + snap, ok := recv(t, c).(*protocol.Snapshot) + if !ok { + t.Fatalf("expected snapshot") + } + if snap.Seq != 1 { + t.Fatalf("first snapshot seq: got %d want 1", snap.Seq) + } + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{{Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}}, + }) + d, ok := recv(t, c).(*protocol.Delta) + if !ok || d.Seq != 2 { + t.Fatalf("expected delta seq=2, got %+v", d) + } + _ = c.CloseNow() + + // Second connection with since_sequence=1 should receive delta(seq=2) + // (the one buffered) instead of a fresh snapshot. + c2 := dial(t, url) + send(t, c2, &protocol.Subscribe{Token: "op-tok", SinceSequence: 1}) + frame := recv(t, c2) + d2, ok := frame.(*protocol.Delta) + if !ok { + t.Fatalf("expected delta on resume, got %T", frame) + } + if d2.Seq != 2 { + t.Fatalf("resume delta seq: got %d want 2", d2.Seq) + } +} + +func TestSubscribeWithSinceSequence_ResumesWithProjectionMetadata(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + md := &protocol.ProjectionMetadata{ + SchemaVersion: "schema-v1", + SceneDigest: "scene-abc", + RuntimeInstanceID: "runtime-xyz", + Target: "projection-target", + RenderRevision: "rev-123", + CorrelationID: "corr-456", + } + if err := scene.EmitWithCauseAndMetadata( + map[string]any{"__inputs.title": "hi"}, + &protocol.Cause{Source: "svc"}, + md, + ); err != nil { + t.Fatal(err) + } + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok", SinceSequence: 1}) + msg := recv(t, c) + delta, ok := msg.(*protocol.Delta) + if !ok { + t.Fatalf("expected delta on resume, got %T", msg) + } + if delta.Seq != 2 { + t.Fatalf("resume delta seq: got %d want 2", delta.Seq) + } + if delta.SchemaVersion != "schema-v1" || + delta.SceneDigest != "scene-abc" || + delta.RuntimeInstanceID != "runtime-xyz" || + delta.Target != "projection-target" || + delta.RenderRevision != "rev-123" || + delta.CorrelationID != "corr-456" { + t.Fatalf("projection metadata missing on resume delta: %+v", delta) + } + if delta.Cause == nil || delta.Cause.Source != "svc" { + t.Fatalf("expected cause with source, got %+v", delta.Cause) + } +} + +func TestSubscribeWithSinceSequence_FallsBackToSnapshot(t *testing.T) { + // When the replay buffer doesn't cover the requested resume point, + // the server MUST fall back to a fresh snapshot (§18.1). + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok", SinceSequence: 999999}) + snap, ok := recv(t, c).(*protocol.Snapshot) + if !ok { + t.Fatalf("expected snapshot fallback, got %T", snap) + } + if snap.Seq < 1 { + t.Fatalf("snapshot seq must be >= 1, got %d", snap.Seq) + } +} + +func TestInput_NoClientMsgID_OmitsCause(t *testing.T) { + // Backward compatibility — when the client doesn't supply + // client_msg_id, the resulting delta must NOT carry a cause field. + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + _ = recv(t, c) + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{ + {Path: "__inputs.title", Value: json.RawMessage(`"hi"`)}, + }, + }) + d := recv(t, c).(*protocol.Delta) + if d.Cause != nil { + t.Fatalf("expected no cause when client_msg_id is empty, got %+v", d.Cause) + } +} + +func TestInput_ViewerForbidden(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + _ = scene.Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) // snapshot + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{{Path: "__inputs.title", Value: json.RawMessage(`"x"`)}}, + }) + frame := recv(t, c) + e, ok := frame.(*protocol.Error) + if !ok { + t.Fatalf("got %T, want *Error", frame) + } + if e.Code != string(protocol.CodeWriteForbidden) { + t.Fatalf("code %q", e.Code) + } + // LSDP/1 §3.4.1 — path is REQUIRED on WRITE_FORBIDDEN. + if e.Path != "__inputs.title" { + t.Fatalf("path %q, want __inputs.title", e.Path) + } +} + +func TestInput_UnknownPathRejected(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithDeclaredInputs([]string{"__inputs.title"})) + _ = scene.Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + _ = recv(t, c) + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{{Path: "__inputs.unknown", Value: json.RawMessage(`1`)}}, + }) + e := recv(t, c).(*protocol.Error) + if e.Code != string(protocol.CodeUnknownPath) { + t.Fatalf("code %q", e.Code) + } + // LSDP/1 §3.4.1 — path is REQUIRED on UNKNOWN_PATH, and names the + // undeclared path the input referenced (not the declared one). + if e.Path != "__inputs.unknown" { + t.Fatalf("path %q, want __inputs.unknown", e.Path) + } +} + +func TestInput_InvalidValueCarriesPath(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main", server.WithOperatorInputs([]server.InputSpec{ + {Path: "__inputs.title", Type: "string", MaxLength: 5}, + })) + _ = scene.Set(map[string]any{"__inputs.title": ""}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "op-tok"}) + _ = recv(t, c) + + send(t, c, &protocol.Input{ + Patches: []protocol.Patch{ + {Path: "__inputs.title", Value: json.RawMessage(`"way too long"`)}, + }, + }) + e := recv(t, c).(*protocol.Error) + if e.Code != string(protocol.CodeInvalidValue) { + t.Fatalf("code %q", e.Code) + } + // LSDP/1 §3.4.1 — path is REQUIRED on INVALID_VALUE. + if e.Path != "__inputs.title" { + t.Fatalf("path %q, want __inputs.title", e.Path) + } +} + +func TestError_NonPathScopedCodeOmitsPath(t *testing.T) { + // §3.4.1 closes the extra-field set per code : an emitter MUST NOT + // carry `path` on a code that does not declare it. + srv, url := startTestServer(t, opAuth()) + srv.NewScene("main") + _ = srv.ActiveScene().Set(map[string]any{"x": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "bad-tok"}) + raw := recvRaw(t, c) + if bytes.Contains(raw, []byte(`"path"`)) { + t.Fatalf("AUTH_DENIED error frame carries a path field: %s", raw) + } +} + +func TestPing_GetsPong(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + srv.NewScene("main") + _ = srv.ActiveScene().Set(map[string]any{"a": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) + + send(t, c, &protocol.Ping{}) + frame := recv(t, c) + if _, ok := frame.(*protocol.Pong); !ok { + t.Fatalf("got %T, want *Pong", frame) + } +} + +func TestSubscribe_RequiresLSDPSubprotocol(t *testing.T) { + srv, _ := startTestServer(t, opAuth()) + srv.NewScene("main") + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + wsURL := "ws://" + srv.Addr() + "/lsdp.v1" + c, _, err := websocket.Dial(ctx, wsURL, &websocket.DialOptions{ + Subprotocols: []string{"not-lsdp"}, + }) + if err != nil { + // Server-side outright rejection is also acceptable. + return + } + defer c.Close(websocket.StatusNormalClosure, "") + // Server selected no common subprotocol → empty string. coder/websocket + // reports "" rather than an explicit failure. + if got := c.Subprotocol(); got == protocol.SubProtocol { + t.Fatalf("server accepted non-LSDP subprotocol: %q", got) + } + // Server should close the connection promptly. + readCtx, cancelRead := context.WithTimeout(context.Background(), 1*time.Second) + defer cancelRead() + if _, _, err := c.Read(readCtx); err == nil { + t.Fatalf("expected read failure after wrong subprotocol") + } +} + +func TestStaticTokens_Authenticator(t *testing.T) { + tok := server.NewStaticTokens(map[string]server.Identity{ + "a": {Subject: "alice", Role: protocol.RoleOperator}, + }) + id, err := tok.Authenticate(context.Background(), "a") + if err != nil || id.Role != protocol.RoleOperator { + t.Fatalf("unexpected: %+v %v", id, err) + } + if _, err := tok.Authenticate(context.Background(), "missing"); err == nil { + t.Fatal("missing token should fail") + } +} + +func TestIdentity_CanWrite(t *testing.T) { + op := server.Identity{Role: protocol.RoleOperator} + if !op.CanWrite("__inputs.x") { + t.Fail() + } + if op.CanWrite("__test.x") { + t.Fail() + } + + svc := server.Identity{Role: protocol.RoleService, Paths: []string{"__inputs.score.*"}} + if !svc.CanWrite("__inputs.score.alice") { + t.Fail() + } + if svc.CanWrite("__inputs.title") { + t.Fail() + } + + tst := server.Identity{Role: protocol.RoleTest} + if !tst.CanWrite("__test.foo") { + t.Fail() + } + if tst.CanWrite("__inputs.x") { + t.Fail() + } + + v := server.Identity{Role: protocol.RoleViewer} + if v.CanWrite("__inputs.x") { + t.Fail() + } +} + +func TestStoreEncodesValues(t *testing.T) { + srv, _ := startTestServer(t, opAuth()) + scene := srv.NewScene("s") + if err := scene.Set(map[string]any{"a": 1, "b": "two", "c": []int{1, 2}}); err != nil { + t.Fatal(err) + } + // Ensure invalid raw rejected. + if err := scene.Set(map[string]any{"x": json.RawMessage("not json")}); err == nil { + t.Fatal("invalid raw must error") + } +} + +func TestSceneRefreshOnSet(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + _ = scene.Set(map[string]any{"v": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) // initial snapshot + + // Subsequent Set fans out a fresh snapshot. + if err := scene.Set(map[string]any{"v": 2}); err != nil { + t.Fatal(err) + } + frame := recv(t, c) + snap, ok := frame.(*protocol.Snapshot) + if !ok { + t.Fatalf("got %T, want *Snapshot after Set", frame) + } + if snap.Seq != 1 { + t.Fatalf("snapshot seq must reset to 1, got %d", snap.Seq) + } +} + +func TestSetActive_EmitsSceneChangedToLiveSubs(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + + a := srv.NewScene("a", server.WithSceneVersion("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) + _ = a.Set(map[string]any{"v": "from-a"}) + b := srv.NewScene("b", server.WithSceneVersion("sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")) + _ = b.Set(map[string]any{"v": "from-b"}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) // live mode (no scene field) + snap := recv(t, c).(*protocol.Snapshot) + if snap.SceneID != "a" { + t.Fatalf("first snapshot should be from a, got %s", snap.SceneID) + } + + if err := srv.SetActive("b"); err != nil { + t.Fatal(err) + } + + // Live subscriber should observe SceneChanged then Snapshot at seq=1. + change := recv(t, c) + sc, ok := change.(*protocol.SceneChanged) + if !ok { + t.Fatalf("got %T, want *SceneChanged", change) + } + if sc.SceneID != "b" { + t.Fatalf("scene_changed.scene_id = %s, want b", sc.SceneID) + } + next := recv(t, c) + snap2, ok := next.(*protocol.Snapshot) + if !ok { + t.Fatalf("after scene_changed got %T, want *Snapshot", next) + } + if snap2.Seq != 1 { + t.Fatalf("snapshot seq after scene_changed = %d, want 1", snap2.Seq) + } + if snap2.SceneID != "b" { + t.Fatalf("snapshot scene_id = %s, want b", snap2.SceneID) + } + var v string + _ = json.Unmarshal(snap2.State["v"], &v) + if v != "from-b" { + t.Fatalf("snapshot state v = %q, want from-b", v) + } +} + +func TestSetActive_NoOpForSameScene(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + srv.NewScene("a") + _ = srv.ActiveScene().Set(map[string]any{"v": 1}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) // initial snapshot + + if err := srv.SetActive("a"); err != nil { + t.Fatal(err) + } + + // No frame should arrive in the next ~150 ms. + ctx, cancel := context.WithTimeout(context.Background(), 150*time.Millisecond) + defer cancel() + _, _, err := c.Read(ctx) + if err == nil { + t.Fatal("unexpected frame after no-op SetActive") + } +} + +func TestEmitFanOut(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + _ = scene.Set(map[string]any{"v": 0}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) // snap + if err := scene.Emit(map[string]any{"v": 5}); err != nil { + t.Fatal(err) + } + d := recv(t, c).(*protocol.Delta) + if d.Seq != 2 { + t.Fatalf("delta seq = %d, want 2", d.Seq) + } + if !strings.Contains(string(d.Patches[0].Value), "5") { + t.Fatalf("patch missing value 5") + } +} + +// TestEmitPatchesSortedByPath guards the determinism fix : a multi-patch +// Emit must produce Delta.Patches in stable lexicographic leaf-path +// order, regardless of the input map's (randomised) iteration order. +// Without the sort in store.applyPatches the order varied run to run, +// which made the subscribe-snapshot-delta conformance scenario flaky. +func TestEmitPatchesSortedByPath(t *testing.T) { + srv, url := startTestServer(t, opAuth()) + scene := srv.NewScene("main") + _ = scene.Set(map[string]any{"alpha": 0, "mid": 0, "zeta": 0}) + + c := dial(t, url) + send(t, c, &protocol.Subscribe{Token: "viewer-tok"}) + _ = recv(t, c) // snapshot + + // Emit several leaves in one frame. Map iteration order is + // randomised by Go, so a single run is enough to catch a regression + // on average, but assert the full order to be explicit. + if err := scene.Emit(map[string]any{ + "zeta": 1, + "alpha": 1, + "mid": 1, + }); err != nil { + t.Fatal(err) + } + d, ok := recv(t, c).(*protocol.Delta) + if !ok { + t.Fatalf("expected *Delta") + } + got := make([]string, len(d.Patches)) + for i, p := range d.Patches { + got[i] = p.Path + } + want := []string{"alpha", "mid", "zeta"} + if len(got) != len(want) { + t.Fatalf("got %d patches, want %d: %v", len(got), len(want), got) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("patch order = %v, want %v (must be lexicographic by path)", got, want) + } + } +} diff --git a/third_party/lumencast-go/server/static.go b/third_party/lumencast-go/server/static.go new file mode 100644 index 00000000..3b6e738e --- /dev/null +++ b/third_party/lumencast-go/server/static.go @@ -0,0 +1,64 @@ +package server + +import ( + "net/http" + "path" + "strings" +) + +// StaticBundles returns an http.Handler that serves LSML scene +// bundles from a directory layout : +// +// root/ +// / +// / +// scene.json +// assets/... +// +// The handler enforces : +// - immutable cache headers when the URL contains a sha256 segment, +// - 404 on traversal attempts, +// - 415 on requests that don't match the layout. +// +// Use as Config.HTTPHandler when you want the kit to also serve the +// bundle the runtime fetches by scene_version. +func StaticBundles(root string) http.Handler { + fs := http.FileServer(http.Dir(root)) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + clean := path.Clean(r.URL.Path) + if strings.Contains(clean, "..") { + http.NotFound(w, r) + return + } + // Cache immutability on hashed URLs (anything matching + // ///...). + if isHashedPath(clean) { + w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") + } else { + w.Header().Set("Cache-Control", "no-cache") + } + fs.ServeHTTP(w, r) + }) +} + +// isHashedPath matches ///... where sha256 is a 64-char +// hex string. Light heuristic — refine if necessary. +func isHashedPath(p string) bool { + parts := strings.SplitN(strings.TrimPrefix(p, "/"), "/", 3) + if len(parts) < 2 { + return false + } + h := parts[1] + if len(h) != 64 { + return false + } + for _, r := range h { + switch { + case r >= '0' && r <= '9': + case r >= 'a' && r <= 'f': + default: + return false + } + } + return true +} diff --git a/third_party/lumencast-go/server/store.go b/third_party/lumencast-go/server/store.go new file mode 100644 index 00000000..372a0275 --- /dev/null +++ b/third_party/lumencast-go/server/store.go @@ -0,0 +1,95 @@ +package server + +import ( + "encoding/json" + "fmt" + "sort" + "sync" +) + +// store is the per-scene leaf-grain state map. It is an internal +// implementation detail of Scene ; the public surface is Scene.Set +// and Scene.Emit. +// +// Keys are dotted leaf paths ; values are arbitrary JSON. The store +// owns canonicalisation : a non-RawMessage value supplied to Set / +// Emit is marshalled once on entry so the snapshot path stays cheap. +type store struct { + mu sync.RWMutex + state map[string]json.RawMessage +} + +// newStore returns an empty store. +func newStore() *store { + return &store{state: make(map[string]json.RawMessage)} +} + +// snapshot returns a defensive copy of the entire state for inclusion +// in a Snapshot frame. +func (s *store) snapshot() map[string]json.RawMessage { + s.mu.RLock() + defer s.mu.RUnlock() + cp := make(map[string]json.RawMessage, len(s.state)) + for k, v := range s.state { + cp[k] = v + } + return cp +} + +// applyPatches mutates the store and returns the canonicalised +// patches (encoded once) ready to ship in a Delta frame. Returns +// ErrEmptyPatches if patches is empty. +// +// The returned slice is sorted lexicographically by leaf path. The +// input is a map, whose iteration order Go randomises ; without a +// stable sort the resulting Delta.Patches order would vary run to +// run. LSDP/1 does not constrain patch order semantically, but a +// reproducible stream matters for golden frames and conformance +// (the subscribe-snapshot-delta scenario asserts an exact order). +func (s *store) applyPatches(patches map[string]any) ([]rawPatch, error) { + if len(patches) == 0 { + return nil, ErrEmptyPatches + } + out := make([]rawPatch, 0, len(patches)) + s.mu.Lock() + defer s.mu.Unlock() + for path, value := range patches { + raw, err := encodeValue(value) + if err != nil { + return nil, fmt.Errorf("encode %q: %w", path, err) + } + s.state[path] = raw + out = append(out, rawPatch{Path: path, Value: raw}) + } + sort.Slice(out, func(i, j int) bool { return out[i].Path < out[j].Path }) + return out, nil +} + +// rawPatch is the canonicalised intermediate produced by applyPatches. +type rawPatch struct { + Path string + Value json.RawMessage +} + +// encodeValue normalises a user-supplied value to json.RawMessage. +// A json.RawMessage / []byte slice is passed through verbatim ; +// anything else is marshalled. +func encodeValue(v any) (json.RawMessage, error) { + switch x := v.(type) { + case nil: + return json.RawMessage("null"), nil + case json.RawMessage: + // Validate it is in fact valid JSON. + if !json.Valid(x) { + return nil, fmt.Errorf("server: raw value is not valid JSON") + } + return x, nil + case []byte: + if !json.Valid(x) { + return nil, fmt.Errorf("server: byte value is not valid JSON") + } + return json.RawMessage(x), nil + default: + return json.Marshal(v) + } +} diff --git a/third_party/lumencast-go/server/ws_handler.go b/third_party/lumencast-go/server/ws_handler.go new file mode 100644 index 00000000..a6999da2 --- /dev/null +++ b/third_party/lumencast-go/server/ws_handler.go @@ -0,0 +1,377 @@ +package server + +import ( + "context" + "errors" + "net/http" + "time" + + "github.com/coder/websocket" + + "github.com/Lumencast/lumencast-go/protocol" +) + +// serveLSDP is the WebSocket subscribe handler. It implements the +// LSDP/1.x lifecycle : +// +// 1. Negotiate Sec-WebSocket-Protocol — `lsdp.v1.1` preferred, +// `lsdp.v1` accepted for backward compat. Anything else → close +// with policy violation. +// 2. Accept the upgrade. +// 3. Read the first Subscribe frame within SubscribeTimeout. +// 4. Authenticate the token ; pick a scene ; emit Snapshot. +// 5. Run the read/write loops until ctx end or peer close. +func (s *Server) serveLSDP(w http.ResponseWriter, r *http.Request) { + c, err := websocket.Accept(w, r, &websocket.AcceptOptions{ + Subprotocols: protocol.SubProtocols, + }) + if err != nil { + s.logger.Warn("ws accept failed", "err", err) + return + } + negotiated := c.Subprotocol() + if negotiated != protocol.SubProtocolV1_1 && negotiated != protocol.SubProtocol { + _ = c.Close(websocket.StatusPolicyViolation, "lsdp.v1 or lsdp.v1.1 subprotocol required") + return + } + c.SetReadLimit(s.cfg.MaxFrameBytes) + + ctx, cancel := context.WithCancel(r.Context()) + defer cancel() + + // 1. Read Subscribe. + subCtx, subCancel := context.WithTimeout(ctx, s.cfg.SubscribeTimeout) + subFrame, err := readSubscribe(subCtx, c) + subCancel() + if err != nil { + // Spec § 13 : a server that receives a subscribe with v != 1 + // while only supporting v = 1 MUST close with 1002. + if errors.Is(err, protocol.ErrVersionMismatch) { + _ = c.Close(websocket.StatusProtocolError, "version mismatch") + return + } + _ = sendError(ctx, c, 0, protocol.CodeAuthDenied, err.Error(), false) + _ = c.Close(websocket.StatusPolicyViolation, "subscribe expected") + return + } + + // 2. Authenticate. Two sources of identity, selected at config time : + // - header-trust seam (ADR 007 §C.3a) : a trusted front-proxy has + // already authenticated the caller, so we derive the Identity from + // the upgrade request and ignore the Subscribe token entirely ; + // - token path (default) : validate Subscribe.Token via Auth. + // The downstream lifecycle (resolveScene, subscribeWithResume, write + // loop, CanWrite) is identical regardless of source. + var id Identity + if s.cfg.IdentityFromRequest != nil { + id, err = s.cfg.IdentityFromRequest(r) + } else { + id, err = s.cfg.Auth.Authenticate(ctx, subFrame.Token) + } + if err != nil || !id.IsAuthenticated() { + _ = sendError(ctx, c, 0, protocol.CodeAuthDenied, "token invalid", false) + _ = c.Close(websocket.StatusPolicyViolation, "auth denied") + return + } + + // 3. Resolve scene. + scene, errCode, errMsg := s.resolveScene(subFrame, id) + if scene == nil { + _ = sendError(ctx, c, 0, errCode, errMsg, false) + _ = c.Close(websocket.StatusPolicyViolation, errMsg) + return + } + + // 3b. A scene whose backing bundle failed validation is unservable : + // serve the recorded error instead of a snapshot of a scene built + // from a bundle we rejected. + if rej := scene.Rejection(); rej != nil { + _ = sendError(ctx, c, scene.seq.Current(), rej.Code, rej.Message, false) + _ = c.Close(websocket.StatusPolicyViolation, "bundle rejected") + return + } + + // 4. Subscribe + ship initial frames. Honours LSDP/1.1 + // `since_sequence` resume — when the replay buffer covers the gap, + // we ship a delta stream from since_sequence+1 forward instead of + // a fresh snapshot (§4.1, §18). + live := subFrame.Scene == "" + proto11 := negotiated == protocol.SubProtocolV1_1 + sub, snap, replay := scene.subscribeWithResume(256, live, proto11, subFrame.SinceSequence) + defer s.detach(sub) + if snap != nil { + if err := sendFrame(ctx, c, snap); err != nil { + s.logger.Debug("snapshot send failed", "err", err) + return + } + } else { + // Replay path — ship the buffered deltas before entering the + // main loop. Each carries its original (per-scene) seq. + for _, r := range replay { + md := r.projectionMetadata + var ( + schemaVersion string + sceneDigest string + runtimeInstanceID string + target string + renderRevision string + correlationID string + ) + if md != nil { + schemaVersion = md.SchemaVersion + sceneDigest = md.SceneDigest + runtimeInstanceID = md.RuntimeInstanceID + target = md.Target + renderRevision = md.RenderRevision + correlationID = md.CorrelationID + } + d := &protocol.Delta{ + Seq: r.seq, + Patches: r.patches, + Cause: r.cause, + SchemaVersion: schemaVersion, + SceneDigest: sceneDigest, + RuntimeInstanceID: runtimeInstanceID, + Target: target, + RenderRevision: renderRevision, + CorrelationID: correlationID, + } + if err := sendFrame(ctx, c, d); err != nil { + s.logger.Debug("replay delta send failed", "err", err) + return + } + } + } + + // 4b. Replay the cached show roster to this subscriber right after + // its initial snapshot, so a fresh 1.1 runtime can preload every + // scene bundle without waiting for the next roster change (Prism#230). + // Show-level metadata : live subscribers only, and only when the + // connection negotiated 1.1. + if live && proto11 { + if roster, ok := s.rosterFrame(); ok { + if err := sendFrame(ctx, c, roster); err != nil { + s.logger.Debug("roster replay send failed", "err", err) + return + } + } + // 4c. Replay the cached show-level overlay-app state (overlay_apps), + // so a fresh 1.1 consumer — including one that joined with NO active + // scene (the holding path) — preloads the overlay control state. + if overlay, ok := s.overlayAppsFrame(); ok { + if err := sendFrame(ctx, c, overlay); err != nil { + s.logger.Debug("overlay_apps replay send failed", "err", err) + return + } + } + } + + // 5. Loop. Reader and writer share the connection ; coder/websocket + // supports the pattern as long as neither side exceeds its role. + if err := s.runConnection(ctx, c, scene, sub, id); err != nil && + !errors.Is(err, context.Canceled) && + !isCleanClose(err) { + s.logger.Debug("ws session ended", "err", err) + } + _ = c.Close(websocket.StatusNormalClosure, "") +} + +// resolveScene picks the right Scene given a Subscribe frame. Live +// mode (no scene field) returns the active scene ; test mode demands +// (scene, session) and the role MUST be test or operator. +func (s *Server) resolveScene(sub *protocol.Subscribe, id Identity) (*Scene, protocol.ErrorCode, string) { + if sub.Scene == "" { + // Live mode. With no active scene, attach to the holding scene rather + // than rejecting: a live 1.1 subscriber can then still receive + // show-level frames (roster, overlay_apps) with an empty show and is + // migrated onto the first scene that becomes active. This is what makes + // the overlay_apps frame deliverable to a consumer with no scene. + scene := s.ActiveScene() + if scene == nil { + return s.holding, "", "" + } + return scene, "", "" + } + // Test mode. + if id.Role != protocol.RoleTest && id.Role != protocol.RoleOperator { + return nil, protocol.CodeAuthDenied, "test mode requires test or operator role" + } + if sub.Session == "" { + return nil, protocol.CodeSceneNotFound, "test mode requires session" + } + scene, ok := s.Scene(sub.Scene) + if !ok { + return nil, protocol.CodeSceneNotFound, "scene not registered" + } + return scene, "", "" +} + +// runConnection drains the read side and pipes the subscription's +// outgoing channel to the wire. Returns when the read side errors, +// the writer encounters a fatal write, or ctx ends. +func (s *Server) runConnection( + ctx context.Context, + c *websocket.Conn, + scene *Scene, + sub *subscription, + id Identity, +) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + writerErr := make(chan error, 1) + go func() { + writerErr <- s.writerLoop(ctx, c, sub) + }() + + // Reader loop runs on this goroutine. + for { + _, raw, err := c.Read(ctx) + if err != nil { + cancel() + <-writerErr + return err + } + msg, derr := protocol.Decode(raw) + if derr != nil { + code := protocol.CodeInternal + if errors.Is(derr, protocol.ErrVersionMismatch) { + code = protocol.CodeVersionMismatch + } + // Error frames carry the current scene seq — they don't + // advance it (per-scene seq, §18.1.1, errors are + // connection-scoped not scene-scoped events). + _ = sendError(ctx, c, scene.seq.Current(), code, derr.Error(), false) + cancel() + <-writerErr + return derr + } + switch m := msg.(type) { + case *protocol.Input: + code, path, ierr := scene.applyInput(ctx, id, m) + if ierr != nil { + _ = sendPathError(ctx, c, scene.seq.Current(), code, ierr.Error(), code != protocol.CodeAuthDenied, path) + } + case *protocol.Ping: + // LSDP/1.1 §3.5 : echo the nonce verbatim if present. + if err := sendFrame(ctx, c, &protocol.Pong{Nonce: m.Nonce}); err != nil { + cancel() + <-writerErr + return err + } + case *protocol.Pong: + // Liveness reply ; nothing to do — the read deadline + // resets on every received frame. + case *protocol.Unsubscribe: + // LSDP/1.1 §4.4 : clean teardown. No data flows after this + // frame ; the server closes the WebSocket within 1 second. + // Cancel writer, wait for it, return cleanly. + cancel() + <-writerErr + return nil + case *protocol.Subscribe: + _ = sendError(ctx, c, scene.seq.Current(), protocol.CodeInternal, "duplicate subscribe", false) + cancel() + <-writerErr + return errors.New("duplicate subscribe") + } + } +} + +// writerLoop drains sub.out and the periodic ping timer. +func (s *Server) writerLoop(ctx context.Context, c *websocket.Conn, sub *subscription) error { + t := time.NewTimer(s.cfg.PingInterval) + defer t.Stop() + for { + select { + case <-ctx.Done(): + return ctx.Err() + case msg, ok := <-sub.out: + if !ok { + return nil + } + if err := sendFrame(ctx, c, msg); err != nil { + return err + } + if !t.Stop() { + select { + case <-t.C: + default: + } + } + t.Reset(s.cfg.PingInterval) + case <-t.C: + if err := sendFrame(ctx, c, &protocol.Ping{}); err != nil { + return err + } + t.Reset(s.cfg.PingInterval) + } + } +} + +// sendFrame encodes and writes a single LSDP/1 text frame. +func sendFrame(ctx context.Context, c *websocket.Conn, msg any) error { + raw, err := protocol.Encode(msg) + if err != nil { + return err + } + wctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + return c.Write(wctx, websocket.MessageText, raw) +} + +// sendError ships an Error frame with the given fields. Callers use +// this for both pre-subscribe errors (seq=0) and mid-flight errors. +func sendError(ctx context.Context, c *websocket.Conn, seq uint64, code protocol.ErrorCode, msg string, recoverable bool) error { + return sendPathError(ctx, c, seq, code, msg, recoverable, "") +} + +// sendPathError is sendError for the path-scoped codes : LSDP/1 §3.4.1 +// makes `path` REQUIRED on WRITE_FORBIDDEN, UNKNOWN_PATH and +// INVALID_VALUE. An empty path encodes to no field at all, so this is +// also the safe form for the codes that carry none. +func sendPathError(ctx context.Context, c *websocket.Conn, seq uint64, code protocol.ErrorCode, msg string, recoverable bool, path string) error { + return sendFrame(ctx, c, &protocol.Error{ + Seq: seq, + Code: string(code), + Message: msg, + Recoverable: recoverable, + Path: path, + }) +} + +// readSubscribe waits for and parses the first frame ; rejects anything +// that is not a Subscribe. +func readSubscribe(ctx context.Context, c *websocket.Conn) (*protocol.Subscribe, error) { + _, raw, err := c.Read(ctx) + if err != nil { + return nil, err + } + msg, err := protocol.Decode(raw) + if err != nil { + return nil, err + } + sub, ok := msg.(*protocol.Subscribe) + if !ok { + return nil, errors.New("first frame must be subscribe") + } + return sub, nil +} + +// isCleanClose hides the common "peer closed normally" errors so the +// logger doesn't shout on every disconnect. +func isCleanClose(err error) bool { + if err == nil { + return true + } + var ce websocket.CloseError + if errors.As(err, &ce) { + switch ce.Code { + case websocket.StatusNormalClosure, + websocket.StatusGoingAway, + websocket.StatusNoStatusRcvd: + return true + } + } + return false +}