Skip to content

[2087 by GPT-5.6 Sol] Handle pre-desktop 401 cleanly and prove manual remote browser pairing end to end - #2089

Merged
integry merged 11 commits into
1953-epic-desktop-transport-apifrom
2087/gpt-5.6-sol-handle-pre-desktop-401-cl-20260902-2045-jh1
Sep 4, 2026
Merged

[2087 by GPT-5.6 Sol] Handle pre-desktop 401 cleanly and prove manual remote browser pairing end to end#2089
integry merged 11 commits into
1953-epic-desktop-transport-apifrom
2087/gpt-5.6-sol-handle-pre-desktop-401-cl-20260902-2045-jh1

Conversation

@propr-dev

@propr-dev propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

AI Implementation Summary

Closes #2087

Branch: 2087/gpt-5.6-sol-handle-pre-desktop-401-cl-20260902-2045-jh1
Commits: ✅ Changes committed (88ea706)


AI Processing Completed

Execution Details:

Summary:
Implemented issue #2087.

  • Pre-desktop discovery 401 responses now produce a safe incompatible state instead of an offline error or authentication loop in credential-service.ts.
  • Added regression coverage proving only one credential-free discovery request occurs and legacy server details are not leaked.
  • Expanded remote pairing coverage through initial discovery, validated browser approval, polling, activation, secure persistence, authenticated reprobe, and scoped bearer injection in credential-service.pairing-browser.test.ts.

Verification:

  • Desktop suite: 360 passed, 25 platform-specific skips.
  • Focused credential tests: 71 passed.
  • Desktop and UI typechecks passed.

Detailed Logs:

  • Conversation: 95 messages
  • Session: 01a063df-610d-7e33-82e0-f9ef1f99b55f

Log files stored at:

  • conversation: /tmp/claude-logs/issue-2087-2026-09-02T20-58-15-201Z-conversation.json
  • output: /tmp/claude-logs/issue-2087-2026-09-02T20-58-15-201Z-output.txt
Latest Conversation Messages

This PR was created automatically by ProPR after processing issue #2087.


💡 Need changes?

Comment on this PR to request refinements — the AI agent monitors comments and will update the implementation based on your feedback. Keep iterating until you're satisfied!

…ve manual re

Implemented by ProPR AI using gpt-5.6-sol model.

Implementation completed successfully.
@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Validate unsigned linux-arm64 package

Please investigate and fix this CI failure.

  • Check: Validate unsigned linux-arm64 package
  • Result: failure
  • Commit: 88ea706c7347 (88ea706c7347a23f5feffb4024e07ea0ce61688c)
  • Details: View CI failure

Failure evidence

.github:853
Process completed with exit code 1.

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Validate unsigned linux-x64 package

Please investigate and fix this CI failure.

  • Check: Validate unsigned linux-x64 package
  • Result: failure
  • Commit: 88ea706c7347 (88ea706c7347a23f5feffb4024e07ea0ce61688c)
  • Details: View CI failure

Failure evidence

.github:853
Process completed with exit code 1.

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Native Windows durability (x64)

Please investigate and fix this CI failure.

  • Check: Native Windows durability (x64)
  • Result: failure
  • Commit: 88ea706c7347 (88ea706c7347a23f5feffb4024e07ea0ce61688c)
  • Details: View CI failure

Failure evidence

.github:852
Process completed with exit code 1.

@integry

integry commented Sep 2, 2026

Copy link
Copy Markdown
Owner

/ultrafix goal=9 max=3

Mac/Linux/shared-only correction scope for #2089. Windows publication/work is explicitly deferred; do not change or chase Windows-only lanes.

F1 — Replace the synthetic-only proof with an actual assembled API route-order integration. Exercise the real Express registration/middleware order and prove GET /api/desktop/discovery plus the bounded pairing bootstrap endpoints are reachable without authentication before the generic /api ensureAuthenticated/authorization guard, while an operational protected REST endpoint still returns 401 without a credential. Do not merely invoke status/auth handlers directly.

F2 — Add a real macOS/Linux packaged desktop integration journey (or the repository's existing packaged Electron harness) through manual remote URL → strict public discovery → browser approval → start/poll/activate → OS-backed persistence/reprobe → authenticated REST AND Socket.IO using the same scoped endpoint → renderer/dashboard connected state. Assert cancellation/approval expiry, malformed/oversized discovery, no bearer before identity, no secret in renderer contracts/logs, and no stale socket/credential reuse. A mocked DesktopCredentialService fetch callback alone is not acceptance evidence.

F3 — Compose correctly with strict identity PR #2086 before this PR may merge. First let #2086 land into 1953-epic-desktop-transport-api, then /merge latest base here and resolve semantically. The strict client currently reports non-OK discovery (including 401) as ProprClientError kind=invalid_response, so the present kind=http check will not execute after composition. Preserve a narrow, explicit signal for an unauthenticated request to the exact public discovery endpoint returning 401 and map only that legacy/misconfigured protocol condition to honest incompatible/configuration-or-upgrade UX. Do not broadly turn unrelated 401s, malformed identity, redirects, HTML, or authenticated REST failures into “upgrade required,” and do not read/echo an untrusted response body. Supported strict discovery/pairing must remain functional.

F4 — Update strict discovery fixtures to the #2086 schema (schemaVersion, canonicalEndpoint, publicInstanceIdentity) and retain identity-before-bearer, origin/generation/scope binding, rotation invalidation and fail-closed mismatch behavior. Update the exact native durability credential/derived total assertions for the composed test count without weakening/excluding tests.

Acceptance: focused client/desktop/API integration tests, full shared suite, and all four macOS/Linux packaged Connect lanes plus unsigned macOS/Linux package validation green. No workflow, package-lock, signing/publish profile, or Windows-specific changes. Do not merge.

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

🔄 Ultrafix loop started (goal: 9/10, max cycles: 3)

First action: /review

💡 Tip: Remove the ultrafix label from this PR to stop further ultrafix cycles.

@integry

integry commented Sep 2, 2026

Copy link
Copy Markdown
Owner

/review

Review only the Mac/Linux/shared F1-F4 scope in my immediately preceding /ultrafix comment. Treat missing real Express route-order integration, missing packaged REST+Socket.IO-to-dashboard journey, and incompatibility with #2086 strict discovery error semantics as blockers. Ignore Windows-only CI/work. Do not merge.

@integry integry added AI and removed AI labels Sep 2, 2026
@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

AI Code Review Complete requested by @integry

Posted 1 review:

View Task Details

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Validate unsigned win32-x64 package

Please investigate and fix this CI failure.

  • Check: Validate unsigned win32-x64 package
  • Result: failure
  • Commit: 88ea706c7347 (88ea706c7347a23f5feffb4024e07ea0ce61688c)
  • Details: View CI failure

Failure evidence

.github:2691
Process completed with exit code 1.

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

🔍 AI Code Review — codex:gpt-5.6-sol

Overall Evaluation

The PR correctly targets legacy discovery 401 handling, but it needs significant rework and must not merge. Required route-order and packaged transport integration proofs are absent, while the new status-only 401 classification conflicts with strict discovery-error semantics. The current Linux unsigned-package validation failures further prevent merge readiness.

Credential-free regression coverage — The unit test verifies exactly one discovery request, no bearer header, and no leakage of the legacy response body.

Sensitive token containment — The pairing test verifies that the instance token is used for authenticated reprobe without appearing in returned connection results.

Merge blockers

Every finding below was introduced by this PR and must be resolved before merging.

F1: 🔴 Route order remains untested

  • Required behavior: The assembled Express application must prove discovery and bounded pairing bootstrap routes are reachable without authentication before the generic /api guard, while a protected operational endpoint returns 401.
  • Evidence: apps/desktop/src/credential-service.pairing-browser.test.ts:58 — The added proof substitutes a URL-switching fetch fixture that directly manufactures endpoint responses; it never assembles or requests the real Express application.
  • Minimum fix: Add an integration test using the real Express registration path and HTTP requests covering discovery, the public pairing bootstrap endpoints, and an unauthenticated protected operational endpoint.

F2: 🔴 Packaged connection journey is missing

  • Required behavior: A macOS/Linux packaged Electron journey must exercise manual URL entry, strict public discovery, browser approval, pairing, OS-backed persistence and reprobe, authenticated REST and Socket.IO through the same scoped endpoint, and the renderer/dashboard connected state.
  • Evidence: apps/desktop/src/credential-service.pairing-browser.test.ts:129 — The purported end-to-end test directly invokes DesktopCredentialService with mocked fetch and browser opening; apps/desktop/src/credential-service.pairing-browser.test.ts:145 only calls prepareRequest and performs no REST request, Socket.IO connection, packaged-runtime execution, restart/reprobe, or renderer assertion.
  • Minimum fix: Extend the repository’s packaged macOS/Linux Electron harness to run the complete journey against an assembled server, restart/reprobe the OS-backed credential, perform real scoped REST and Socket.IO traffic, and verify the dashboard reaches its connected state.

F3: 🔴 Every discovery 401 becomes legacy

  • Required behavior: Strict discovery-error semantics must be preserved: only a positively identified pre-desktop authentication-guard response may become incompatible; an arbitrary 401 from a proxy, policy layer, or modern deployment must not be inferred to prove legacy protocol behavior.
  • Evidence: apps/desktop/src/credential-service.ts:691 — The new branch classifies every HTTP 401 ProprClientError as incompatible using status alone, without validating a legacy error contract or typed classification.
  • Minimum fix: Align the branch with [2084 by GPT-5.6 Sol] Bind desktop credentials to strict public instance identity before bearer use #2086’s strict discovery-error contract by requiring validated legacy-specific evidence or a shared typed error classification, preserving strict failure handling for other 401 responses, and covering both cases with tests.

Suggestions

These are optional follow-ups and are not sent to /fix.

No suggestions.

Score

The focused unit assertions are useful, but two required real-integration layers are missing and the production classification is overly broad. Together with the scoped Linux validation failures, this PR is not close to merge-ready.

Score: 3/10


🤖 Review Details

  • Model: GPT-5.6 Sol
  • Time: 1m 34s
  • Tokens: 41,445 (36,559 in / 4,886 out)
  • Cost: $0.33

View Task


💡 Next step: Comment /fix to address F# merge blockers only.
F# IDs increment across review comments and remain permanent, so selectors such as /fix F3 F5 stay unambiguous across cycles. Suggestions require a separate ordinary follow-up request.

🤖 Review by ProPR

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

ℹ️ Analyzed the follow-up request by @propr-dev[bot]

Analysis Summary

I’ll trace the failing validation job at the referenced commit, reproduce the package check locally if possible, and make the narrowest change needed for that CI lane. I’ll keep this scoped to the new unsigned win32-x64 validation failure and won’t take on the broader F1–F4 review items.

No code changes were necessary based on the current state of the branch.


🤖 Analysis Details

  • Model: GPT-5.6 Sol (high)
  • Time: 1m 20s

View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5516372602✓

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Packaged Connect (win32-x64)

Please investigate and fix this CI failure.

  • Check: Packaged Connect (win32-x64)
  • Result: failure
  • Commit: 88ea706c7347 (88ea706c7347a23f5feffb4024e07ea0ce61688c)
  • Details: View CI failure

Failure evidence

.github:6
Process completed with exit code 1.

@integry integry removed the AI label Sep 2, 2026
@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Count evidence correction: current #2089 Linux unsigned validation reaches and passes all 116 desktop durability tests, then fails the fail-closed assertion because the old expected total is 115. This PR adds one pairing-browser test. After #2086 is merged/synced, recompute from the composed head (current #2086 derived total is 119, so integrating this one new test is likely 120) and assert the exact derived total; do not hard-code 120 without confirming the final test inventory, and do not weaken/exclude the guard. Also do not work on Windows lanes.

@integry integry removed the ultrafix label Sep 2, 2026
@integry

integry commented Sep 2, 2026

Copy link
Copy Markdown
Owner

/fix F1 F2 F3

Implement only the Mac/Linux/shared blockers in review 5516398297, with the full F1–F4 acceptance scope in comment 5516351277 and exact count evidence in 5516412358. This supersedes and must not resume the stopped win32 CI task. Do not change or chase Windows-only lanes. Do not merge.

@integry integry added the AI label Sep 2, 2026
@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Applied the requested follow-up changes in commit c428d8f

Addressed 1 AI review comment (IDs: 5516398297)

Summary of Changes

Implemented F1–F3 only, without committing or merging.

  • F1: Added real Express HTTP route-order integration through the production desktop API registrar. Public discovery/pairing routes bypass authentication; /api/status returns 401.
  • F2: Extended the existing macOS/Linux packaged Electron harness through manual URL entry, strict discovery, browser approval, pairing, OS-backed persistence/restart, scoped REST and Socket.IO, dashboard connected state, expiry/cancellation, malformed/oversized discovery, secret checks, and stale-scope rejection.
  • F3: Added strict shared discovery parsing and a narrow typed signal for the exact credential-free JSON discovery 401. HTML/policy responses and operational 401s remain strict errors.

Verification:

  • Desktop: 360 passed, 25 platform skips.
  • Client: 70/70 passed.
  • Native durability: exact 116/116; categories 69 + 37 + 10.
  • API integration, API lint/typecheck, shared and UI typechecks passed.
  • Root unit suite: 284/284 passed.
  • git diff --check passed.

No workflow, lockfile, Windows-specific file, signing/publishing, commit, or merge changes were made. The four target-native packaged lanes were not runnable locally because packaged macOS/Linux artifacts were unavailable; the harness is wired for those existing CI lanes.


🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @propr-dev[bot]
  • Time: 32m 8s
  • Tokens: 17,184,615 (17,133,148 in / 51,467 out)
  • Cost: $11.79

Undo ChangesView Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5516412358✓

@integry integry removed the AI label Sep 2, 2026
@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Concrete F3 evidence: the pre-desktop generic ensureAuthenticated no-credential path returns Express JSON exactly {"error":"Unauthorized"}. If using this as the legacy signal, keep classification constrained to the exact credential-free /api/desktop/discovery request, status 401, no redirect, application/json, a small bounded/fatal-UTF8 body, and an exact-key/value schema. Anything else (proxy HTML/JSON variants, extra keys/code, malformed/oversized body, redirect, modern strict metadata failure, REST 401) must remain fail-closed, not incompatible. Never echo/log the body.

@propr-dev

propr-dev Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Packaged Connect (win32-arm64)

Please investigate and fix this CI failure.

  • Check: Packaged Connect (win32-arm64)
  • Result: failure
  • Commit: 88ea706c7347 (88ea706c7347a23f5feffb4024e07ea0ce61688c)
  • Details: View CI failure

Failure evidence

.github:6
Process completed with exit code 1.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

Full Test Suite Results

Validation failed during: Full test suite.

  • Dependency install: success
  • Workspace build: success
  • Docs validation: success
  • Redis startup: success
  • Full test suite: failure
View Test Output

> propr@0.8.15 test:full:prepared
> npm run test:server


> propr@0.8.15 test:server
> node scripts/run-test-suite.mjs


[1/378] apps/desktop/scripts/assert-windows-mvp-package.test.mjs
TAP version 13
# Subtest: Windows MVP ASAR main entry
    # Subtest: uses the rooted listPackage representation accepted by extractFile
    ok 1 - uses the rooted listPackage representation accepted by extractFile
      ---
      duration_ms: 31.944414
      type: 'test'
      ...
    # Subtest: preserves the Windows separator after removing the one archive root
    ok 2 - preserves the Windows separator after removing the one archive root
      ---
      duration_ms: 0.238458
      type: 'test'
      ...
    # Subtest: rejects traversal, duplicate entries, and case-colliding main paths
    ok 3 - rejects traversal, duplicate entries, and case-colliding main paths
      ---
      duration_ms: 0.709772
      type: 'test'
      ...
    1..3
ok 1 - Windows MVP ASAR main entry
  ---
  duration_ms: 33.943965
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 300.988543

[2/378] apps/desktop/scripts/build-windows-machine-installer.test.mjs
TAP version 13
# Subtest: sets explicit Windows-1252 MSI and summary code pages in probe and production WXS
ok 1 - sets explicit Windows-1252 MSI and summary code pages in probe and production WXS
  ---
  duration_ms: 1.797683
  type: 'test'
  ...
# Subtest: accepts the exact MSI ProductVersion boundary and retains version and upgrade identity in WXS
ok 2 - accepts the exact MSI ProductVersion boundary and retains version and upgrade identity in WXS
  ---
  duration_ms: 0.411893
  type: 'test'
  ...
# Subtest: rejects every unsupported ProductVersion at the direct installer builder entry point
ok 3 - rejects every unsupported ProductVersion at the direct installer builder entry point
  ---
  duration_ms: 1.621301
  type: 'test'
  ...
# Subtest: uses per-machine scope without explicitly authoring the derived ALLUSERS property
ok 4 - uses per-machine scope without explicitly authoring the derived ALLUSERS property
  ---
  duration_ms: 0.427041
  type: 'test'
  ...
# Subtest: authors the complete per-machine Start Menu contract for x64 and ARM64
ok 5 - authors the complete per-machine Start Menu contract for x64 and ARM64
  ---
  duration_ms: 0.806803
  type: 'test'
  ...
# Subtest: selects only the installed x64 WiX directory or an explicit ARM64 build directory
ok 6 - selects only the installed x64 WiX directory or an explicit ARM64 build directory
  ---
  duration_ms: 0.540053
  type: 'test'
  ...
# Subtest: uses a ten-minute timeout only for production Light
ok 7 - uses a ten-minute timeout only for production Light
  ---
  duration_ms: 0.264215
  type: 'test'
  ...
# Subtest: keeps WiX processes and their emitted diagnostics bounded
ok 8 - keeps WiX processes and their emitted diagnostics bounded
  ---
  duration_ms: 0.189085
  type: 'test'
  ...
# Subtest: emits WiX v3 default registry values without empty Name attributes
ok 9 - emits WiX v3 default registry values without empty Name attributes
  ---
  duration_ms: 0.409087
  type: 'test'
  ...
1..9
# tests 9
# suites 0
# pass 9
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 246.86371

[3/378] apps/desktop/scripts/packaged-connect-launch.test.mjs
TAP version 13
# Subtest: packaged Connect launch boundary
    # Subtest: passes the one effective Linux argv through the actual binary spawn
    ok 1 - passes the one effective Linux argv through the actual binary spawn
      ---
      duration_ms: 1.605311
      type: 'test'
      ...
    # Subtest: does not add the Linux password-store selection on Darwin
    ok 2 - does not add the Linux password-store selection on Darwin
      ---
      duration_ms: 0.179306
      type: 'test'
      ...
    # Subtest: the lifecycle and real binary spawn share the derived argv source
    ok 3 - the lifecycle and real binary spawn share the derived argv source
      ---
      duration_ms: 5.499943
      type: 'test'
      ...
    1..3
ok 1 - packaged Connect launch boundary
  ---
  duration_ms: 8.756602
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 233.888084

[4/378] apps/desktop/scripts/packaged-connect-lifecycle.test.mjs
TAP version 13
# Subtest: packaged Connect bounded child lifecycle
    # Subtest: accepts an exact ready proof followed by a clean exit
    ok 1 - accepts an exact ready proof followed by a clean exit
      ---
      duration_ms: 6.25817
      type: 'test'
      ...
    # Subtest: does not accept an intermediate discovery milestone as terminal readiness
    ok 2 - does not accept an intermediate discovery milestone as terminal readiness
      ---
      duration_ms: 1.826877
      type: 'test'
      ...
    # Subtest: returns only exact allowlisted journey stages
    ok 3 - returns only exact allowlisted journey stages
      ---
      duration_ms: 3.224149
      type: 'test'
      ...
    # Subtest: retains the latest bounded journey stage when earlier diagnostics fill the cap
    ok 4 - retains the latest bounded journey stage when earlier diagnostics fill the cap
      ---
      duration_ms: 2.033254
      type: 'test'
      ...
    # Subtest: returns only fixed secret-free Local Network Access decision evidence
    ok 5 - returns only fixed secret-free Local Network Access decision evidence
      ---
      duration_ms: 2.093197
      type: 'test'
      ...
    # Subtest: fails closed when an otherwise allowlisted journey stage contains a secret
    ok 6 - fails closed when an otherwise allowlisted journey stage contains a secret
      ---
      duration_ms: 1.892981
      type: 'test'
      ...
    # Subtest: publishes the sole terminal READY only after each real journey phase
    ok 7 - publishes the sole terminal READY only after each real journey phase
      ---
      duration_ms: 13.133508
      type: 'test'
      ...
    # Subtest: forces a ready app with a hung descendant through an exact bounded taskkill invocation
    ok 8 - forces a ready app with a hung descendant through an exact bounded taskkill invocation
      ---
      duration_ms: 6.918038
      type: 'test'
      ...
    # Subtest: keeps timeout-before-ready primary while terminating and draining the tree
    ok 9 - keeps timeout-before-ready primary while terminating and draining the tree
      ---
      duration_ms: 16.133536
      type: 'test'
      ...
    # Subtest: classifies asynchronous spawn errors without exposing their message
    ok 10 - classifies asynchronous spawn errors without exposing their message
      ---
      duration_ms: 6.431074
      type: 'test'
      ...
    # Subtest: settles close/timeout races once and never upgrades an early exit to success
    ok 11 - settles close/timeout races once and never upgrades an early exit to success
      ---
      duration_ms: 0.865153
      type: 'test'
      ...
    # Subtest: accepts a clean post-proof close racing a taskkill no-process result
    ok 12 - accepts a clean post-proof close racing a taskkill no-process result
      ---
      duration_ms: 6.042134
      type: 'test'
      ...
    # Subtest: rejects malformed, partial, truncated, and extra-field ready records
    ok 13 - rejects malformed, partial, truncated, and extra-field ready records
      ---
      duration_ms: 13.852912
      type: 'test'
      ...
    # Subtest: terminates an exact-event record whose platform proof is invalid
    ok 14 - terminates an exact-event record whose platform proof is invalid
      ---
      duration_ms: 1.557111
      type: 'test'
      ...
    # Subtest: fails after proof when Windows tree termination cannot be proven
    ok 15 - fails after proof when Windows tree termination cannot be proven
      ---
      duration_ms: 6.609469
      type: 'test'
      ...
    # Subtest: never returns secret-bearing raw output or non-allowlisted record fields
    ok 16 - never returns secret-bearing raw output or non-allowlisted record fields
      ---
      duration_ms: 1.51404
      type: 'test'
      ...
    # Subtest: revokes success when sensitive output arrives after the exact ready proof
    ok 17 - revokes success when sensitive output arrives after the exact ready proof
      ---
      duration_ms: 1.522486
      type: 'test'
      ...
    # Subtest: rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
    ok 18 - rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
      ---
      duration_ms: 1.56171
      type: 'test'
      ...
    # Subtest: revokes success for a JSON-escaped Windows path after the exact ready proof
    ok 19 - revokes success for a JSON-escaped Windows path after the exact ready proof
      ---
      duration_ms: 0.75719
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the record-count cap
    ok 20 - revokes success when a JSON-escaped Windows path follows the record-count cap
      ---
      duration_ms: 2.074461
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the byte cap
    ok 21 - revokes success when a JSON-escaped Windows path follows the byte cap
      ---
      duration_ms: 5.74118
      type: 'test'
      ...
    1..21
ok 1 - packaged Connect bounded child lifecycle
  ---
  duration_ms: 104.701199
  type: 'suite'
  ...
# Subtest: packaged Connect fixture cleanup
    # Subtest: closes the journey fixture once and tolerates only the already-stopped server condition
    ok 1 - closes the journey fixture once and tolerates only the already-stopped server condition
      ---
      duration_ms: 1.148484
      type: 'test'
      ...
    # Subtest: retries a transient Windows EBUSY only inside the authorized fixture
    ok 2 - retries a transient Windows EBUSY only inside the authorized fixture
      ---
      duration_ms: 6.580143
      type: 'test'
      ...
    # Subtest: redacts cleanup failure and preserves the primary lifecycle outcome
    ok 3 - redacts cleanup failure and preserves the primary lifecycle outcome
      ---
      duration_ms: 1.316499
      type: 'test'
      ...
    # Subtest: bounds a never-settling removal and preserves the primary result
    ok 4 - bounds a never-settling removal and preserves the primary result
      ---
      duration_ms: 10.369823
      type: 'test'
      ...
    # Subtest: bounds a never-settling authorization call as a fixed cleanup failure
    ok 5 - bounds a never-settling authorization call as a fixed cleanup failure
      ---
      duration_ms: 11.088273
      type: 'test'
      ...
    # Subtest: isolates default Windows filesystem cleanup from the harness process
    ok 6 - isolates default Windows filesystem cleanup from the harness process
      ---
      duration_ms: 42.326445
      type: 'test'
      ...
    # Subtest: refuses a link, renamed leaf, or fixture outside the canonical temporary parent
    ok 7 - refuses a link, renamed leaf, or fixture outside the canonical temporary parent
      ---
      duration_ms: 0.913264
      type: 'test'
      ...
    1..7
ok 2 - packaged Connect fixture cleanup
  ---
  duration_ms: 74.223775
  type: 'suite'
  ...
1..2
# tests 28
# suites 2
# pass 28
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 424.599408

[5/378] apps/desktop/scripts/packaged-connect-platform.test.mjs
TAP version 13
# Subtest: packaged Connect target-native credential setup
    # Subtest: Linux retains one isolated unlocked libsecret session and rejects plaintext fallback
    ok 1 - Linux retains one isolated unlocked libsecret session and rejects plaintext fallback
      ---
      duration_ms: 4.272024
      type: 'test'
      ...
    # Subtest: Darwin uses only a generated ephemeral default keychain and restores it on exit
    ok 2 - Darwin uses only a generated ephemeral default keychain and restores it on exit
      ---
      duration_ms: 0.493616
      type: 'test'
      ...
    1..2
ok 1 - packaged Connect target-native credential setup
  ---
  duration_ms: 5.902854
  type: 'suite'
  ...
1..1
# tests 2
# suites 1
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 221.72181

[6/378] apps/desktop/scripts/packaged-layout.test.mjs
TAP version 13
# Subtest: packaged desktop event parsing
    # Subtest: returns the first full record for the exact matching event
    ok 1 - returns the first full record for the exact matching event
      ---
      duration_ms: 1.675553
      type: 'test'
      ...
    # Subtest: returns undefined when the event is absent
    ok 2 - returns undefined when the event is absent
      ---
      duration_ms: 0.214142
      type: 'test'
      ...
    1..2
ok 1 - packaged desktop event parsing
  ---
  duration_ms: 3.035735
  type: 'suite'
  ...
# Subtest: packaged desktop layout assertions
    # Subtest: retains the exact 1280x820 Linux Xvfb proof
    ok 1 - retains the exact 1280x820 Linux Xvfb proof
      ---
      duration_ms: 1.243252
      type: 'test'
      ...
    # Subtest: accepts a safe 1024x720 Windows display clamp with intact contained content
    ok 2 - accepts a safe 1024x720 Windows display clamp with intact contained content
      ---
      duration_ms: 0.274685
      type: 'test'
      ...
    # Subtest: rejects unsafe Windows clamps and content outside the visible work area
    ok 3 - rejects unsafe Windows clamps and content outside the visible work area
      ---
      duration_ms: 0.264917
      type: 'test'
      ...
    1..3
ok 2 - packaged desktop layout assertions
  ---
  duration_ms: 2.108706
  type: 'suite'
  ...
1..2
# tests 5
# suites 2
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 235.297136

[7/378] apps/desktop/scripts/packaged-smoke-support.test.mjs
TAP version 13
# Subtest: packaged smoke native window layout
    # Subtest: accepts the preferred size while retaining responsive containment
    ok 1 - accepts the preferred size while retaining responsive containment
      ---
      duration_ms: 1.556901
      type: 'test'
      ...
    # Subtest: accepts the 1024x720-clamped size while retaining responsive containment
    ok 2 - accepts the 1024x720-clamped size while retaining responsive containment
      ---
      duration_ms: 0.221846
      type: 'test'
      ...
    # Subtest: accepts the configured minimum size while retaining responsive containment
    ok 3 - accepts the configured minimum size while retaining responsive containment
      ---
      duration_ms: 0.174417
      type: 'test'
      ...
    # Subtest: accepts the undersized work area while retaining responsive containment
    ok 4 - accepts the undersized work area while retaining responsive containment
      ---
      duration_ms: 0.15436
      type: 'test'
      ...
    # Subtest: rejects an unclamped window or a viewport inconsistent with native content chrome
    ok 5 - rejects an unclamped window or a viewport inconsistent with native content chrome
      ---
      duration_ms: 0.584708
      type: 'test'
      ...
    # Subtest: accepts actual reduced native sizing only when both minimum constraints are exercised
    ok 6 - accepts actual reduced native sizing only when both minimum constraints are exercised
      ---
      duration_ms: 0.294622
      type: 'test'
      ...
    1..6
ok 1 - packaged smoke native window layout
  ---
  duration_ms: 4.33372
  type: 'suite'
  ...
# Subtest: packaged smoke child environment
    # Subtest: defines four isolated launches with exact per-mode environment, argv, and marker contracts
    ok 1 - defines four isolated launches with exact per-mode environment, argv, and marker contracts
      ---
      duration_ms: 1.35365
      type: 'test'
      ...
    # Subtest: passes only platform launch inputs and private profile paths from a hostile parent
    ok 2 - passes only platform launch inputs and private profile paths from a hostile parent
      ---
      duration_ms: 21.810676
      type: 'test'
      ...
    # Subtest: keeps cleanup bounded to the generated profile root
    ok 3 - keeps cleanup bounded to the generated profile root
      ---
      duration_ms: 12.179518
      type: 'test'
      ...
    # Subtest: accepts only a normalized absolute Windows SystemRoot directory
    ok 4 - accepts only a normalized absolute Windows SystemRoot directory
      ---
      duration_ms: 1.57294
      type: 'test'
      ...
    # Subtest: contains no parent environment spread, enumeration, denylist, PATH, or shell launch
    ok 5 - contains no parent environment spread, enumeration, denylist, PATH, or shell launch
      ---
      duration_ms: 4.50266
      type: 'test'
      ...
    # Subtest: serves each named fixture identity paired with its persisted credential
    ok 6 - serves each named fixture identity paired with its persisted credential
      ---
      duration_ms: 1.645887
      type: 'test'
      ...
    # Subtest: requires the adjacent packaged spawn options with LF or CRLF source
    ok 7 - requires the adjacent packaged spawn options with LF or CRLF source
      ---
      duration_ms: 2.161726
      type: 'test'
      ...
    1..7
ok 2 - packaged smoke child environment
  ---
  duration_ms: 45.882757
  type: 'suite'
  ...
1..2
# tests 13
# suites 2
# pass 13
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 294.447242

[8/378] apps/desktop/scripts/release-architecture.test.mjs
TAP version 13
# Subtest: machine-wide Windows artifacts require a real MSI compound file
ok 1 - machine-wide Windows artifacts require a real MSI compound file
  ---
  duration_ms: 7.480773
  type: 'test'
  ...
# Subtest: administrative MSI payload inspection
    # Subtest: uses exact fixed native extractor argv and minimal environments
    ok 1 - uses exact fixed native extractor argv and minimal environments
      ---
      duration_ms: 2.594747
      type: 'test'
      ...
    # Subtest: accepts only the canonical application with the one administrative root prefix
    ok 2 - accepts only the canonical application with the one administrative root prefix
      ---
      duration_ms: 11.663679
      type: 'test'
      ...
    # Subtest: rejects path escapes and case collisions from the Linux listing before extraction
    ok 3 - rejects path escapes and case collisions from the Linux listing before extraction
      ---
      duration_ms: 0.864742
      type: 'test'
      ...
    # Subtest: uses fixed missing and duplicate canonical-app codes with bounded counts
    ok 4 - uses fixed missing and duplicate canonical-app codes with bounded counts
      ---
      duration_ms: 9.120262
      type: 'test'
      ...
    # Subtest: distinguishes authority resources, unsafe trees, and architecture mismatch without path data
    ok 5 - distinguishes authority resources, unsafe trees, and architecture mismatch without path data
      ---
      duration_ms: 9.754188
      type: 'test'
      ...
    # Subtest: maps extractor failures to one redacted tool code
    ok 6 - maps extractor failures to one redacted tool code
      ---
      duration_ms: 4.09388
      type: 'test'
      ...
    # Subtest: retains compound-file, per-machine scope, and canonical PE evidence across extraction
    ok 7 - retains compound-file, per-machine scope, and canonical PE evidence across extraction
      ---
      duration_ms: 5.178224
      type: 'test'
      ...
    # Subtest: fails closed on extractor nonzero, stderr, output overflow, and timeout
    ok 8 - fails closed on extractor nonzero, stderr, output overflow, and timeout
      ---
      duration_ms: 132.947983
      type: 'test'
      ...
    1..8
ok 2 - administrative MSI payload inspection
  ---
  duration_ms: 177.240253
  type: 'suite'
  ...
# Subtest: DEB and RPM executable layouts
    # Subtest: accept only the canonical regular ELF payload and documented launcher symlink
    ok 1 - accept only the canonical regular ELF payload and documented launcher symlink
      ---
      duration_ms: 17.573304
      type: 'test'
      ...
    # Subtest: reject missing and extra payload names for both package formats
    ok 2 - reject missing and extra payload names for both package formats
      ---
      duration_ms: 15.385782
      type: 'test'
      ...
    # Subtest: reject unexpected same-name file types and non-ELF or cross-architecture payloads
    ok 3 - reject unexpected same-name file types and non-ELF or cross-architecture payloads
      ---
      duration_ms: 21.494685
      type: 'test'
      ...
    # Subtest: reject launcher escapes, cycles, and targets other than the canonical payload
    ok 4 - reject launcher escapes, cycles, and targets other than the canonical payload
      ---
      duration_ms: 12.97492
      type: 'test'
      ...
    # Subtest: reject special files with the executable name
    ok 5 - reject special files with the executable name
      ---
      duration_ms: 15.548468
      type: 'test'
      ...
    1..5
ok 3 - DEB and RPM executable layouts
  ---
  duration_ms: 83.38169
  type: 'suite'
  ...
# Subtest: DMG application layout
    # Subtest: accepts the real Forge tree with its install link and nested Electron helper bundles
    ok 1 - accepts the real Forge tree with its install link and nested Electron helper bundles
      ---
      duration_ms: 16.978341
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper bundle
    ok 2 - rejects a symbolic-link canonical helper bundle
      ---
      duration_ms: 8.515744
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper executable ancestor
    ok 3 - rejects a symbolic-link canonical helper executable ancestor
      ---
      duration_ms: 9.501274
      type: 'test'
      ...
    # Subtest: rejects every symbolic link outside canonical framework internals
    ok 4 - rejects every symbolic link outside canonical framework internals
      ---
      duration_ms: 12.279147
      type: 'test'
      ...
    # Subtest: rejects escaping, cyclic, missing, and case-mismatched framework symbolic links
    ok 5 - rejects escaping, cyclic, missing, and case-mismatched framework symbolic links
      ---
      duration_ms: 57.081124
      type: 'test'
      ...
    # Subtest: never treats Linux 7z sanitized install-link output as native layout evidence
    ok 6 - never treats Linux 7z sanitized install-link output as native layout evidence
      ---
      duration_ms: 12.907995
      type: 'test'
      ...
    # Subtest: rejects wrong bundles, alternate same-name executables, and canonical symlink escapes
    ok 7 - rejects wrong bundles, alternate same-name executables, and canonical symlink escapes
      ---
      duration_ms: 20.08857
      type: 'test'
      ...
    # Subtest: rejects alternate top-level application bundles
    ok 8 - rejects alternate top-level application bundles
      ---
      duration_ms: 8.266519
      type: 'test'
      ...
    # Subtest: rejects unsafe links inside the canonical application bundle
    ok 9 - rejects unsafe links inside the canonical application bundle
      ---
      duration_ms: 15.585285
      type: 'test'
      ...
    # Subtest: rejects non-helper nested application bundles
    ok 10 - rejects non-helper nested application bundles
      ---
      duration_ms: 11.567682
      type: 'test'
      ...
    # Subtest: rejects case-colliding top-level entries when the filesystem permits them
    ok 11 - rejects case-colliding top-level entries when the filesystem permits them
      ---
      duration_ms: 7.498006
      type: 'test'
      ...
    # Subtest: rejects special files inside the canonical application bundle
    ok 12 - rejects special files inside the canonical application bundle
      ---
      duration_ms: 16.490239
      type: 'test'
      ...
    1..12
ok 4 - DMG application layout
  ---
  duration_ms: 197.581586
  type: 'suite'
  ...
1..4
# tests 26
# suites 3
# pass 26
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 687.970456

[9/378] apps/desktop/scripts/release-artifacts.test.mjs
TAP version 13
# Subtest: desktop release artifacts
    # Subtest: stages named artifacts and finalizes unsigned validation metadata
    ok 1 - stages named artifacts and finalizes unsigned validation metadata
      ---
      duration_ms: 101.249158
      type: 'test'
      ...
    # Subtest: rejects extensionless, doubled-extension, case-conflicting, duplicate, wrong-kind, stale, and mixed-target names
    ok 2 - rejects extensionless, doubled-extension, case-conflicting, duplicate, wrong-kind, stale, and mixed-target names
      ---
      duration_ms: 271.008186
      type: 'test'
      ...
    # Subtest: rejects altered DMG bytes even when fragment artifact metadata is rewritten
    ok 3 - rejects altered DMG bytes even when fragment artifact metadata is rewritten
      ---
      duration_ms: 35.901853
      type: 'test'
      ...
    # Subtest: rejects permanent DMG replacement or in-place mutation during held inspection without emitting evidence
    ok 4 - rejects permanent DMG replacement or in-place mutation during held inspection without emitting evidence
      ---
      duration_ms: 11.647296
      type: 'test'
      ...
    # Subtest: keeps held A bytes, evidence, and publication stable when original and public pathnames change during inspection
    ok 5 - keeps held A bytes, evidence, and publication stable when original and public pathnames change during inspection
      ---
      duration_ms: 8.850573
      type: 'test'
      ...
    # Subtest: continues to reject a mutable pathname passed directly to DMG inspection
    ok 6 - continues to reject a mutable pathname passed directly to DMG inspection
      ---
      duration_ms: 0.340038
      type: 'test'
      ...
    # Subtest: requires explicit fixture authority for Windows-hosted DMG evidence tests
    ok 7 - requires explicit fixture authority for Windows-hosted DMG evidence tests # SKIP
      ---
      duration_ms: 0.076334
      type: 'test'
      ...
    # Subtest: accepts real Darwin mode-0700 directory and mode-0600 single-link file authority
    ok 8 - accepts real Darwin mode-0700 directory and mode-0600 single-link file authority # SKIP
      ---
      duration_ms: 0.062357
      type: 'test'
      ...
    # Subtest: rejects native Darwin broad mode, foreign owner, extra link, replacement type, and symlink with fixed authority codes
    ok 9 - rejects native Darwin broad mode, foreign owner, extra link, replacement type, and symlink with fixed authority codes # SKIP
      ---
      duration_ms: 0.098685
      type: 'test'
      ...
    # Subtest: accepts native xattr/ctime-only change when held bytes and identity are unchanged
    ok 10 - accepts native xattr/ctime-only change when held bytes and identity are unchanged # SKIP
      ---
      duration_ms: 0.235081
      type: 'test'
      ...
    # Subtest: does not emit claimed DMG layout evidence without the native-validation marker
    ok 11 - does not emit claimed DMG layout evidence without the native-validation marker
      ---
      duration_ms: 9.897991
      type: 'test'
      ...
    # Subtest: strictly rejects missing, mixed, stale, malformed, or fabricated native DMG evidence
    ok 12 - strictly rejects missing, mixed, stale, malformed, or fabricated native DMG evidence
      ---
      duration_ms: 363.497297
      type: 'test'
      ...
    # Subtest: rejects native DMG evidence copied between x64 and arm64 fragments
    ok 13 - rejects native DMG evidence copied between x64 and arm64 fragments
      ---
      duration_ms: 25.958889
      type: 'test'
      ...
    # Subtest: rejects duplicate target fragments before aggregation
    ok 14 - rejects duplicate target fragments before aggregation
      ---
      duration_ms: 34.858152
      type: 'test'
      ...
    # Subtest: rejects either Windows fragment when the installed ordinary-user application gate was skipped
    ok 15 - rejects either Windows fragment when the installed ordinary-user application gate was skipped
      ---
      duration_ms: 78.295979
      type: 'test'
      ...
    # Subtest: fails closed when trusted update signing configuration is incomplete
    ok 16 - fails closed when trusted update signing configuration is incomplete
      ---
      duration_ms: 72.900215
      type: 'test'
      ...
    # Subtest: signs cryptographically bound feeds only in the trusted release phase
    ok 17 - signs cryptographically bound feeds only in the trusted release phase
      ---
      duration_ms: 66.31067
      type: 'test'
      ...
    # Subtest: refuses to sign a renamed extensionless distributable
    ok 18 - refuses to sign a renamed extensionless distributable
      ---
      duration_ms: 43.129358
      type: 'test'
      ...
    # Subtest: refuses to sign when artifact bytes changed after unsigned finalization
    ok 19 - refuses to sign when artifact bytes changed after unsigned finalization
      ---
      duration_ms: 46.740212
      type: 'test'
      ...
    # Subtest: rejects unsigned production metadata and actual signer mismatches
    ok 20 - rejects unsigned production metadata and actual signer mismatches
      ---
      duration_ms: 93.083419
      type: 'test'
      ...
    # Subtest: rejects mixed Windows signers and tampered fingerprint evidence
    ok 21 - rejects mixed Windows signers and tampered fingerprint evidence
      ---
      duration_ms: 55.285748
      type: 'test'
      ...
    # Subtest: parses x64 and arm64 ELF, PE, and Mach-O executable fixtures
    ok 22 - parses x64 and arm64 ELF, PE, and Mach-O executable fixtures
      ---
      duration_ms: 6.259843
      type: 'test'
      ...
    # Subtest: derives Windows target architecture from the full NUPKG independently of its supported bootstrapper
    ok 23 - derives Windows target architecture from the full NUPKG independently of its supported bootstrapper
      ---
      duration_ms: 12.86791
      type: 'test'
      ...
    # Subtest: binds ZIP and NUPKG executables to exact maker-specific canonical paths
    ok 24 - binds ZIP and NUPKG executables to exact maker-specific canonical paths
      ---
      duration_ms: 4.235941
      type: 'test'
      ...
    # Subtest: rejects missing, corrupt, mismatched, and ambiguous packaged Windows authority helpers
    ok 25 - rejects missing, corrupt, mismatched, and ambiguous packaged Windows authority helpers
      ---
      duration_ms: 6.411167
      type: 'test'
      ...
    # Subtest: accepts only the real Forge macOS framework-internal symbolic-link layout
    ok 26 - accepts only the real Forge macOS framework-internal symbolic-link layout
      ---
      duration_ms: 5.208781
      type: 'test'
      ...
    # Subtest: rejects hostile macOS ZIP symbolic links before trusting their payloads
    ok 27 - rejects hostile macOS ZIP symbolic links before trusting their payloads
      ---
      duration_ms: 20.437186
      type: 'test'
      ...
    # Subtest: rejects unsafe, duplicate, shadowed, forged, alternate, and noncanonical archive layouts
    ok 28 - rejects unsafe, duplicate, shadowed, forged, alternate, and noncanonical archive layouts
      ---
      duration_ms: 7.677893
      type: 'test'
      ...
    # Subtest: rejects cross-labeled package architectures at staging and finalization
    ok 29 - rejects cross-labeled package architectures at staging and finalization
      ---
      duration_ms: 44.986943
      type: 'test'
      ...
    1..29
ok 1 - desktop release artifacts
  ---
  duration_ms: 1430.587635
  type: 'suite'
  ...
1..1
# tests 29
# suites 1
# pass 25
# fail 0
# cancelled 0
# skipped 4
# todo 0
# duration_ms 1671.019062

[10/378] apps/desktop/scripts/release-preflight.test.mjs
TAP version 13
# Subtest: desktop release preflight
    # Subtest: accepts only a new immutable tag reachable from protected main and a protected environment
    ok 1 - accepts only a new immutable tag reachable from protected main and a protected environment
      ---
      duration_ms: 4.534125
      type: 'test'
      ...
    # Subtest: accepts an authorization-visible bypass list and fails closed for hidden or denied ruleset details
    ok 2 - accepts an authorization-visible bypass list and fails closed for hidden or denied ruleset details
      ---
      duration_ms: 1.867303
      type: 'test'
      ...
    # Subtest: paginates repository rulesets and reads every full rule definition
    ok 3 - paginates repository rulesets and reads every full rule definition
      ---
      duration_ms: 4.98402
      type: 'test'
      ...
    # Subtest: requires an exact active bypass-free update and deletion tag ruleset
    ok 4 - requires an exact active bypass-free update and deletion tag ruleset
      ---
      duration_ms: 3.089726
      type: 'test'
      ...
    # Subtest: rejects ruleset mutation or deletion during preflight
    ok 5 - rejects ruleset mutation or deletion during preflight
      ---
      duration_ms: 1.899123
      type: 'test'
      ...
    # Subtest: requires the complete effective environment policy set to be exactly desktop-v* tags
    ok 6 - requires the complete effective environment policy set to be exactly desktop-v* tags
      ---
      duration_ms: 3.964567
      type: 'test'
      ...
    # Subtest: requires the separately protected preflight credential environment
    ok 7 - requires the separately protected preflight credential environment
      ---
      duration_ms: 0.801273
      type: 'test'
      ...
    # Subtest: paginates all environment policies and rejects a permissive policy on a later page
    ok 8 - paginates all environment policies and rejects a permissive policy on a later page
      ---
      duration_ms: 0.901461
      type: 'test'
      ...
    # Subtest: rejects missing or ambiguous environment protection and explicit API denial
    ok 9 - rejects missing or ambiguous environment protection and explicit API denial
      ---
      duration_ms: 1.47666
      type: 'test'
      ...
    # Subtest: rejects tags not created by this push, tags off main, and moved or existing releases
    ok 10 - rejects tags not created by this push, tags off main, and moved or existing releases
      ---
      duration_ms: 2.072618
      type: 'test'
      ...
    1..10
ok 1 - desktop release preflight
  ---
  duration_ms: 27.205937
  type: 'suite'
  ...
1..1
# tests 10
# suites 1
# pass 10
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 279.051358

[11/378] apps/desktop/scripts/release-publish.test.mjs
TAP version 13
# Subtest: atomic desktop release publication
    # Subtest: creates a draft, paginates and verifies the exact final assets, then publishes
    ok 1 - creates a draft, paginates and verifies the exact final assets, then publishes
      ---
      duration_ms: 184.472004
      type: 'test'
      ...
    # Subtest: leaves a partial upload as a recoverable draft and resumes only matching assets
    ok 2 - leaves a partial upload as a recoverable draft and resumes only matching assets
      ---
      duration_ms: 12.965703
      type: 'test'
      ...
    # Subtest: rejects unexpected, duplicate, size, and content-digest asset mismatches without publishing
    ok 3 - rejects unexpected, duplicate, size, and content-digest asset mismatches without publishing
      ---
      duration_ms: 10.969491
      type: 'test'
      ...
    # Subtest: rejects tag drift before publishing the verified draft
    ok 4 - rejects tag drift before publishing the verified draft
      ---
      duration_ms: 6.408455
      type: 'test'
      ...
    # Subtest: rejects local files outside or missing from finalized checksums
    ok 5 - rejects local files outside or missing from finalized checksums
      ---
      duration_ms: 2.796947
      type: 'test'
      ...
    1..5
ok 1 - atomic desktop release publication
  ---
  duration_ms: 219.154532
  type: 'suite'
  ...
1..1
# tests 5
# suites 1
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 450.512335

[12/378] apps/desktop/scripts/verify-darwin-image.test.mjs
TAP version 13
# Subtest: Darwin image verification retries only bounded documented resource states
ok 1 - Darwin image verification retries only bounded documented resource states
  ---
  duration_ms: 14.044976
  type: 'test'
  ...
# Subtest: Darwin image verification does not retry malformed/truncated images or accept mutation
ok 2 - Darwin image verification does not retry malformed/truncated images or accept mutation
  ---
  duration_ms: 10.923893
  type: 'test'
  ...
# Subtest: Darwin image verification holds a fixed hdiutil image behind a real mutation and replacement barrier
ok 3 - Darwin image verification holds a fixed hdiutil image behind a real mutation and replacement barrier # SKIP
  ---
  duration_ms: 0.293471
  type: 'test'
  ...
1..3
# tests 3
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 244.793834

[13/378] apps/desktop/scripts/windows-fixture-acl.test.mjs
TAP version 13
# Subtest: keeps the encoded Windows PowerShell 5.1 ACL helper fail-closed and byte-empty
ok 1 - keeps the encoded Windows PowerShell 5.1 ACL helper fail-closed and byte-empty # SKIP
  ---
  duration_ms: 0.704241
  type: 'test'
  ...
1..1
# tests 1
# suites 0
# pass 0
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 223.001077

[14/378] apps/desktop/scripts/windows-packaged-connect-staging.test.mjs
TAP version 13
# Subtest: capture redirection mismatch reporting is total and redacted for each launch predicate
ok 1 - capture redirection mismatch reporting is total and redacted for each launch predicate
  ---
  duration_ms: 3.581879
  type: 'test'
  ...
# Subtest: positive host Node producer failures expose only fixed allowlisted evidence
ok 2 - positive host Node producer failures expose only fixed allowlisted evidence
  ---
  duration_ms: 1.06595
  type: 'test'
  ...
# Subtest: hostile diagnostics reject uppercase PATH without matching fixed path subphases
ok 3 - hostile diagnostics reject uppercase PATH without matching fixed path subphases
  ---
  duration_ms: 0.160862
  type: 'test'
  ...
# Subtest: packaged Windows Connect staging contract
    # Subtest: accepts only the exact generated leaf below the fixed canonical staging parent
    ok 1 - accepts only the exact generated leaf below the fixed canonical staging parent
      ---
      duration_ms: 1.947653
      type: 'test'
      ...
    # Subtest: accepts one bounded parent-owned handoff and rejects every other input shape
    ok 2 - accepts one bounded parent-owned handoff and rejects every other input shape
      ---
      duration_ms: 0.843894
      type: 'test'
      ...
    # Subtest: emits only fixed staged-contract predicate evidence
    ok 3 - emits only fixed staged-contract predicate evidence
      ---
      duration_ms: 0.985298
      type: 'test'
      ...
    # Subtest: rejects missing, inaccessible, reparse, wrong-type, and noncanonical entries before preflight
    ok 4 - rejects missing, inaccessible, reparse, wrong-type, and noncanonical entries before preflight
      ---
      duration_ms: 2.07345
      type: 'test'
      ...
    # Subtest: proves target PE architecture and ordinary-user access before returning the executable
    ok 5 - proves target PE architecture and ordinary-user access before returning the executable
      ---
      duration_ms: 1.621843
      type: 'test'
      ...
    # Subtest: maps a hostile preflight callback throw totally and redacts all supplied evidence
    ok 6 - maps a hostile preflight callback throw totally and redacts all supplied evidence
      ---
      duration_ms: 1.019242
      type: 'test'
      ...
    # Subtest: keeps PE type and architecture failures distinct
    ok 7 - keeps PE type and architecture failures distinct
      ---
      duration_ms: 0.784492
      type: 'test'
      ...
    # Subtest: maps hostile exceptions to a fixed path-free allowlist
    ok 8 - maps hostile exceptions to a fixed path-free allowlist
      ---
      duration_ms: 0.657814
      type: 'test'
      ...
    # Subtest: classifies fixed phases without collapsing pre-spawn failures into spawn
    ok 9 - classifies fixed phases without collapsing pre-spawn failures into spawn
      ---
      duration_ms: 0.4425
      type: 'test'
      ...
    # Subtest: maps every preflight transport and exit result to fixed subphase evidence
    ok 10 - maps every preflight transport and exit result to fixed subphase evidence
      ---
      duration_ms: 1.156289
      type: 'test'
      ...
    # Subtest: preflight diagnostics exclude path, SID, account name, stdout, and stderr evidence
    ok 11 - preflight diagnostics exclude path, SID, account name, stdout, and stderr evidence
      ---
      duration_ms: 0.467427
      type: 'test'
      ...
    # Subtest: scopes staged-root and executable leak needles to Windows
    ok 12 - scopes staged-root and executable leak needles to Windows
      ---
      duration_ms: 0.314651
      type: 'test'
      ...
    1..12
ok 4 - packaged Windows Connect staging contract
  ---
  duration_ms: 13.435915
  type: 'suite'
  ...
# Subtest: the workflow stages before alternate credentials and the harness preflights before application spawn
not ok 5 - the workflow stages before alternate credentials and the harness preflights before application spawn
  ---
  duration_ms: 29.072008
  type: 'test'
  location: '/home/runner/work/propr/propr/apps/desktop/scripts/windows-packaged-connect-staging.test.mjs:916:1'
  failureType: 'testCodeFailure'
  error: 'ordinary-user package preflight must complete before spawn'
  code: 'ERR_ASSERTION'
  name: 'AssertionError'
  expected: true
  actual: false
  operator: '=='
  stack: |-
    TestContext.<anonymous> (file:///home/runner/work/propr/propr/apps/desktop/scripts/windows-packaged-connect-staging.test.mjs:1266:10)
    async Test.run (node:internal/test_runner/test:1054:7)
    async Test.processPendingSubtests (node:internal/test_runner/test:744:7)
  ...
# Subtest: the PS5.1 child-failure parser accepts only the two exact bounded producer schemas
ok 6 - the PS5.1 child-failure parser accepts only the two exact bounded producer schemas # SKIP
  ---
  duration_ms: 0.772149
  type: 'test'
  ...
# Subtest: the PS5.1 capture parser enforces native owner ACL path and identity authority
ok 7 - the PS5.1 capture parser enforces native owner ACL path and identity authority # SKIP
  ---
  duration_ms: 0.090079
  type: 'test'
  ...
# Subtest: nominal reaches zero with exact protected stdout and stderr capture
ok 8 - nominal reaches zero with exact protected stdout and stderr capture # SKIP
  ---
  duration_ms: 0.063289
  type: 'test'
  ...
# Subtest: a forced nonzero capture producer maps only to redirect-child-exit
ok 9 - a forced nonzero capture producer maps only to redirect-child-exit # SKIP
  ---
  duration_ms: 0.057497
  type: 'test'
  ...
# Subtest: empty and hostile producer results map only to fixed bounded buckets
ok 10 - empty and hostile producer results map only to fixed bounded buckets # SKIP
  ---
  duration_ms: 0.15488
  type: 'test'
  ...
# Subtest: each host preflight failure transition emits one fixed redacted subphase
ok 11 - each host preflight failure transition emits one fixed redacted subphase # SKIP
  ---
  duration_ms: 0.078697
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects zero command evidence
ok 12 - the PS5.1 host Node producer rejects zero command evidence # SKIP
  ---
  duration_ms: 0.070622
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects duplicate command evidence
ok 13 - the PS5.1 host Node producer rejects duplicate command evidence # SKIP
  ---
  duration_ms: 0.056816
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects multiple command evidence
ok 14 - the PS5.1 host Node producer rejects multiple command evidence # SKIP
  ---
  duration_ms: 0.05348
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects mixed-types command evidence
ok 15 - the PS5.1 host Node producer rejects mixed-types command evidence # SKIP
  ---
  duration_ms: 0.054553
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects case-collision command evidence
ok 16 - the PS5.1 host Node producer rejects case-collision command evidence # SKIP
  ---
  duration_ms: 0.059462
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects non-application command evidence
ok 17 - the PS5.1 host Node producer rejects non-application command evidence # SKIP
  ---
  duration_ms: 0.057157
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects missing-source command evidence
ok 18 - the PS5.1 host Node producer rejects missing-source command evidence # SKIP
  ---
  duration_ms: 0.055273
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects non-scalar-source command evidence
ok 19 - the PS5.1 host Node producer rejects non-scalar-source command evidence # SKIP
  ---
  duration_ms: 0.056816
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer returns one validated scalar Source
ok 20 - the PS5.1 host Node producer returns one validated scalar Source # SKIP
  ---
  duration_ms: 0.097764
  type: 'test'
  ...
# Subtest: the host launcher accepts only a stable final ordinary-file identity
ok 21 - the host launcher accepts only a stable final ordinary-file identity # SKIP
  ---
  duration_ms: 0.066776
  type: 'test'
  ...
# Subtest: the bounded cleanup source requires proven child exit and bounded stream closure
ok 22 - the bounded cleanup source requires proven child exit and bounded stream closure
  ---
  duration_ms: 11.063264
  type: 'test'
  ...
# Subtest: the native timeout path terminates an actual child and descendant tree
ok 23 - the native timeout path terminates an actual child and descendant tree # SKIP
  ---
  duration_ms: 0.184846
  type: 'test'
  ...
# Subtest: a real never-settling cleanup is bounded, terminated, and remains secondary
ok 24 - a real never-settling cleanup is bounded, terminated, and remains secondary # SKIP
  ---
  duration_ms: 0.081834
  type: 'test'
  ...
1..24
# tests 35
# suites 1
# pass 16
# fail 1
# cancelled 0
# skipped 18
# todo 0
# duration_ms 319.43288

[15/378] apps/desktop/src/connect-discovery.test.ts
TAP version 13
# Subtest: desktop fixed-root Connect discovery
    # Subtest: projects only a stable opaque profile and canonical endpoint
    ok 1 - projects only a stable opaque profile and canonical endpoint
      ---
      duration_ms: 2.018396
      type: 'test'
      ...
    # Subtest: fences rediscovery to an existing managed profile and preserves its id and label
    ok 2 - fences rediscovery to an existing managed profile and preserves its id and label
      ---
      duration_ms: 0.925326
      type: 'test'
      ...
    # Subtest: discards rediscovery when the exact saved profile changes while native discovery awaits
    ok 3 - discards rediscovery when the exact saved profile changes while native discovery awaits
      ---
      duration_ms: 0.522781
      type: 'test'
      ...
    # Subtest: fails closed for unsupported hosts and malformed native results
    ok 4 - fails closed for unsupported hosts and malformed native results
      ---
      duration_ms: 0.546555
      type: 'test'
      ...
    # Subtest: generation-conditionally clears failed intents while keeping prior activations fenced
    ok 5 - generation-conditionally clears failed intents while keeping prior activations fenced
      ---
      duration_ms: 0.713198
      type: 'test'
      ...
    # Subtest: scopes discovery freshness per profile and only discards stale same-profile completions
    ok 6 - scopes discovery freshness per profile and only discards stale same-profile completions
      ---
      duration_ms: 0.400572
      type: 'test'
      ...
    1..6
ok 1 - desktop fixed-root Connect discovery
  ---
  duration_ms: 6.265064
  type: 'suite'
  ...
1..1
# tests 6
# suites 1
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 469.529876

[16/378] apps/desktop/src/credential-service.pairing-browser.test.ts
TAP version 13
# Subtest: DesktopCredentialService pairing browser sink
    # Subtest: pairs through the browser journey and rejects a response URL replacement
    ok 1 - pairs through the browser journey and rejects a response URL replacement
      ---
      duration_ms: 126.567965
      type: 'test'
      ...
    1..1
ok 1 - DesktopCredentialService pairing browser sink
  ---
  duration_ms: 127.539778
  type: 'suite'
  ...
1..1
# tests 1
# suites 1
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 679.323752

[17/378] apps/desktop/src/credential-service.test.ts
TAP version 13
# Subtest: main-process desktop credential service
    # Subtest: fails a relaunched same-origin replacement closed before sending the stored bearer
    ok 1 - fails a relaunched same-origin replacement closed before sending the stored bearer
      ---
      duration_ms: 112.260769
      type: 'test'
      ...
    # Subtest: fails malformed identity closed and classifies legacy public-discovery 401 safely
    ok 2 - fails malformed identity closed and classifies legacy public-discovery 401 safely
      ---
      duration_ms: 78.98926
      type: 'test'
      ...
    # Subtest: revalidates an old Socket.IO reconnect and sends zero bearer requests after identity rotation
    ok 3 - revalidates an old Socket.IO reconnect and sends zero bearer requests after identity rotation
      ---
      duration_ms: 51.535439
      type: 'test'
      ...
    # Subtest: fences old and concurrently rotated Connect claims through pairing, commit, and transport activation
    ok 4 - fences old and concurrently rotated Connect claims through pairing, commit, and transport activation
      ---
      duration_ms: 245.206362
      type: 'test'
      ...
    # Subtest: injects the active bearer only for its bound profile origin and strips renderer identity
    ok 5 - injects the active bearer only for its bound profile origin and strips renderer identity
      ---
      duration_ms: 60.522953
      type: 'test'
      ...
    # Subtest: uses only the active bearer when profiles share an origin and never a cookie identity
    ok 6 - uses only the active bearer when profiles share an origin and never a cookie identity
      ---
      duration_ms: 75.300742
      type: 'test'
      ...
    # Subtest: detaches origin and identity mismatches before bearer use or early protocol exits
    ok 7 - detaches origin and identity mismatches before bearer use or early protocol exits
      ---
      duration_ms: 149.590113
      type: 'test'
      ...
    # Subtest: does not mint a ticket when a delayed B probe observes credential replacement with origin A
    ok 8 - does not mint a ticket when a delayed B probe observes credential replacement with origin A
      ---
      duration_ms: 44.845549
      type: 'test'
      ...
    # Subtest: atomically rejects a ticket when delayed activation races with profile B credential A
    ok 9 - atomically rejects a ticket when delayed activation races with profile B credential A
      ---
      duration_ms: 54.474441
      type: 'test'
      ...
    # Subtest: keeps a slow successful same-origin A probe status-only after fast B activates
    ok 10 - keeps a slow successful same-origin A probe status-only after fast B activates
      ---
      duration_ms: 73.205086
      type: 'test'
      ...
    # Subtest: keeps A active while B is only probed and if B selection persistence fails
    ok 11 - keeps A active while B is only probed and if B selection persistence fails
      ---
      duration_ms: 85.132937
      type: 'test'
      ...
    # Subtest: keeps B active during a direct same-origin A probe and rejects replayed activation tickets
    ok 12 - keeps B active during a direct same-origin A probe and rejects replayed activation tickets
      ---
      duration_ms: 77.253773
      type: 'test'
      ...
    # Subtest: rejects activation after candidate removal, selection drift, or exact credential replacement
    ok 13 - rejects activation after candidate removal, selection drift, or exact credential replacement
      ---
      duration_ms: 259.90765
      type: 'test'
      ...
    # Subtest: binds REST and Socket.IO work to one fresh scope and rejects stale or malformed markers
    ok 14 - binds REST and Socket.IO work to one fresh scope and rejects stale or malformed markers
      ---
      duration_ms: 77.334625
      type: 'test'
      ...
    # Subtest: passes through a realistic packaged-origin CORS preflight without renderer identity or bearer injection
    ok 15 - passes through a realistic packaged-origin CORS preflight without renderer identity or bearer injection
      ---
      duration_ms: 0.381185
      type: 'test'
      ...
    # Subtest: rotates scope on every same-profile reprobe and rejects a cold reconnect from the old activation
    ok 16 - rotates scope on every same-profile reprobe and rejects a cold reconnect from the old activation
      ---
      duration_ms: 60.988855
      type: 'test'
      ...
    # Subtest: never sends an A-origin bearer after the profile URL is edited to an attacker origin
    ok 17 - never sends an A-origin bearer after the profile URL is edited to an attacker origin
      ---
      duration_ms: 28.124802
      type: 'test'
      ...
    # Subtest: preserves a re-paired credential and current connection after a stale definitive probe response
    ok 18 - preserves a re-paired credential and current connection after a stale definitive probe response
      ---
      duration_ms: 94.393079
      type: 'test'
      ...
    # Subtest: preserves a replacement credential at a changed origin after a stale definitive probe response
    ok 19 - preserves a replacement credential at a changed origin after a stale definitive probe response
      ---
      duration_ms: 82.193742
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during browser-launch
    ok 20 - preserves the active profile and credential when an origin edit fails during browser-launch
      ---
      duration_ms: 52.702448
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during cancellation
    ok 21 - preserves the active profile and credential when an origin edit fails during cancellation
      ---
      duration_ms: 64.001966
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during expiry
    ok 22 - preserves the active profile and credential when an origin edit fails during expiry
      ---
      duration_ms: 50.860631
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during polling
    ok 23 - preserves the active profile and credential when an origin edit fails during polling
      ---
      duration_ms: 56.254824
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during secure-storage
    ok 24 - preserves the active profile and credential when an origin edit fails during secure-storage
      ---
      duration_ms: 64.29207
      type: 'test'
      ...
    # Subtest: commits an edited profile and replacement credential before revoking the old token
    ok 25 - commits an edited profile and replacement credential before revoking the old token
      ---
      duration_ms: 87.672692
      type: 'test'
      ...
# NATIVE_SCENARIO delivery
    # Subtest: durably journals a provisional delivery before server activation and local publication
    ok 26 - durably journals a provisional delivery before server activation and local publication
      ---
      duration_ms: 39.437868
      type: 'test'
      ...
    # Subtest: retries an encrypted pending A revocation across failure, restart, remote success, and local cleanup failure
    ok 27 - retries an encrypted pending A revocation across failure, restart, remote success, and local cleanup failure
      ---
      duration_ms: 208.902382
      type: 'test'
      ...
# NATIVE_SCENARIO revocation-crash
    # Subtest: recovers B and retries idempotently after a real process crash during-revoke
    ok 28 - recovers B and retries idempotently after a real process crash during-revoke
      ---
      duration_ms: 535.785501
      type: 'test'
      ...
# NATIVE_SCENARIO revocation-crash
    # Subtest: recovers B and retries idempotently after a real process crash after-remote-success
    ok 29 - recovers B and retries idempotently after a real process crash after-remote-success
      ---
      duration_ms: 517.663499
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 204 success
    ok 30 - cleans durable retry material only for endpoint-bound terminal 204 success
      ---
      duration_ms: 36.679801
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 404 TOKEN_NOT_FOUND
    ok 31 - cleans durable retry material only for endpoint-bound terminal 404 TOKEN_NOT_FOUND
      ---
      duration_ms: 50.506179
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_REVOKED
    ok 32 - cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_REVOKED
      ---
      duration_ms: 42.411591
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_EXPIRED
    ok 33 - cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_EXPIRED
      ---
      duration_ms: 44.899305
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 401
    ok 34 - retains encrypted retry material for empty 401
      ---
      duration_ms: 27.331272
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 404
    ok 35 - retains encrypted retry material for empty 404
      ---
      duration_ms: 32.140299
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for HTML route 404
    ok 36 - retains encrypted retry material for HTML route 404
      ---
      duration_ms: 31.485621
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for malformed JSON
    ok 37 - retains encrypted retry material for malformed JSON
      ---
      duration_ms: 29.893144
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong content type
    ok 38 - retains encrypted retry material for wrong content type
      ---
      duration_ms: 44.807911
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong schema version
    ok 39 - retains encrypted retry material for wrong schema version
      ---
      duration_ms: 32.298011
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong credential generation
    ok 40 - retains encrypted retry material for wrong credential generation
      ---
      duration_ms: 28.414625
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for unknown terminal code
    ok 41 - retains encrypted retry material for unknown terminal code
      ---
      duration_ms: 30.648115
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for status/code mismatch
    ok 42 - retains encrypted retry material for status/code mismatch
      ---
      duration_ms: 31.514228
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirect
    ok 43 - retains encrypted retry material for redirect
      ---
      duration_ms: 29.922479
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirected 204
    ok 44 - retains encrypted retr

...(truncated)

View Workflow

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

/review opus

@integry integry added the AI label Sep 4, 2026
@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Normal ProPR implementation follow-up on exact #2089 head fb4d1c71809e7e96467b37d41b48343e4fc508a6; do not invoke the specialized /merge worker. First incorporate corrected transport bf6c3addd9e38ea7605be2564015fefa095bbcd2 (which contains corrected top a2c71737 and main c895c188) as a true non-fast-forward merge. In the mandated worktree run the merge and preserve MERGE_HEAD for the system commit; if Git admin ownership prevents that, resolve in a standalone worktree and use Git Data API so transport is a real ancestor rather than flattening the tree. Push only the existing #2089 branch; do not merge the PR.

The audited merge has exactly two expected conflicts. In root package.json preserve pretest:unit and test:prepare, and union test:unit so both test/agentImagePreparation.test.ts and packages/api/test/desktopApiBoundary.test.ts occur exactly once with no removed tests. In packages/api/server.ts retain both registerDesktopApiBoundary and the visual-preview OAuth refresh scheduler, with public desktop discovery/pair bootstrap before API auth, desktop approval/token/revoke after auth as designed, visual-preview routes privilege-protected, and both cleanup schedulers shut down.

Then implement the remaining Mac/Linux/shared correction on the composed tree. Current four packaged Mac/Linux lanes reach ACTIVATE READY, trusted main-frame XHR ownership, and JOURNEY_PAIR_REACT_CONNECTED, but fail before .desktop-connection-pill.desktop-connection-ready, titlebar/dashboard proof, authenticated REST/socket evidence, and completion. Diagnose and fix the real post-activation renderer/auth/dashboard integration; do not weaken, skip, or merely lengthen the proof. Darwin x64 also intermittently exits at JOURNEY_PAIR_BROWSER_APPROVAL; remove the packaged approval-session race while preserving isolated ephemeral session, strict navigation, cleanup, and no credential leakage. Add bounded fixed-code diagnostics that expose the failing stage/reason without URLs, tokens, paths, environment values, or response bodies.

Structurally refactor DesktopExperience.tsx and its oversized test file below the enforced 400-line limit without behavior loss. Fix only the cross-platform-executed Windows staging source-order assertion if it is still stale after composition; no Windows runtime, packaging, signing, or feature work. Preserve the exact narrow credentialless legacy /api/desktop/discovery JSON 401 classification and keep redirects, HTML/problem+json, malformed/extra/duplicate/oversize/bad-UTF8 responses fail-closed; preserve #2086 identity/profile/origin/generation/scope fencing, pre-abort/deadline/late-body disposal, Connect rotation, and all visual-preview/setup/main changes.

Verify diff-check, marker/secret scan, typechecks, focused UI/auth/status/pairing/approval/session/transport tests, platform-safe Connect exactly 86/86, native durability exactly 120/120 for this branch, and all four packaged plus unsigned Mac/Linux lanes through JOURNEY_PAIR_COMPLETE and reprobe completion where available. Run the bounded shared/full suite; classify the known registry-dependent config-followup fixture and npm audit 5xx as infrastructure rather than weakening gates. No unrelated changes or preview.

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🛑 Execution Cancelled

The task processing was stopped by user request.

You can post a new comment to restart processing.

@integry integry added AI and removed AI labels Sep 4, 2026
@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Retry the exact implementation request in #2089 (comment) after the prior worker container disappeared before publishing. Reproduce the already-green narrow Socket.IO transport-scope handshake fix, bounded Darwin approval-completion barrier, redacted bounded diagnostics, below-400-line UI/test refactor, and shared Windows source assertion only. First perform the required true merge of transport bf6c3ad, resolve only the two documented conflicts exactly, and preserve it as a real second parent. Re-run the exact 86/86 platform-safe and 120/120 native gates plus focused suites. Do not spend the run waiting on unavailable local Redis or registry infrastructure: classify those prerequisites after bounded checks, publish the verified tree through Git Data API, and then monitor the four Mac/Linux packaged lanes. Do not merge the PR and do not do Windows runtime/package work.

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🛑 Execution Cancelled

The task processing was stopped by user request.

You can post a new comment to restart processing.

@integry integry removed the AI label Sep 4, 2026
@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Published the verified manual fallback after two ProPR workers stopped before producing a commit. Commit 5c24b384b6c52a626a3c74ab2aab4006b3d6db48 is a true merge with parents fb4d1c71809e7e96467b37d41b48343e4fc508a6 and transport bf6c3addd9e38ea7605be2564015fefa095bbcd2. Local Node 22 validation: platform-safe Connect 86/86; native durability 120/120 with all category counts; composed unit suite 295/295; focused UI 93/93; client 72/72; approval 18/18; diagnostics/staging 47 passed with 18 Windows-runtime skips; diff/marker/secret scans and independent structure/security audits clean. No Windows runtime/package work was added.

@integry integry added the AI label Sep 4, 2026
@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

/ultrafix goal=9 max=3

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🔄 Ultrafix loop started (goal: 9/10, max cycles: 3)

First action: /review

💡 Tip: Remove the ultrafix label from this PR to stop further ultrafix cycles.

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Implement only the three exact Mac/Linux CI corrections on current head 5c24b384b6c52a626a3c74ab2aab4006b3d6db48; do not merge, rebase, flatten ancestry, or do Windows runtime/package work.

  1. Linux packaged journey evidence: smoke-packaged-connect.mjs incorrectly requires at least three poll requests. The designed negative expiry expires after 200 ms before its 1-second initial poll, cancellation occurs after 50 ms before that poll, and only the successful pairing polls once. Change the strict evidence invariant from pairingPolls.length < 3 to pairingPolls.length !== 1, while retaining exactly three pairing starts, exactly three browser approvals, and exactly one activation. Extract or add a regression test proving the expected 3 starts / 3 browser approvals / 1 poll / 1 activation accounting; do not weaken any discovery, bearer, scope-rotation, plaintext, or ordering proof.

  2. Darwin unsigned CI Keychain reprobe: pair succeeds but the second process reports safeStorage.isEncryptionAvailable() === false at JOURNEY_STORAGE_BACKEND. In the already generated, isolated, unlocked, disposable keychain in desktop-connect-discovery-guard.yml, pre-seed Electron Safe Storage before either app launch using the exact product item (service ProPR Desktop Safe Storage, account ProPR Desktop) with a fresh random secret and a noninteractive ACL suitable only for this disposable unsigned-CI keychain. Unset the secret before launching. Keep the actual os-protected backend requirement, two-process persistence proof, original keychain restoration, and keychain deletion. Add/update the source-contract test and ensure no value can enter logs. Do not add in-app retries: Electron 44 permanently disables Keychain attempts in a process after the first lookup failure.

  3. Darwin x64 isolated approval: createPackagedApprovalNavigation currently cancels any incidental non-main request and also calls rejectBoundary, invalidating an otherwise exact successful approval. Cancel resource requests whose resourceType !== "mainFrame" without invalidating the approved navigation. Continue to reject and invalidate wrong/second main-frame requests, all subframe navigation, redirects, credential headers, popups, downloads, and webviews. Add a test proving an incidental favicon/image request is canceled while the exact credentialless main-frame GET can complete; preserve existing adversarial tests. Bound approval-session cleanup so failure reporting cannot hang for about a minute, without swallowing cleanup failure or allowing storage reuse.

Run the approval/lifecycle/platform tests, exact 86/86 platform-safe and 120/120 native gates, focused client/UI/auth suites, diff/marker/secret scans, and publish to this existing PR branch. Then monitor all four Mac/Linux packaged and unsigned lanes. Classify registry audit 5xx/undefined failures as infrastructure; do not weaken those gates.

@integry integry added the AI label Sep 4, 2026
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

Full Test Suite Results

Validation failed during: Full test suite.

  • Dependency install: success
  • Workspace build: success
  • Docs validation: success
  • Redis startup: success
  • Full test suite: failure
View Test Output

> propr@0.8.15 test:full:prepared
> npm run test:server


> propr@0.8.15 test:server
> node scripts/run-test-suite.mjs


[1/385] apps/desktop/scripts/assert-windows-mvp-package.test.mjs
TAP version 13
# Subtest: Windows MVP ASAR main entry
    # Subtest: uses the rooted listPackage representation accepted by extractFile
    ok 1 - uses the rooted listPackage representation accepted by extractFile
      ---
      duration_ms: 29.125784
      type: 'test'
      ...
    # Subtest: preserves the Windows separator after removing the one archive root
    ok 2 - preserves the Windows separator after removing the one archive root
      ---
      duration_ms: 0.228108
      type: 'test'
      ...
    # Subtest: rejects traversal, duplicate entries, and case-colliding main paths
    ok 3 - rejects traversal, duplicate entries, and case-colliding main paths
      ---
      duration_ms: 0.706605
      type: 'test'
      ...
    1..3
ok 1 - Windows MVP ASAR main entry
  ---
  duration_ms: 31.066442
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 286.873019

[2/385] apps/desktop/scripts/build-windows-machine-installer.test.mjs
TAP version 13
# Subtest: sets explicit Windows-1252 MSI and summary code pages in probe and production WXS
ok 1 - sets explicit Windows-1252 MSI and summary code pages in probe and production WXS
  ---
  duration_ms: 1.767995
  type: 'test'
  ...
# Subtest: accepts the exact MSI ProductVersion boundary and retains version and upgrade identity in WXS
ok 2 - accepts the exact MSI ProductVersion boundary and retains version and upgrade identity in WXS
  ---
  duration_ms: 0.445055
  type: 'test'
  ...
# Subtest: rejects every unsupported ProductVersion at the direct installer builder entry point
ok 3 - rejects every unsupported ProductVersion at the direct installer builder entry point
  ---
  duration_ms: 1.613074
  type: 'test'
  ...
# Subtest: uses per-machine scope without explicitly authoring the derived ALLUSERS property
ok 4 - uses per-machine scope without explicitly authoring the derived ALLUSERS property
  ---
  duration_ms: 0.407003
  type: 'test'
  ...
# Subtest: authors the complete per-machine Start Menu contract for x64 and ARM64
ok 5 - authors the complete per-machine Start Menu contract for x64 and ARM64
  ---
  duration_ms: 0.807574
  type: 'test'
  ...
# Subtest: selects only the installed x64 WiX directory or an explicit ARM64 build directory
ok 6 - selects only the installed x64 WiX directory or an explicit ARM64 build directory
  ---
  duration_ms: 0.548157
  type: 'test'
  ...
# Subtest: uses a ten-minute timeout only for production Light
ok 7 - uses a ten-minute timeout only for production Light
  ---
  duration_ms: 0.260388
  type: 'test'
  ...
# Subtest: keeps WiX processes and their emitted diagnostics bounded
ok 8 - keeps WiX processes and their emitted diagnostics bounded
  ---
  duration_ms: 0.179166
  type: 'test'
  ...
# Subtest: emits WiX v3 default registry values without empty Name attributes
ok 9 - emits WiX v3 default registry values without empty Name attributes
  ---
  duration_ms: 0.406092
  type: 'test'
  ...
1..9
# tests 9
# suites 0
# pass 9
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 246.138732

[3/385] apps/desktop/scripts/packaged-connect-launch.test.mjs
TAP version 13
# Subtest: packaged Connect launch boundary
    # Subtest: passes the one effective Linux argv through the actual binary spawn
    ok 1 - passes the one effective Linux argv through the actual binary spawn
      ---
      duration_ms: 1.313963
      type: 'test'
      ...
    # Subtest: does not add the Linux password-store selection on Darwin
    ok 2 - does not add the Linux password-store selection on Darwin
      ---
      duration_ms: 0.148709
      type: 'test'
      ...
    # Subtest: the lifecycle and real binary spawn share the derived argv source
    ok 3 - the lifecycle and real binary spawn share the derived argv source
      ---
      duration_ms: 5.139045
      type: 'test'
      ...
    1..3
ok 1 - packaged Connect launch boundary
  ---
  duration_ms: 7.770318
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 231.24426

[4/385] apps/desktop/scripts/packaged-connect-lifecycle.test.mjs
TAP version 13
# Subtest: packaged Connect bounded child lifecycle
    # Subtest: accepts an exact ready proof followed by a clean exit
    ok 1 - accepts an exact ready proof followed by a clean exit
      ---
      duration_ms: 5.768424
      type: 'test'
      ...
    # Subtest: does not accept an intermediate discovery milestone as terminal readiness
    ok 2 - does not accept an intermediate discovery milestone as terminal readiness
      ---
      duration_ms: 2.323947
      type: 'test'
      ...
    # Subtest: returns only exact allowlisted journey stages
    ok 3 - returns only exact allowlisted journey stages
      ---
      duration_ms: 2.532168
      type: 'test'
      ...
    # Subtest: retains the latest bounded journey stage when earlier diagnostics fill the cap
    ok 4 - retains the latest bounded journey stage when earlier diagnostics fill the cap
      ---
      duration_ms: 3.22185
      type: 'test'
      ...
    # Subtest: retains only fixed terminal journey failure evidence when diagnostics fill the cap
    ok 5 - retains only fixed terminal journey failure evidence when diagnostics fill the cap
      ---
      duration_ms: 3.499823
      type: 'test'
      ...
    # Subtest: drops non-allowlisted terminal journey failure fields
    ok 6 - drops non-allowlisted terminal journey failure fields
      ---
      duration_ms: 1.728771
      type: 'test'
      ...
    # Subtest: returns only fixed secret-free Local Network Access decision evidence
    ok 7 - returns only fixed secret-free Local Network Access decision evidence
      ---
      duration_ms: 2.289763
      type: 'test'
      ...
    # Subtest: fails closed when an otherwise allowlisted journey stage contains a secret
    ok 8 - fails closed when an otherwise allowlisted journey stage contains a secret
      ---
      duration_ms: 1.679649
      type: 'test'
      ...
    # Subtest: publishes the sole terminal READY only after each real journey phase
    ok 9 - publishes the sole terminal READY only after each real journey phase
      ---
      duration_ms: 22.909018
      type: 'test'
      ...
    # Subtest: forces a ready app with a hung descendant through an exact bounded taskkill invocation
    ok 10 - forces a ready app with a hung descendant through an exact bounded taskkill invocation
      ---
      duration_ms: 6.814496
      type: 'test'
      ...
    # Subtest: keeps timeout-before-ready primary while terminating and draining the tree
    ok 11 - keeps timeout-before-ready primary while terminating and draining the tree
      ---
      duration_ms: 16.61377
      type: 'test'
      ...
    # Subtest: classifies asynchronous spawn errors without exposing their message
    ok 12 - classifies asynchronous spawn errors without exposing their message
      ---
      duration_ms: 5.97493
      type: 'test'
      ...
    # Subtest: settles close/timeout races once and never upgrades an early exit to success
    ok 13 - settles close/timeout races once and never upgrades an early exit to success
      ---
      duration_ms: 0.612568
      type: 'test'
      ...
    # Subtest: accepts a clean post-proof close racing a taskkill no-process result
    ok 14 - accepts a clean post-proof close racing a taskkill no-process result
      ---
      duration_ms: 5.4353
      type: 'test'
      ...
    # Subtest: rejects malformed, partial, truncated, and extra-field ready records
    ok 15 - rejects malformed, partial, truncated, and extra-field ready records
      ---
      duration_ms: 10.576909
      type: 'test'
      ...
    # Subtest: terminates an exact-event record whose platform proof is invalid
    ok 16 - terminates an exact-event record whose platform proof is invalid
      ---
      duration_ms: 0.936536
      type: 'test'
      ...
    # Subtest: fails after proof when Windows tree termination cannot be proven
    ok 17 - fails after proof when Windows tree termination cannot be proven
      ---
      duration_ms: 5.764407
      type: 'test'
      ...
    # Subtest: never returns secret-bearing raw output or non-allowlisted record fields
    ok 18 - never returns secret-bearing raw output or non-allowlisted record fields
      ---
      duration_ms: 0.849653
      type: 'test'
      ...
    # Subtest: revokes success when sensitive output arrives after the exact ready proof
    ok 19 - revokes success when sensitive output arrives after the exact ready proof
      ---
      duration_ms: 0.622788
      type: 'test'
      ...
    # Subtest: rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
    ok 20 - rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
      ---
      duration_ms: 1.280701
      type: 'test'
      ...
    # Subtest: revokes success for a JSON-escaped Windows path after the exact ready proof
    ok 21 - revokes success for a JSON-escaped Windows path after the exact ready proof
      ---
      duration_ms: 1.227792
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the record-count cap
    ok 22 - revokes success when a JSON-escaped Windows path follows the record-count cap
      ---
      duration_ms: 2.68267
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the byte cap
    ok 23 - revokes success when a JSON-escaped Windows path follows the byte cap
      ---
      duration_ms: 5.082368
      type: 'test'
      ...
    1..23
ok 1 - packaged Connect bounded child lifecycle
  ---
  duration_ms: 112.862454
  type: 'suite'
  ...
# Subtest: packaged Connect fixture cleanup
    # Subtest: closes the journey fixture once and tolerates only the already-stopped server condition
    ok 1 - closes the journey fixture once and tolerates only the already-stopped server condition
      ---
      duration_ms: 1.17898
      type: 'test'
      ...
    # Subtest: retries a transient Windows EBUSY only inside the authorized fixture
    ok 2 - retries a transient Windows EBUSY only inside the authorized fixture
      ---
      duration_ms: 5.455197
      type: 'test'
      ...
    # Subtest: redacts cleanup failure and preserves the primary lifecycle outcome
    ok 3 - redacts cleanup failure and preserves the primary lifecycle outcome
      ---
      duration_ms: 1.081368
      type: 'test'
      ...
    # Subtest: bounds a never-settling removal and preserves the primary result
    ok 4 - bounds a never-settling removal and preserves the primary result
      ---
      duration_ms: 9.994598
      type: 'test'
      ...
    # Subtest: bounds a never-settling authorization call as a fixed cleanup failure
    ok 5 - bounds a never-settling authorization call as a fixed cleanup failure
      ---
      duration_ms: 10.378527
      type: 'test'
      ...
    # Subtest: isolates default Windows filesystem cleanup from the harness process
    ok 6 - isolates default Windows filesystem cleanup from the harness process
      ---
      duration_ms: 42.598699
      type: 'test'
      ...
    # Subtest: refuses a link, renamed leaf, or fixture outside the canonical temporary parent
    ok 7 - refuses a link, renamed leaf, or fixture outside the canonical temporary parent
      ---
      duration_ms: 0.604093
      type: 'test'
      ...
    1..7
ok 2 - packaged Connect fixture cleanup
  ---
  duration_ms: 71.781681
  type: 'suite'
  ...
1..2
# tests 30
# suites 2
# pass 30
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 419.011745

[5/385] apps/desktop/scripts/packaged-connect-platform.test.mjs
TAP version 13
# Subtest: packaged Connect target-native credential setup
    # Subtest: Linux retains one isolated unlocked libsecret session and rejects plaintext fallback
    ok 1 - Linux retains one isolated unlocked libsecret session and rejects plaintext fallback
      ---
      duration_ms: 4.28297
      type: 'test'
      ...
    # Subtest: Darwin uses only a generated ephemeral default keychain and restores it on exit
    ok 2 - Darwin uses only a generated ephemeral default keychain and restores it on exit
      ---
      duration_ms: 0.41616
      type: 'test'
      ...
    1..2
ok 1 - packaged Connect target-native credential setup
  ---
  duration_ms: 5.661506
  type: 'suite'
  ...
1..1
# tests 2
# suites 1
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 226.220671

[6/385] apps/desktop/scripts/packaged-layout.test.mjs
TAP version 13
# Subtest: packaged desktop event parsing
    # Subtest: returns the first full record for the exact matching event
    ok 1 - returns the first full record for the exact matching event
      ---
      duration_ms: 1.341987
      type: 'test'
      ...
    # Subtest: returns undefined when the event is absent
    ok 2 - returns undefined when the event is absent
      ---
      duration_ms: 0.182301
      type: 'test'
      ...
    1..2
ok 1 - packaged desktop event parsing
  ---
  duration_ms: 2.467235
  type: 'suite'
  ...
# Subtest: packaged desktop layout assertions
    # Subtest: retains the exact 1280x820 Linux Xvfb proof
    ok 1 - retains the exact 1280x820 Linux Xvfb proof
      ---
      duration_ms: 0.998411
      type: 'test'
      ...
    # Subtest: accepts a safe 1024x720 Windows display clamp with intact contained content
    ok 2 - accepts a safe 1024x720 Windows display clamp with intact contained content
      ---
      duration_ms: 0.200756
      type: 'test'
      ...
    # Subtest: rejects unsafe Windows clamps and content outside the visible work area
    ok 3 - rejects unsafe Windows clamps and content outside the visible work area
      ---
      duration_ms: 0.225784
      type: 'test'
      ...
    1..3
ok 2 - packaged desktop layout assertions
  ---
  duration_ms: 1.71738
  type: 'suite'
  ...
1..2
# tests 5
# suites 2
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 224.149271

[7/385] apps/desktop/scripts/packaged-smoke-support.test.mjs
TAP version 13
# Subtest: packaged smoke native window layout
    # Subtest: accepts the preferred size while retaining responsive containment
    ok 1 - accepts the preferred size while retaining responsive containment
      ---
      duration_ms: 1.262507
      type: 'test'
      ...
    # Subtest: accepts the 1024x720-clamped size while retaining responsive containment
    ok 2 - accepts the 1024x720-clamped size while retaining responsive containment
      ---
      duration_ms: 0.156223
      type: 'test'
      ...
    # Subtest: accepts the configured minimum size while retaining responsive containment
    ok 3 - accepts the configured minimum size while retaining responsive containment
      ---
      duration_ms: 0.162264
      type: 'test'
      ...
    # Subtest: accepts the undersized work area while retaining responsive containment
    ok 4 - accepts the undersized work area while retaining responsive containment
      ---
      duration_ms: 0.126918
      type: 'test'
      ...
    # Subtest: rejects an unclamped window or a viewport inconsistent with native content chrome
    ok 5 - rejects an unclamped window or a viewport inconsistent with native content chrome
      ---
      duration_ms: 0.474069
      type: 'test'
      ...
    # Subtest: accepts actual reduced native sizing only when both minimum constraints are exercised
    ok 6 - accepts actual reduced native sizing only when both minimum constraints are exercised
      ---
      duration_ms: 0.278452
      type: 'test'
      ...
    1..6
ok 1 - packaged smoke native window layout
  ---
  duration_ms: 3.644312
  type: 'suite'
  ...
# Subtest: packaged smoke child environment
    # Subtest: defines four isolated launches with exact per-mode environment, argv, and marker contracts
    ok 1 - defines four isolated launches with exact per-mode environment, argv, and marker contracts
      ---
      duration_ms: 1.325525
      type: 'test'
      ...
    # Subtest: passes only platform launch inputs and private profile paths from a hostile parent
    ok 2 - passes only platform launch inputs and private profile paths from a hostile parent
      ---
      duration_ms: 21.368232
      type: 'test'
      ...
    # Subtest: keeps cleanup bounded to the generated profile root
    ok 3 - keeps cleanup bounded to the generated profile root
      ---
      duration_ms: 14.199935
      type: 'test'
      ...
    # Subtest: accepts only a normalized absolute Windows SystemRoot directory
    ok 4 - accepts only a normalized absolute Windows SystemRoot directory
      ---
      duration_ms: 1.603025
      type: 'test'
      ...
    # Subtest: contains no parent environment spread, enumeration, denylist, PATH, or shell launch
    ok 5 - contains no parent environment spread, enumeration, denylist, PATH, or shell launch
      ---
      duration_ms: 4.10856
      type: 'test'
      ...
    # Subtest: serves each named fixture identity paired with its persisted credential
    ok 6 - serves each named fixture identity paired with its persisted credential
      ---
      duration_ms: 1.754429
      type: 'test'
      ...
    # Subtest: requires the adjacent packaged spawn options with LF or CRLF source
    ok 7 - requires the adjacent packaged spawn options with LF or CRLF source
      ---
      duration_ms: 1.626479
      type: 'test'
      ...
    1..7
ok 2 - packaged smoke child environment
  ---
  duration_ms: 46.497343
  type: 'suite'
  ...
1..2
# tests 13
# suites 2
# pass 13
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 283.728068

[8/385] apps/desktop/scripts/release-architecture.test.mjs
TAP version 13
# Subtest: machine-wide Windows artifacts require a real MSI compound file
ok 1 - machine-wide Windows artifacts require a real MSI compound file
  ---
  duration_ms: 8.654936
  type: 'test'
  ...
# Subtest: administrative MSI payload inspection
    # Subtest: uses exact fixed native extractor argv and minimal environments
    ok 1 - uses exact fixed native extractor argv and minimal environments
      ---
      duration_ms: 1.250815
      type: 'test'
      ...
    # Subtest: accepts only the canonical application with the one administrative root prefix
    ok 2 - accepts only the canonical application with the one administrative root prefix
      ---
      duration_ms: 11.025264
      type: 'test'
      ...
    # Subtest: rejects path escapes and case collisions from the Linux listing before extraction
    ok 3 - rejects path escapes and case collisions from the Linux listing before extraction
      ---
      duration_ms: 0.990346
      type: 'test'
      ...
    # Subtest: uses fixed missing and duplicate canonical-app codes with bounded counts
    ok 4 - uses fixed missing and duplicate canonical-app codes with bounded counts
      ---
      duration_ms: 8.031253
      type: 'test'
      ...
    # Subtest: distinguishes authority resources, unsafe trees, and architecture mismatch without path data
    ok 5 - distinguishes authority resources, unsafe trees, and architecture mismatch without path data
      ---
      duration_ms: 9.011385
      type: 'test'
      ...
    # Subtest: maps extractor failures to one redacted tool code
    ok 6 - maps extractor failures to one redacted tool code
      ---
      duration_ms: 2.808157
      type: 'test'
      ...
    # Subtest: retains compound-file, per-machine scope, and canonical PE evidence across extraction
    ok 7 - retains compound-file, per-machine scope, and canonical PE evidence across extraction
      ---
      duration_ms: 6.47802
      type: 'test'
      ...
    # Subtest: fails closed on extractor nonzero, stderr, output overflow, and timeout
    ok 8 - fails closed on extractor nonzero, stderr, output overflow, and timeout
      ---
      duration_ms: 132.530456
      type: 'test'
      ...
    1..8
ok 2 - administrative MSI payload inspection
  ---
  duration_ms: 173.232471
  type: 'suite'
  ...
# Subtest: DEB and RPM executable layouts
    # Subtest: accept only the canonical regular ELF payload and documented launcher symlink
    ok 1 - accept only the canonical regular ELF payload and documented launcher symlink
      ---
      duration_ms: 18.024823
      type: 'test'
      ...
    # Subtest: reject missing and extra payload names for both package formats
    ok 2 - reject missing and extra payload names for both package formats
      ---
      duration_ms: 16.218376
      type: 'test'
      ...
    # Subtest: reject unexpected same-name file types and non-ELF or cross-architecture payloads
    ok 3 - reject unexpected same-name file types and non-ELF or cross-architecture payloads
      ---
      duration_ms: 17.939591
      type: 'test'
      ...
    # Subtest: reject launcher escapes, cycles, and targets other than the canonical payload
    ok 4 - reject launcher escapes, cycles, and targets other than the canonical payload
      ---
      duration_ms: 14.149051
      type: 'test'
      ...
    # Subtest: reject special files with the executable name
    ok 5 - reject special files with the executable name
      ---
      duration_ms: 54.327272
      type: 'test'
      ...
    1..5
ok 3 - DEB and RPM executable layouts
  ---
  duration_ms: 121.006013
  type: 'suite'
  ...
# Subtest: DMG application layout
    # Subtest: accepts the real Forge tree with its install link and nested Electron helper bundles
    ok 1 - accepts the real Forge tree with its install link and nested Electron helper bundles
      ---
      duration_ms: 15.676451
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper bundle
    ok 2 - rejects a symbolic-link canonical helper bundle
      ---
      duration_ms: 8.280382
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper executable ancestor
    ok 3 - rejects a symbolic-link canonical helper executable ancestor
      ---
      duration_ms: 11.349643
      type: 'test'
      ...
    # Subtest: rejects every symbolic link outside canonical framework internals
    ok 4 - rejects every symbolic link outside canonical framework internals
      ---
      duration_ms: 11.951095
      type: 'test'
      ...
    # Subtest: rejects escaping, cyclic, missing, and case-mismatched framework symbolic links
    ok 5 - rejects escaping, cyclic, missing, and case-mismatched framework symbolic links
      ---
      duration_ms: 44.79976
      type: 'test'
      ...
    # Subtest: never treats Linux 7z sanitized install-link output as native layout evidence
    ok 6 - never treats Linux 7z sanitized install-link output as native layout evidence
      ---
      duration_ms: 11.277595
      type: 'test'
      ...
    # Subtest: rejects wrong bundles, alternate same-name executables, and canonical symlink escapes
    ok 7 - rejects wrong bundles, alternate same-name executables, and canonical symlink escapes
      ---
      duration_ms: 20.796907
      type: 'test'
      ...
    # Subtest: rejects alternate top-level application bundles
    ok 8 - rejects alternate top-level application bundles
      ---
      duration_ms: 8.441756
      type: 'test'
      ...
    # Subtest: rejects unsafe links inside the canonical application bundle
    ok 9 - rejects unsafe links inside the canonical application bundle
      ---
      duration_ms: 16.07249
      type: 'test'
      ...
    # Subtest: rejects non-helper nested application bundles
    ok 10 - rejects non-helper nested application bundles
      ---
      duration_ms: 12.616561
      type: 'test'
      ...
    # Subtest: rejects case-colliding top-level entries when the filesystem permits them
    ok 11 - rejects case-colliding top-level entries when the filesystem permits them
      ---
      duration_ms: 7.362465
      type: 'test'
      ...
    # Subtest: rejects special files inside the canonical application bundle
    ok 12 - rejects special files inside the canonical application bundle
      ---
      duration_ms: 14.331216
      type: 'test'
      ...
    1..12
ok 4 - DMG application layout
  ---
  duration_ms: 183.708194
  type: 'suite'
  ...
1..4
# tests 26
# suites 3
# pass 26
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 720.602086

[9/385] apps/desktop/scripts/release-artifacts.test.mjs
TAP version 13
# Subtest: desktop release artifacts
    # Subtest: stages named artifacts and finalizes unsigned validation metadata
    ok 1 - stages named artifacts and finalizes unsigned validation metadata
      ---
      duration_ms: 99.674798
      type: 'test'
      ...
    # Subtest: rejects extensionless, doubled-extension, case-conflicting, duplicate, wrong-kind, stale, and mixed-target names
    ok 2 - rejects extensionless, doubled-extension, case-conflicting, duplicate, wrong-kind, stale, and mixed-target names
      ---
      duration_ms: 273.347539
      type: 'test'
      ...
    # Subtest: rejects altered DMG bytes even when fragment artifact metadata is rewritten
    ok 3 - rejects altered DMG bytes even when fragment artifact metadata is rewritten
      ---
      duration_ms: 25.857062
      type: 'test'
      ...
    # Subtest: rejects permanent DMG replacement or in-place mutation during held inspection without emitting evidence
    ok 4 - rejects permanent DMG replacement or in-place mutation during held inspection without emitting evidence
      ---
      duration_ms: 11.519354
      type: 'test'
      ...
    # Subtest: keeps held A bytes, evidence, and publication stable when original and public pathnames change during inspection
    ok 5 - keeps held A bytes, evidence, and publication stable when original and public pathnames change during inspection
      ---
      duration_ms: 9.528597
      type: 'test'
      ...
    # Subtest: continues to reject a mutable pathname passed directly to DMG inspection
    ok 6 - continues to reject a mutable pathname passed directly to DMG inspection
      ---
      duration_ms: 0.270267
      type: 'test'
      ...
    # Subtest: requires explicit fixture authority for Windows-hosted DMG evidence tests
    ok 7 - requires explicit fixture authority for Windows-hosted DMG evidence tests # SKIP
      ---
      duration_ms: 0.073227
      type: 'test'
      ...
    # Subtest: accepts real Darwin mode-0700 directory and mode-0600 single-link file authority
    ok 8 - accepts real Darwin mode-0700 directory and mode-0600 single-link file authority # SKIP
      ---
      duration_ms: 0.172914
      type: 'test'
      ...
    # Subtest: rejects native Darwin broad mode, foreign owner, extra link, replacement type, and symlink with fixed authority codes
    ok 9 - rejects native Darwin broad mode, foreign owner, extra link, replacement type, and symlink with fixed authority codes # SKIP
      ---
      duration_ms: 0.158498
      type: 'test'
      ...
    # Subtest: accepts native xattr/ctime-only change when held bytes and identity are unchanged
    ok 10 - accepts native xattr/ctime-only change when held bytes and identity are unchanged # SKIP
      ---
      duration_ms: 0.264185
      type: 'test'
      ...
    # Subtest: does not emit claimed DMG layout evidence without the native-validation marker
    ok 11 - does not emit claimed DMG layout evidence without the native-validation marker
      ---
      duration_ms: 11.526379
      type: 'test'
      ...
    # Subtest: strictly rejects missing, mixed, stale, malformed, or fabricated native DMG evidence
    ok 12 - strictly rejects missing, mixed, stale, malformed, or fabricated native DMG evidence
      ---
      duration_ms: 347.498058
      type: 'test'
      ...
    # Subtest: rejects native DMG evidence copied between x64 and arm64 fragments
    ok 13 - rejects native DMG evidence copied between x64 and arm64 fragments
      ---
      duration_ms: 28.66979
      type: 'test'
      ...
    # Subtest: rejects duplicate target fragments before aggregation
    ok 14 - rejects duplicate target fragments before aggregation
      ---
      duration_ms: 23.36092
      type: 'test'
      ...
    # Subtest: rejects either Windows fragment when the installed ordinary-user application gate was skipped
    ok 15 - rejects either Windows fragment when the installed ordinary-user application gate was skipped
      ---
      duration_ms: 74.222818
      type: 'test'
      ...
    # Subtest: fails closed when trusted update signing configuration is incomplete
    ok 16 - fails closed when trusted update signing configuration is incomplete
      ---
      duration_ms: 77.925957
      type: 'test'
      ...
    # Subtest: signs cryptographically bound feeds only in the trusted release phase
    ok 17 - signs cryptographically bound feeds only in the trusted release phase
      ---
      duration_ms: 62.391313
      type: 'test'
      ...
    # Subtest: refuses to sign a renamed extensionless distributable
    ok 18 - refuses to sign a renamed extensionless distributable
      ---
      duration_ms: 37.381078
      type: 'test'
      ...
    # Subtest: refuses to sign when artifact bytes changed after unsigned finalization
    ok 19 - refuses to sign when artifact bytes changed after unsigned finalization
      ---
      duration_ms: 52.017264
      type: 'test'
      ...
    # Subtest: rejects unsigned production metadata and actual signer mismatches
    ok 20 - rejects unsigned production metadata and actual signer mismatches
      ---
      duration_ms: 91.093082
      type: 'test'
      ...
    # Subtest: rejects mixed Windows signers and tampered fingerprint evidence
    ok 21 - rejects mixed Windows signers and tampered fingerprint evidence
      ---
      duration_ms: 63.690151
      type: 'test'
      ...
    # Subtest: parses x64 and arm64 ELF, PE, and Mach-O executable fixtures
    ok 22 - parses x64 and arm64 ELF, PE, and Mach-O executable fixtures
      ---
      duration_ms: 1.230897
      type: 'test'
      ...
    # Subtest: derives Windows target architecture from the full NUPKG independently of its supported bootstrapper
    ok 23 - derives Windows target architecture from the full NUPKG independently of its supported bootstrapper
      ---
      duration_ms: 11.203643
      type: 'test'
      ...
    # Subtest: binds ZIP and NUPKG executables to exact maker-specific canonical paths
    ok 24 - binds ZIP and NUPKG executables to exact maker-specific canonical paths
      ---
      duration_ms: 3.816868
      type: 'test'
      ...
    # Subtest: rejects missing, corrupt, mismatched, and ambiguous packaged Windows authority helpers
    ok 25 - rejects missing, corrupt, mismatched, and ambiguous packaged Windows authority helpers
      ---
      duration_ms: 6.870979
      type: 'test'
      ...
    # Subtest: accepts only the real Forge macOS framework-internal symbolic-link layout
    ok 26 - accepts only the real Forge macOS framework-internal symbolic-link layout
      ---
      duration_ms: 4.99252
      type: 'test'
      ...
    # Subtest: rejects hostile macOS ZIP symbolic links before trusting their payloads
    ok 27 - rejects hostile macOS ZIP symbolic links before trusting their payloads
      ---
      duration_ms: 20.121894
      type: 'test'
      ...
    # Subtest: rejects unsafe, duplicate, shadowed, forged, alternate, and noncanonical archive layouts
    ok 28 - rejects unsafe, duplicate, shadowed, forged, alternate, and noncanonical archive layouts
      ---
      duration_ms: 6.730879
      type: 'test'
      ...
    # Subtest: rejects cross-labeled package architectures at staging and finalization
    ok 29 - rejects cross-labeled package architectures at staging and finalization
      ---
      duration_ms: 37.095908
      type: 'test'
      ...
    1..29
ok 1 - desktop release artifacts
  ---
  duration_ms: 1385.34818
  type: 'suite'
  ...
1..1
# tests 29
# suites 1
# pass 25
# fail 0
# cancelled 0
# skipped 4
# todo 0
# duration_ms 1634.939912

[10/385] apps/desktop/scripts/release-preflight.test.mjs
TAP version 13
# Subtest: desktop release preflight
    # Subtest: accepts only a new immutable tag reachable from protected main and a protected environment
    ok 1 - accepts only a new immutable tag reachable from protected main and a protected environment
      ---
      duration_ms: 3.642058
      type: 'test'
      ...
    # Subtest: accepts an authorization-visible bypass list and fails closed for hidden or denied ruleset details
    ok 2 - accepts an authorization-visible bypass list and fails closed for hidden or denied ruleset details
      ---
      duration_ms: 1.99493
      type: 'test'
      ...
    # Subtest: paginates repository rulesets and reads every full rule definition
    ok 3 - paginates repository rulesets and reads every full rule definition
      ---
      duration_ms: 4.580216
      type: 'test'
      ...
    # Subtest: requires an exact active bypass-free update and deletion tag ruleset
    ok 4 - requires an exact active bypass-free update and deletion tag ruleset
      ---
      duration_ms: 2.783278
      type: 'test'
      ...
    # Subtest: rejects ruleset mutation or deletion during preflight
    ok 5 - rejects ruleset mutation or deletion during preflight
      ---
      duration_ms: 1.49313
      type: 'test'
      ...
    # Subtest: requires the complete effective environment policy set to be exactly desktop-v* tags
    ok 6 - requires the complete effective environment policy set to be exactly desktop-v* tags
      ---
      duration_ms: 3.570603
      type: 'test'
      ...
    # Subtest: requires the separately protected preflight credential environment
    ok 7 - requires the separately protected preflight credential environment
      ---
      duration_ms: 0.90703
      type: 'test'
      ...
    # Subtest: paginates all environment policies and rejects a permissive policy on a later page
    ok 8 - paginates all environment policies and rejects a permissive policy on a later page
      ---
      duration_ms: 0.749876
      type: 'test'
      ...
    # Subtest: rejects missing or ambiguous environment protection and explicit API denial
    ok 9 - rejects missing or ambiguous environment protection and explicit API denial
      ---
      duration_ms: 1.03985
      type: 'test'
      ...
    # Subtest: rejects tags not created by this push, tags off main, and moved or existing releases
    ok 10 - rejects tags not created by this push, tags off main, and moved or existing releases
      ---
      duration_ms: 2.018675
      type: 'test'
      ...
    1..10
ok 1 - desktop release preflight
  ---
  duration_ms: 24.374597
  type: 'suite'
  ...
1..1
# tests 10
# suites 1
# pass 10
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 274.452633

[11/385] apps/desktop/scripts/release-publish.test.mjs
TAP version 13
# Subtest: atomic desktop release publication
    # Subtest: creates a draft, paginates and verifies the exact final assets, then publishes
    ok 1 - creates a draft, paginates and verifies the exact final assets, then publishes
      ---
      duration_ms: 171.81046
      type: 'test'
      ...
    # Subtest: leaves a partial upload as a recoverable draft and resumes only matching assets
    ok 2 - leaves a partial upload as a recoverable draft and resumes only matching assets
      ---
      duration_ms: 11.370277
      type: 'test'
      ...
    # Subtest: rejects unexpected, duplicate, size, and content-digest asset mismatches without publishing
    ok 3 - rejects unexpected, duplicate, size, and content-digest asset mismatches without publishing
      ---
      duration_ms: 11.440825
      type: 'test'
      ...
    # Subtest: rejects tag drift before publishing the verified draft
    ok 4 - rejects tag drift before publishing the verified draft
      ---
      duration_ms: 5.745842
      type: 'test'
      ...
    # Subtest: rejects local files outside or missing from finalized checksums
    ok 5 - rejects local files outside or missing from finalized checksums
      ---
      duration_ms: 2.600545
      type: 'test'
      ...
    1..5
ok 1 - atomic desktop release publication
  ---
  duration_ms: 204.335053
  type: 'suite'
  ...
1..1
# tests 5
# suites 1
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 424.272838

[12/385] apps/desktop/scripts/verify-darwin-image.test.mjs
TAP version 13
# Subtest: Darwin image verification retries only bounded documented resource states
ok 1 - Darwin image verification retries only bounded documented resource states
  ---
  duration_ms: 13.966523
  type: 'test'
  ...
# Subtest: Darwin image verification does not retry malformed/truncated images or accept mutation
ok 2 - Darwin image verification does not retry malformed/truncated images or accept mutation
  ---
  duration_ms: 10.132666
  type: 'test'
  ...
# Subtest: Darwin image verification holds a fixed hdiutil image behind a real mutation and replacement barrier
ok 3 - Darwin image verification holds a fixed hdiutil image behind a real mutation and replacement barrier # SKIP
  ---
  duration_ms: 0.208281
  type: 'test'
  ...
1..3
# tests 3
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 244.774829

[13/385] apps/desktop/scripts/windows-fixture-acl.test.mjs
TAP version 13
# Subtest: keeps the encoded Windows PowerShell 5.1 ACL helper fail-closed and byte-empty
ok 1 - keeps the encoded Windows PowerShell 5.1 ACL helper fail-closed and byte-empty # SKIP
  ---
  duration_ms: 0.709801
  type: 'test'
  ...
1..1
# tests 1
# suites 0
# pass 0
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 237.174539

[14/385] apps/desktop/scripts/windows-packaged-connect-staging.test.mjs
TAP version 13
# Subtest: capture redirection mismatch reporting is total and redacted for each launch predicate
ok 1 - capture redirection mismatch reporting is total and redacted for each launch predicate
  ---
  duration_ms: 2.72029
  type: 'test'
  ...
# Subtest: positive host Node producer failures expose only fixed allowlisted evidence
ok 2 - positive host Node producer failures expose only fixed allowlisted evidence
  ---
  duration_ms: 1.106154
  type: 'test'
  ...
# Subtest: hostile diagnostics reject uppercase PATH without matching fixed path subphases
ok 3 - hostile diagnostics reject uppercase PATH without matching fixed path subphases
  ---
  duration_ms: 0.156423
  type: 'test'
  ...
# Subtest: packaged Windows Connect staging contract
    # Subtest: accepts only the exact generated leaf below the fixed canonical staging parent
    ok 1 - accepts only the exact generated leaf below the fixed canonical staging parent
      ---
      duration_ms: 1.342727
      type: 'test'
      ...
    # Subtest: accepts one bounded parent-owned handoff and rejects every other input shape
    ok 2 - accepts one bounded parent-owned handoff and rejects every other input shape
      ---
      duration_ms: 0.593764
      type: 'test'
      ...
    # Subtest: emits only fixed staged-contract predicate evidence
    ok 3 - emits only fixed staged-contract predicate evidence
      ---
      duration_ms: 0.742021
      type: 'test'
      ...
    # Subtest: rejects missing, inaccessible, reparse, wrong-type, and noncanonical entries before preflight
    ok 4 - rejects missing, inaccessible, reparse, wrong-type, and noncanonical entries before preflight
      ---
      duration_ms: 2.085991
      type: 'test'
      ...
    # Subtest: proves target PE architecture and ordinary-user access before returning the executable
    ok 5 - proves target PE architecture and ordinary-user access before returning the executable
      ---
      duration_ms: 1.81915
      type: 'test'
      ...
    # Subtest: maps a hostile preflight callback throw totally and redacts all supplied evidence
    ok 6 - maps a hostile preflight callback throw totally and redacts all supplied evidence
      ---
      duration_ms: 1.139656
      type: 'test'
      ...
    # Subtest: keeps PE type and architecture failures distinct
    ok 7 - keeps PE type and architecture failures distinct
      ---
      duration_ms: 0.845805
      type: 'test'
      ...
    # Subtest: maps hostile exceptions to a fixed path-free allowlist
    ok 8 - maps hostile exceptions to a fixed path-free allowlist
      ---
      duration_ms: 0.644589
      type: 'test'
      ...
    # Subtest: classifies fixed phases without collapsing pre-spawn failures into spawn
    ok 9 - classifies fixed phases without collapsing pre-spawn failures into spawn
      ---
      duration_ms: 0.46928
      type: 'test'
      ...
    # Subtest: maps every preflight transport and exit result to fixed subphase evidence
    ok 10 - maps every preflight transport and exit result to fixed subphase evidence
      ---
      duration_ms: 1.021906
      type: 'test'
      ...
    # Subtest: preflight diagnostics exclude path, SID, account name, stdout, and stderr evidence
    ok 11 - preflight diagnostics exclude path, SID, account name, stdout, and stderr evidence
      ---
      duration_ms: 0.578174
      type: 'test'
      ...
    # Subtest: scopes staged-root and executable leak needles to Windows
    ok 12 - scopes staged-root and executable leak needles to Windows
      ---
      duration_ms: 0.313448
      type: 'test'
      ...
    1..12
ok 4 - packaged Windows Connect staging contract
  ---
  duration_ms: 12.740035
  type: 'suite'
  ...
# Subtest: the workflow stages before alternate credentials and the harness preflights before application spawn
ok 5 - the workflow stages before alternate credentials and the harness preflights before application spawn
  ---
  duration_ms: 31.192402
  type: 'test'
  ...
# Subtest: the PS5.1 child-failure parser accepts only the two exact bounded producer schemas
ok 6 - the PS5.1 child-failure parser accepts only the two exact bounded producer schemas # SKIP
  ---
  duration_ms: 0.163367
  type: 'test'
  ...
# Subtest: the PS5.1 capture parser enforces native owner ACL path and identity authority
ok 7 - the PS5.1 capture parser enforces native owner ACL path and identity authority # SKIP
  ---
  duration_ms: 0.06441
  type: 'test'
  ...
# Subtest: nominal reaches zero with exact protected stdout and stderr capture
ok 8 - nominal reaches zero with exact protected stdout and stderr capture # SKIP
  ---
  duration_ms: 0.05371
  type: 'test'
  ...
# Subtest: a forced nonzero capture producer maps only to redirect-child-exit
ok 9 - a forced nonzero capture producer maps only to redirect-child-exit # SKIP
  ---
  duration_ms: 0.054262
  type: 'test'
  ...
# Subtest: empty and hostile producer results map only to fixed bounded buckets
ok 10 - empty and hostile producer results map only to fixed bounded buckets # SKIP
  ---
  duration_ms: 0.050885
  type: 'test'
  ...
# Subtest: each host preflight failure transition emits one fixed redacted subphase
ok 11 - each host preflight failure transition emits one fixed redacted subphase # SKIP
  ---
  duration_ms: 0.049373
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects zero command evidence
ok 12 - the PS5.1 host Node producer rejects zero command evidence # SKIP
  ---
  duration_ms: 0.045195
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects duplicate command evidence
ok 13 - the PS5.1 host Node producer rejects duplicate command evidence # SKIP
  ---
  duration_ms: 0.04244
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects multiple command evidence
ok 14 - the PS5.1 host Node producer rejects multiple command evidence # SKIP
  ---
  duration_ms: 0.053109
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects mixed-types command evidence
ok 15 - the PS5.1 host Node producer rejects mixed-types command evidence # SKIP
  ---
  duration_ms: 0.046006
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects case-collision command evidence
ok 16 - the PS5.1 host Node producer rejects case-collision command evidence # SKIP
  ---
  duration_ms: 0.044573
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects non-application command evidence
ok 17 - the PS5.1 host Node producer rejects non-application command evidence # SKIP
  ---
  duration_ms: 0.042099
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects missing-source command evidence
ok 18 - the PS5.1 host Node producer rejects missing-source command evidence # SKIP
  ---
  duration_ms: 0.041578
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects non-scalar-source command evidence
ok 19 - the PS5.1 host Node producer rejects non-scalar-source command evidence # SKIP
  ---
  duration_ms: 0.048251
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer returns one validated scalar Source
ok 20 - the PS5.1 host Node producer returns one validated scalar Source # SKIP
  ---
  duration_ms: 0.082174
  type: 'test'
  ...
# Subtest: the host launcher accepts only a stable final ordinary-file identity
ok 21 - the host launcher accepts only a stable final ordinary-file identity # SKIP
  ---
  duration_ms: 0.086141
  type: 'test'
  ...
# Subtest: the bounded cleanup source requires proven child exit and bounded stream closure
ok 22 - the bounded cleanup source requires proven child exit and bounded stream closure
  ---
  duration_ms: 11.848483
  type: 'test'
  ...
# Subtest: the native timeout path terminates an actual child and descendant tree
ok 23 - the native timeout path terminates an actual child and descendant tree # SKIP
  ---
  duration_ms: 0.219191
  type: 'test'
  ...
# Subtest: a real never-settling cleanup is bounded, terminated, and remains secondary
ok 24 - a real never-settling cleanup is bounded, terminated, and remains secondary # SKIP
  ---
  duration_ms: 0.108473
  type: 'test'
  ...
1..24
# tests 35
# suites 1
# pass 17
# fail 0
# cancelled 0
# skipped 18
# todo 0
# duration_ms 315.208525

[15/385] apps/desktop/src/connect-discovery.test.ts
TAP version 13
# Subtest: desktop fixed-root Connect discovery
    # Subtest: projects only a stable opaque profile and canonical endpoint
    ok 1 - projects only a stable opaque profile and canonical endpoint
      ---
      duration_ms: 2.023524
      type: 'test'
      ...
    # Subtest: fences rediscovery to an existing managed profile and preserves its id and label
    ok 2 - fences rediscovery to an existing managed profile and preserves its id and label
      ---
      duration_ms: 0.935894
      type: 'test'
      ...
    # Subtest: discards rediscovery when the exact saved profile changes while native discovery awaits
    ok 3 - discards rediscovery when the exact saved profile changes while native discovery awaits
      ---
      duration_ms: 0.516569
      type: 'test'
      ...
    # Subtest: fails closed for unsupported hosts and malformed native results
    ok 4 - fails closed for unsupported hosts and malformed native results
      ---
      duration_ms: 0.581681
      type: 'test'
      ...
    # Subtest: generation-conditionally clears failed intents while keeping prior activations fenced
    ok 5 - generation-conditionally clears failed intents while keeping prior activations fenced
      ---
      duration_ms: 0.722355
      type: 'test'
      ...
    # Subtest: scopes discovery freshness per profile and only discards stale same-profile completions
    ok 6 - scopes discovery freshness per profile and only discards stale same-profile completions
      ---
      duration_ms: 0.412814
      type: 'test'
      ...
    1..6
ok 1 - desktop fixed-root Connect discovery
  ---
  duration_ms: 6.298459
  type: 'suite'
  ...
1..1
# tests 6
# suites 1
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 478.956369

[16/385] apps/desktop/src/credential-service.pairing-browser.test.ts
TAP version 13
# Subtest: DesktopCredentialService pairing browser sink
    # Subtest: pairs through the browser journey and rejects a response URL replacement
    ok 1 - pairs through the browser journey and rejects a response URL replacement
      ---
      duration_ms: 136.124324
      type: 'test'
      ...
    1..1
ok 1 - DesktopCredentialService pairing browser sink
  ---
  duration_ms: 137.199559
  type: 'suite'
  ...
1..1
# tests 1
# suites 1
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 655.154367

[17/385] apps/desktop/src/credential-service.test.ts
TAP version 13
# Subtest: main-process desktop credential service
    # Subtest: fails a relaunched same-origin replacement closed before sending the stored bearer
    ok 1 - fails a relaunched same-origin replacement closed before sending the stored bearer
      ---
      duration_ms: 105.150231
      type: 'test'
      ...
    # Subtest: fails malformed identity closed and classifies legacy public-discovery 401 safely
    ok 2 - fails malformed identity closed and classifies legacy public-discovery 401 safely
      ---
      duration_ms: 78.167891
      type: 'test'
      ...
    # Subtest: revalidates an old Socket.IO reconnect and sends zero bearer requests after identity rotation
    ok 3 - revalidates an old Socket.IO reconnect and sends zero bearer requests after identity rotation
      ---
      duration_ms: 55.643666
      type: 'test'
      ...
    # Subtest: fences old and concurrently rotated Connect claims through pairing, commit, and transport activation
    ok 4 - fences old and concurrently rotated Connect claims through pairing, commit, and transport activation
      ---
      duration_ms: 254.257715
      type: 'test'
      ...
    # Subtest: injects the active bearer only for its bound profile origin and strips renderer identity
    ok 5 - injects the active bearer only for its bound profile origin and strips renderer identity
      ---
      duration_ms: 63.432598
      type: 'test'
      ...
    # Subtest: uses only the active bearer when profiles share an origin and never a cookie identity
    ok 6 - uses only the active bearer when profiles share an origin and never a cookie identity
      ---
      duration_ms: 74.072973
      type: 'test'
      ...
    # Subtest: detaches origin and identity mismatches before bearer use or early protocol exits
    ok 7 - detaches origin and identity mismatches before bearer use or early protocol exits
      ---
      duration_ms: 135.475233
      type: 'test'
      ...
    # Subtest: does not mint a ticket when a delayed B probe observes credential replacement with origin A
    ok 8 - does not mint a ticket when a delayed B probe observes credential replacement with origin A
      ---
      duration_ms: 47.557318
      type: 'test'
      ...
    # Subtest: atomically rejects a ticket when delayed activation races with profile B credential A
    ok 9 - atomically rejects a ticket when delayed activation races with profile B credential A
      ---
      duration_ms: 52.538514
      type: 'test'
      ...
    # Subtest: keeps a slow successful same-origin A probe status-only after fast B activates
    ok 10 - keeps a slow successful same-origin A probe status-only after fast B activates
      ---
      duration_ms: 75.487321
      type: 'test'
      ...
    # Subtest: keeps A active while B is only probed and if B selection persistence fails
    ok 11 - keeps A active while B is only probed and if B selection persistence fails
      ---
      duration_ms: 72.238041
      type: 'test'
      ...
    # Subtest: keeps B active during a direct same-origin A probe and rejects replayed activation tickets
    ok 12 - keeps B active during a direct same-origin A probe and rejects replayed activation tickets
      ---
      duration_ms: 70.392719
      type: 'test'
      ...
    # Subtest: rejects activation after candidate removal, selection drift, or exact credential replacement
    ok 13 - rejects activation after candidate removal, selection drift, or exact credential replacement
      ---
      duration_ms: 292.320988
      type: 'test'
      ...
    # Subtest: binds REST and Socket.IO work to one fresh scope and rejects stale or malformed markers
    ok 14 - binds REST and Socket.IO work to one fresh scope and rejects stale or malformed markers
      ---
      duration_ms: 76.648383
      type: 'test'
      ...
    # Subtest: passes through a realistic packaged-origin CORS preflight without renderer identity or bearer injection
    ok 15 - passes through a realistic packaged-origin CORS preflight without renderer identity or bearer injection
      ---
      duration_ms: 0.378279
      type: 'test'
      ...
    # Subtest: rotates scope on every same-profile reprobe and rejects a cold reconnect from the old activation
    ok 16 - rotates scope on every same-profile reprobe and rejects a cold reconnect from the old activation
      ---
      duration_ms: 61.783311
      type: 'test'
      ...
    # Subtest: never sends an A-origin bearer after the profile URL is edited to an attacker origin
    ok 17 - never sends an A-origin bearer after the profile URL is edited to an attacker origin
      ---
      duration_ms: 28.996621
      type: 'test'
      ...
    # Subtest: preserves a re-paired credential and current connection after a stale definitive probe response
    ok 18 - preserves a re-paired credential and current connection after a stale definitive probe response
      ---
      duration_ms: 84.576298
      type: 'test'
      ...
    # Subtest: preserves a replacement credential at a changed origin after a stale definitive probe response
    ok 19 - preserves a replacement credential at a changed origin after a stale definitive probe response
      ---
      duration_ms: 80.745184
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during browser-launch
    ok 20 - preserves the active profile and credential when an origin edit fails during browser-launch
      ---
      duration_ms: 63.736398
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during cancellation
    ok 21 - preserves the active profile and credential when an origin edit fails during cancellation
      ---
      duration_ms: 65.776327
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during expiry
    ok 22 - preserves the active profile and credential when an origin edit fails during expiry
      ---
      duration_ms: 53.755873
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during polling
    ok 23 - preserves the active profile and credential when an origin edit fails during polling
      ---
      duration_ms: 60.971834
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during secure-storage
    ok 24 - preserves the active profile and credential when an origin edit fails during secure-storage
      ---
      duration_ms: 72.087254
      type: 'test'
      ...
    # Subtest: commits an edited profile and replacement credential before revoking the old token
    ok 25 - commits an edited profile and replacement credential before revoking the old token
      ---
      duration_ms: 71.704859
      type: 'test'
      ...
# NATIVE_SCENARIO delivery
    # Subtest: durably journals a provisional delivery before server activation and local publication
    ok 26 - durably journals a provisional delivery before server activation and local publication
      ---
      duration_ms: 43.269337
      type: 'test'
      ...
    # Subtest: retries an encrypted pending A revocation across failure, restart, remote success, and local cleanup failure
    ok 27 - retries an encrypted pending A revocation across failure, restart, remote success, and local cleanup failure
      ---
      duration_ms: 199.82146
      type: 'test'
      ...
# NATIVE_SCENARIO revocation-crash
    # Subtest: recovers B and retries idempotently after a real process crash during-revoke
    ok 28 - recovers B and retries idempotently after a real process crash during-revoke
      ---
      duration_ms: 533.216987
      type: 'test'
      ...
# NATIVE_SCENARIO revocation-crash
    # Subtest: recovers B and retries idempotently after a real process crash after-remote-success
    ok 29 - recovers B and retries idempotently after a real process crash after-remote-success
      ---
      duration_ms: 519.9482
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 204 success
    ok 30 - cleans durable retry material only for endpoint-bound terminal 204 success
      ---
      duration_ms: 40.101881
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 404 TOKEN_NOT_FOUND
    ok 31 - cleans durable retry material only for endpoint-bound terminal 404 TOKEN_NOT_FOUND
      ---
      duration_ms: 41.648088
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_REVOKED
    ok 32 - cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_REVOKED
      ---
      duration_ms: 42.262338
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_EXPIRED
    ok 33 - cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_EXPIRED
      ---
      duration_ms: 42.417823
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 401
    ok 34 - retains encrypted retry material for empty 401
      ---
      duration_ms: 46.856858
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 404
    ok 35 - retains encrypted retry material for empty 404
      ---
      duration_ms: 43.619033
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for HTML route 404
    ok 36 - retains encrypted retry material for HTML route 404
      ---
      duration_ms: 34.32458
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for malformed JSON
    ok 37 - retains encrypted retry material for malformed JSON
      ---
      duration_ms: 35.713344
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong content type
    ok 38 - retains encrypted retry material for wrong content type
      ---
      duration_ms: 32.94844
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong schema version
    ok 39 - retains encrypted retry material for wrong schema version
      ---
      duration_ms: 34.075861
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong credential generation
    ok 40 - retains encrypted retry material for wrong credential generation
      ---
      duration_ms: 35.594118
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for unknown terminal code
    ok 41 - retains encrypted retry material for unknown terminal code
      ---
      duration_ms: 32.763746
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for status/code mismatch
    ok 42 - retains encrypted retry material for status/code mismatch
      ---
      duration_ms: 44.521422
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirect
    ok 43 - retains encrypted retry material for redirect
      ---
      duration_ms: 37.1594
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirected 204
    ok 44 - retains encrypted retry material for redirected 204
      ---
      duration_ms: 33.112583
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for

...(truncated)

View Workflow

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Applied the requested follow-up changes in commit 2da68e3

Summary of Changes

Implemented the three scoped Mac/Linux CI corrections:

  • Enforced exact pairing evidence: 3 starts, 3 browser approvals, 1 poll, 1 activation in smoke-packaged-connect.mjs.
  • Pre-seeded the disposable Darwin keychain with Electron’s Safe Storage item and unset the generated secret before launch in desktop-connect-discovery-guard.yml.
  • Allowed incidental resources to be canceled without invalidating approval, while retaining subframe/main-frame rejection and adding bounded, redacted cleanup in packaged-approval-session.ts.

Validation passed:

  • Focused lifecycle/platform/approval: 53 tests
  • Platform-safe Connect: 86/86
  • Native durability: 120/120
  • Client: 72/72
  • Focused API auth/boundary: 14/14
  • Focused UI: 34/34
  • Desktop and UI typechecks
  • Diff and secret/marker scans

The reported full-suite run failed only at the known out-of-scope test/config-followup.test.ts infrastructure-dependent assertion (400 !== 500); its gate was not weakened. No commit or visual preview was created.


🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @github-actions[bot]
  • Time: 21m 43s
  • Tokens: 8,546,008 (8,525,670 in / 20,338 out)
  • Cost: $5.91

Undo ChangesView Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5539846056✓

Implemented the three scoped Mac/Linux CI corrections:

- Enforced exact pairing evidence: 3 starts, 3 browser approvals, 1 poll, 1 activation in [smoke-packaged-connect.mjs](/home/node/workspace/apps/desktop/scripts/smoke-packaged-connect.mjs:620).
- Pre-seeded the disposable Darwin keychain with Electron’s Safe Storage item and unset the generated secret before launch in [desktop-connect-discovery-guard.yml](/home/node/workspace/.github/workflows/desktop-connect-discovery-guard.yml:145).
- Allowed incidental resources to be canceled without invalidating approval, while retaining subframe/main-frame rejection and adding bounded, redacted cleanup in [packaged-approval-session.ts](/home/node/workspace/apps/desktop/src/packaged-approval-session.ts:47).

Validation passed:

- Focused lifecycle/platform/approval: 53 tests
- Platform-safe Connect: 86/86
- Native durability: 120/120
- Client: 72/72
- Focused API auth/boundary: 14/14
- Focused UI: 34/34
- Desktop and UI typechecks
- Diff and secret/marker scans

The [reported full-suite run](https://github.com/integry/propr/actions/runs/33867260810) failed only at the known out-of-scope `test/config-followup.test.ts` infrastructure-dependent assertion (`400 !== 500`); its gate was not weakened. No commit or visual preview was created.

PR: #2089
Comment by: @github-actions[bot] (ID: 5539846056)
Model: gpt-5.6-sol
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

Full Test Suite Results

Validation failed during: Full test suite.

  • Dependency install: success
  • Workspace build: success
  • Docs validation: success
  • Redis startup: success
  • Full test suite: failure
View Test Output

> propr@0.8.15 test:full:prepared
> npm run test:server


> propr@0.8.15 test:server
> node scripts/run-test-suite.mjs


[1/385] apps/desktop/scripts/assert-windows-mvp-package.test.mjs
TAP version 13
# Subtest: Windows MVP ASAR main entry
    # Subtest: uses the rooted listPackage representation accepted by extractFile
    ok 1 - uses the rooted listPackage representation accepted by extractFile
      ---
      duration_ms: 27.822676
      type: 'test'
      ...
    # Subtest: preserves the Windows separator after removing the one archive root
    ok 2 - preserves the Windows separator after removing the one archive root
      ---
      duration_ms: 0.190184
      type: 'test'
      ...
    # Subtest: rejects traversal, duplicate entries, and case-colliding main paths
    ok 3 - rejects traversal, duplicate entries, and case-colliding main paths
      ---
      duration_ms: 0.628077
      type: 'test'
      ...
    1..3
ok 1 - Windows MVP ASAR main entry
  ---
  duration_ms: 29.574788
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 269.665684

[2/385] apps/desktop/scripts/build-windows-machine-installer.test.mjs
TAP version 13
# Subtest: sets explicit Windows-1252 MSI and summary code pages in probe and production WXS
ok 1 - sets explicit Windows-1252 MSI and summary code pages in probe and production WXS
  ---
  duration_ms: 1.3688
  type: 'test'
  ...
# Subtest: accepts the exact MSI ProductVersion boundary and retains version and upgrade identity in WXS
ok 2 - accepts the exact MSI ProductVersion boundary and retains version and upgrade identity in WXS
  ---
  duration_ms: 0.407802
  type: 'test'
  ...
# Subtest: rejects every unsupported ProductVersion at the direct installer builder entry point
ok 3 - rejects every unsupported ProductVersion at the direct installer builder entry point
  ---
  duration_ms: 1.334817
  type: 'test'
  ...
# Subtest: uses per-machine scope without explicitly authoring the derived ALLUSERS property
ok 4 - uses per-machine scope without explicitly authoring the derived ALLUSERS property
  ---
  duration_ms: 1.335534
  type: 'test'
  ...
# Subtest: authors the complete per-machine Start Menu contract for x64 and ARM64
ok 5 - authors the complete per-machine Start Menu contract for x64 and ARM64
  ---
  duration_ms: 0.776474
  type: 'test'
  ...
# Subtest: selects only the installed x64 WiX directory or an explicit ARM64 build directory
ok 6 - selects only the installed x64 WiX directory or an explicit ARM64 build directory
  ---
  duration_ms: 0.514442
  type: 'test'
  ...
# Subtest: uses a ten-minute timeout only for production Light
ok 7 - uses a ten-minute timeout only for production Light
  ---
  duration_ms: 0.210972
  type: 'test'
  ...
# Subtest: keeps WiX processes and their emitted diagnostics bounded
ok 8 - keeps WiX processes and their emitted diagnostics bounded
  ---
  duration_ms: 0.109083
  type: 'test'
  ...
# Subtest: emits WiX v3 default registry values without empty Name attributes
ok 9 - emits WiX v3 default registry values without empty Name attributes
  ---
  duration_ms: 0.34301
  type: 'test'
  ...
1..9
# tests 9
# suites 0
# pass 9
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 219.564632

[3/385] apps/desktop/scripts/packaged-connect-launch.test.mjs
TAP version 13
# Subtest: packaged Connect launch boundary
    # Subtest: passes the one effective Linux argv through the actual binary spawn
    ok 1 - passes the one effective Linux argv through the actual binary spawn
      ---
      duration_ms: 1.442944
      type: 'test'
      ...
    # Subtest: does not add the Linux password-store selection on Darwin
    ok 2 - does not add the Linux password-store selection on Darwin
      ---
      duration_ms: 0.170116
      type: 'test'
      ...
    # Subtest: the lifecycle and real binary spawn share the derived argv source
    ok 3 - the lifecycle and real binary spawn share the derived argv source
      ---
      duration_ms: 4.920373
      type: 'test'
      ...
    1..3
ok 1 - packaged Connect launch boundary
  ---
  duration_ms: 7.791662
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 202.614292

[4/385] apps/desktop/scripts/packaged-connect-lifecycle.test.mjs
TAP version 13
# Subtest: packaged Connect bounded child lifecycle
    # Subtest: requires exact three starts, three browser approvals, one poll, and one activation
    ok 1 - requires exact three starts, three browser approvals, one poll, and one activation
      ---
      duration_ms: 7.34757
      type: 'test'
      ...
    # Subtest: accepts an exact ready proof followed by a clean exit
    ok 2 - accepts an exact ready proof followed by a clean exit
      ---
      duration_ms: 3.794949
      type: 'test'
      ...
    # Subtest: does not accept an intermediate discovery milestone as terminal readiness
    ok 3 - does not accept an intermediate discovery milestone as terminal readiness
      ---
      duration_ms: 1.143585
      type: 'test'
      ...
    # Subtest: returns only exact allowlisted journey stages
    ok 4 - returns only exact allowlisted journey stages
      ---
      duration_ms: 1.509515
      type: 'test'
      ...
    # Subtest: retains the latest bounded journey stage when earlier diagnostics fill the cap
    ok 5 - retains the latest bounded journey stage when earlier diagnostics fill the cap
      ---
      duration_ms: 2.691658
      type: 'test'
      ...
    # Subtest: retains only fixed terminal journey failure evidence when diagnostics fill the cap
    ok 6 - retains only fixed terminal journey failure evidence when diagnostics fill the cap
      ---
      duration_ms: 2.447658
      type: 'test'
      ...
    # Subtest: drops non-allowlisted terminal journey failure fields
    ok 7 - drops non-allowlisted terminal journey failure fields
      ---
      duration_ms: 1.09032
      type: 'test'
      ...
    # Subtest: returns only fixed secret-free Local Network Access decision evidence
    ok 8 - returns only fixed secret-free Local Network Access decision evidence
      ---
      duration_ms: 1.493007
      type: 'test'
      ...
    # Subtest: fails closed when an otherwise allowlisted journey stage contains a secret
    ok 9 - fails closed when an otherwise allowlisted journey stage contains a secret
      ---
      duration_ms: 0.981081
      type: 'test'
      ...
    # Subtest: publishes the sole terminal READY only after each real journey phase
    ok 10 - publishes the sole terminal READY only after each real journey phase
      ---
      duration_ms: 6.390318
      type: 'test'
      ...
    # Subtest: forces a ready app with a hung descendant through an exact bounded taskkill invocation
    ok 11 - forces a ready app with a hung descendant through an exact bounded taskkill invocation
      ---
      duration_ms: 7.249937
      type: 'test'
      ...
    # Subtest: keeps timeout-before-ready primary while terminating and draining the tree
    ok 12 - keeps timeout-before-ready primary while terminating and draining the tree
      ---
      duration_ms: 16.355286
      type: 'test'
      ...
    # Subtest: classifies asynchronous spawn errors without exposing their message
    ok 13 - classifies asynchronous spawn errors without exposing their message
      ---
      duration_ms: 6.178632
      type: 'test'
      ...
    # Subtest: settles close/timeout races once and never upgrades an early exit to success
    ok 14 - settles close/timeout races once and never upgrades an early exit to success
      ---
      duration_ms: 0.586906
      type: 'test'
      ...
    # Subtest: accepts a clean post-proof close racing a taskkill no-process result
    ok 15 - accepts a clean post-proof close racing a taskkill no-process result
      ---
      duration_ms: 6.104744
      type: 'test'
      ...
    # Subtest: rejects malformed, partial, truncated, and extra-field ready records
    ok 16 - rejects malformed, partial, truncated, and extra-field ready records
      ---
      duration_ms: 7.556656
      type: 'test'
      ...
    # Subtest: terminates an exact-event record whose platform proof is invalid
    ok 17 - terminates an exact-event record whose platform proof is invalid
      ---
      duration_ms: 0.834729
      type: 'test'
      ...
    # Subtest: fails after proof when Windows tree termination cannot be proven
    ok 18 - fails after proof when Windows tree termination cannot be proven
      ---
      duration_ms: 6.574988
      type: 'test'
      ...
    # Subtest: never returns secret-bearing raw output or non-allowlisted record fields
    ok 19 - never returns secret-bearing raw output or non-allowlisted record fields
      ---
      duration_ms: 1.159108
      type: 'test'
      ...
    # Subtest: revokes success when sensitive output arrives after the exact ready proof
    ok 20 - revokes success when sensitive output arrives after the exact ready proof
      ---
      duration_ms: 0.992614
      type: 'test'
      ...
    # Subtest: rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
    ok 21 - rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
      ---
      duration_ms: 0.92148
      type: 'test'
      ...
    # Subtest: revokes success for a JSON-escaped Windows path after the exact ready proof
    ok 22 - revokes success for a JSON-escaped Windows path after the exact ready proof
      ---
      duration_ms: 0.75236
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the record-count cap
    ok 23 - revokes success when a JSON-escaped Windows path follows the record-count cap
      ---
      duration_ms: 4.868445
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the byte cap
    ok 24 - revokes success when a JSON-escaped Windows path follows the byte cap
      ---
      duration_ms: 6.72238
      type: 'test'
      ...
    1..24
ok 1 - packaged Connect bounded child lifecycle
  ---
  duration_ms: 97.795778
  type: 'suite'
  ...
# Subtest: packaged Connect fixture cleanup
    # Subtest: closes the journey fixture once and tolerates only the already-stopped server condition
    ok 1 - closes the journey fixture once and tolerates only the already-stopped server condition
      ---
      duration_ms: 0.811155
      type: 'test'
      ...
    # Subtest: retries a transient Windows EBUSY only inside the authorized fixture
    ok 2 - retries a transient Windows EBUSY only inside the authorized fixture
      ---
      duration_ms: 3.54748
      type: 'test'
      ...
    # Subtest: redacts cleanup failure and preserves the primary lifecycle outcome
    ok 3 - redacts cleanup failure and preserves the primary lifecycle outcome
      ---
      duration_ms: 0.844368
      type: 'test'
      ...
    # Subtest: bounds a never-settling removal and preserves the primary result
    ok 4 - bounds a never-settling removal and preserves the primary result
      ---
      duration_ms: 10.478753
      type: 'test'
      ...
    # Subtest: bounds a never-settling authorization call as a fixed cleanup failure
    ok 5 - bounds a never-settling authorization call as a fixed cleanup failure
      ---
      duration_ms: 10.601907
      type: 'test'
      ...
    # Subtest: isolates default Windows filesystem cleanup from the harness process
    ok 6 - isolates default Windows filesystem cleanup from the harness process
      ---
      duration_ms: 37.174174
      type: 'test'
      ...
    # Subtest: refuses a link, renamed leaf, or fixture outside the canonical temporary parent
    ok 7 - refuses a link, renamed leaf, or fixture outside the canonical temporary parent
      ---
      duration_ms: 0.490288
      type: 'test'
      ...
    1..7
ok 2 - packaged Connect fixture cleanup
  ---
  duration_ms: 64.324586
  type: 'suite'
  ...
1..2
# tests 31
# suites 2
# pass 31
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 363.613491

[5/385] apps/desktop/scripts/packaged-connect-platform.test.mjs
TAP version 13
# Subtest: packaged Connect target-native credential setup
    # Subtest: Linux retains one isolated unlocked libsecret session and rejects plaintext fallback
    ok 1 - Linux retains one isolated unlocked libsecret session and rejects plaintext fallback
      ---
      duration_ms: 3.732132
      type: 'test'
      ...
    # Subtest: Darwin uses only a generated ephemeral default keychain and restores it on exit
    ok 2 - Darwin uses only a generated ephemeral default keychain and restores it on exit
      ---
      duration_ms: 0.477669
      type: 'test'
      ...
    1..2
ok 1 - packaged Connect target-native credential setup
  ---
  duration_ms: 5.074843
  type: 'suite'
  ...
1..1
# tests 2
# suites 1
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 208.870383

[6/385] apps/desktop/scripts/packaged-layout.test.mjs
TAP version 13
# Subtest: packaged desktop event parsing
    # Subtest: returns the first full record for the exact matching event
    ok 1 - returns the first full record for the exact matching event
      ---
      duration_ms: 1.145681
      type: 'test'
      ...
    # Subtest: returns undefined when the event is absent
    ok 2 - returns undefined when the event is absent
      ---
      duration_ms: 0.150386
      type: 'test'
      ...
    1..2
ok 1 - packaged desktop event parsing
  ---
  duration_ms: 2.036522
  type: 'suite'
  ...
# Subtest: packaged desktop layout assertions
    # Subtest: retains the exact 1280x820 Linux Xvfb proof
    ok 1 - retains the exact 1280x820 Linux Xvfb proof
      ---
      duration_ms: 0.853507
      type: 'test'
      ...
    # Subtest: accepts a safe 1024x720 Windows display clamp with intact contained content
    ok 2 - accepts a safe 1024x720 Windows display clamp with intact contained content
      ---
      duration_ms: 0.15003
      type: 'test'
      ...
    # Subtest: rejects unsafe Windows clamps and content outside the visible work area
    ok 3 - rejects unsafe Windows clamps and content outside the visible work area
      ---
      duration_ms: 0.150982
      type: 'test'
      ...
    1..3
ok 2 - packaged desktop layout assertions
  ---
  duration_ms: 1.354692
  type: 'suite'
  ...
1..2
# tests 5
# suites 2
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 198.653195

[7/385] apps/desktop/scripts/packaged-smoke-support.test.mjs
TAP version 13
# Subtest: packaged smoke native window layout
    # Subtest: accepts the preferred size while retaining responsive containment
    ok 1 - accepts the preferred size while retaining responsive containment
      ---
      duration_ms: 1.160102
      type: 'test'
      ...
    # Subtest: accepts the 1024x720-clamped size while retaining responsive containment
    ok 2 - accepts the 1024x720-clamped size while retaining responsive containment
      ---
      duration_ms: 0.143892
      type: 'test'
      ...
    # Subtest: accepts the configured minimum size while retaining responsive containment
    ok 3 - accepts the configured minimum size while retaining responsive containment
      ---
      duration_ms: 0.093658
      type: 'test'
      ...
    # Subtest: accepts the undersized work area while retaining responsive containment
    ok 4 - accepts the undersized work area while retaining responsive containment
      ---
      duration_ms: 0.088358
      type: 'test'
      ...
    # Subtest: rejects an unclamped window or a viewport inconsistent with native content chrome
    ok 5 - rejects an unclamped window or a viewport inconsistent with native content chrome
      ---
      duration_ms: 0.489937
      type: 'test'
      ...
    # Subtest: accepts actual reduced native sizing only when both minimum constraints are exercised
    ok 6 - accepts actual reduced native sizing only when both minimum constraints are exercised
      ---
      duration_ms: 0.179233
      type: 'test'
      ...
    1..6
ok 1 - packaged smoke native window layout
  ---
  duration_ms: 3.168061
  type: 'suite'
  ...
# Subtest: packaged smoke child environment
    # Subtest: defines four isolated launches with exact per-mode environment, argv, and marker contracts
    ok 1 - defines four isolated launches with exact per-mode environment, argv, and marker contracts
      ---
      duration_ms: 1.259433
      type: 'test'
      ...
    # Subtest: passes only platform launch inputs and private profile paths from a hostile parent
    ok 2 - passes only platform launch inputs and private profile paths from a hostile parent
      ---
      duration_ms: 16.047988
      type: 'test'
      ...
    # Subtest: keeps cleanup bounded to the generated profile root
    ok 3 - keeps cleanup bounded to the generated profile root
      ---
      duration_ms: 12.662924
      type: 'test'
      ...
    # Subtest: accepts only a normalized absolute Windows SystemRoot directory
    ok 4 - accepts only a normalized absolute Windows SystemRoot directory
      ---
      duration_ms: 1.855102
      type: 'test'
      ...
    # Subtest: contains no parent environment spread, enumeration, denylist, PATH, or shell launch
    ok 5 - contains no parent environment spread, enumeration, denylist, PATH, or shell launch
      ---
      duration_ms: 2.1599
      type: 'test'
      ...
    # Subtest: serves each named fixture identity paired with its persisted credential
    ok 6 - serves each named fixture identity paired with its persisted credential
      ---
      duration_ms: 1.491227
      type: 'test'
      ...
    # Subtest: requires the adjacent packaged spawn options with LF or CRLF source
    ok 7 - requires the adjacent packaged spawn options with LF or CRLF source
      ---
      duration_ms: 1.691536
      type: 'test'
      ...
    1..7
ok 2 - packaged smoke child environment
  ---
  duration_ms: 38.135462
  type: 'suite'
  ...
1..2
# tests 13
# suites 2
# pass 13
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 258.555913

[8/385] apps/desktop/scripts/release-architecture.test.mjs
TAP version 13
# Subtest: machine-wide Windows artifacts require a real MSI compound file
ok 1 - machine-wide Windows artifacts require a real MSI compound file
  ---
  duration_ms: 6.523388
  type: 'test'
  ...
# Subtest: administrative MSI payload inspection
    # Subtest: uses exact fixed native extractor argv and minimal environments
    ok 1 - uses exact fixed native extractor argv and minimal environments
      ---
      duration_ms: 0.953531
      type: 'test'
      ...
    # Subtest: accepts only the canonical application with the one administrative root prefix
    ok 2 - accepts only the canonical application with the one administrative root prefix
      ---
      duration_ms: 9.054981
      type: 'test'
      ...
    # Subtest: rejects path escapes and case collisions from the Linux listing before extraction
    ok 3 - rejects path escapes and case collisions from the Linux listing before extraction
      ---
      duration_ms: 0.812812
      type: 'test'
      ...
    # Subtest: uses fixed missing and duplicate canonical-app codes with bounded counts
    ok 4 - uses fixed missing and duplicate canonical-app codes with bounded counts
      ---
      duration_ms: 7.018779
      type: 'test'
      ...
    # Subtest: distinguishes authority resources, unsafe trees, and architecture mismatch without path data
    ok 5 - distinguishes authority resources, unsafe trees, and architecture mismatch without path data
      ---
      duration_ms: 7.115197
      type: 'test'
      ...
    # Subtest: maps extractor failures to one redacted tool code
    ok 6 - maps extractor failures to one redacted tool code
      ---
      duration_ms: 2.319532
      type: 'test'
      ...
    # Subtest: retains compound-file, per-machine scope, and canonical PE evidence across extraction
    ok 7 - retains compound-file, per-machine scope, and canonical PE evidence across extraction
      ---
      duration_ms: 3.256755
      type: 'test'
      ...
    # Subtest: fails closed on extractor nonzero, stderr, output overflow, and timeout
    ok 8 - fails closed on extractor nonzero, stderr, output overflow, and timeout
      ---
      duration_ms: 134.809424
      type: 'test'
      ...
    1..8
ok 2 - administrative MSI payload inspection
  ---
  duration_ms: 166.324776
  type: 'suite'
  ...
# Subtest: DEB and RPM executable layouts
    # Subtest: accept only the canonical regular ELF payload and documented launcher symlink
    ok 1 - accept only the canonical regular ELF payload and documented launcher symlink
      ---
      duration_ms: 15.296732
      type: 'test'
      ...
    # Subtest: reject missing and extra payload names for both package formats
    ok 2 - reject missing and extra payload names for both package formats
      ---
      duration_ms: 13.429349
      type: 'test'
      ...
    # Subtest: reject unexpected same-name file types and non-ELF or cross-architecture payloads
    ok 3 - reject unexpected same-name file types and non-ELF or cross-architecture payloads
      ---
      duration_ms: 15.310432
      type: 'test'
      ...
    # Subtest: reject launcher escapes, cycles, and targets other than the canonical payload
    ok 4 - reject launcher escapes, cycles, and targets other than the canonical payload
      ---
      duration_ms: 11.037768
      type: 'test'
      ...
    # Subtest: reject special files with the executable name
    ok 5 - reject special files with the executable name
      ---
      duration_ms: 8.126181
      type: 'test'
      ...
    1..5
ok 3 - DEB and RPM executable layouts
  ---
  duration_ms: 63.593464
  type: 'suite'
  ...
# Subtest: DMG application layout
    # Subtest: accepts the real Forge tree with its install link and nested Electron helper bundles
    ok 1 - accepts the real Forge tree with its install link and nested Electron helper bundles
      ---
      duration_ms: 12.134612
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper bundle
    ok 2 - rejects a symbolic-link canonical helper bundle
      ---
      duration_ms: 5.823403
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper executable ancestor
    ok 3 - rejects a symbolic-link canonical helper executable ancestor
      ---
      duration_ms: 8.031074
      type: 'test'
      ...
    # Subtest: rejects every symbolic link outside canonical framework internals
    ok 4 - rejects every symbolic link outside canonical framework internals
      ---
      duration_ms: 8.974959
      type: 'test'
      ...
    # Subtest: rejects escaping, cyclic, missing, and case-mismatched framework symbolic links
    ok 5 - rejects escaping, cyclic, missing, and case-mismatched framework symbolic links
      ---
      duration_ms: 36.420535
      type: 'test'
      ...
    # Subtest: never treats Linux 7z sanitized install-link output as native layout evidence
    ok 6 - never treats Linux 7z sanitized install-link output as native layout evidence
      ---
      duration_ms: 7.530118
      type: 'test'
      ...
    # Subtest: rejects wrong bundles, alternate same-name executables, and canonical symlink escapes
    ok 7 - rejects wrong bundles, alternate same-name executables, and canonical symlink escapes
      ---
      duration_ms: 12.643635
      type: 'test'
      ...
    # Subtest: rejects alternate top-level application bundles
    ok 8 - rejects alternate top-level application bundles
      ---
      duration_ms: 6.300777
      type: 'test'
      ...
    # Subtest: rejects unsafe links inside the canonical application bundle
    ok 9 - rejects unsafe links inside the canonical application bundle
      ---
      duration_ms: 10.855559
      type: 'test'
      ...
    # Subtest: rejects non-helper nested application bundles
    ok 10 - rejects non-helper nested application bundles
      ---
      duration_ms: 8.794548
      type: 'test'
      ...
    # Subtest: rejects case-colliding top-level entries when the filesystem permits them
    ok 11 - rejects case-colliding top-level entries when the filesystem permits them
      ---
      duration_ms: 5.95524
      type: 'test'
      ...
    # Subtest: rejects special files inside the canonical application bundle
    ok 12 - rejects special files inside the canonical application bundle
      ---
      duration_ms: 11.503605
      type: 'test'
      ...
    1..12
ok 4 - DMG application layout
  ---
  duration_ms: 135.696378
  type: 'suite'
  ...
1..4
# tests 26
# suites 3
# pass 26
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 572.766558

[9/385] apps/desktop/scripts/release-artifacts.test.mjs
TAP version 13
# Subtest: desktop release artifacts
    # Subtest: stages named artifacts and finalizes unsigned validation metadata
    ok 1 - stages named artifacts and finalizes unsigned validation metadata
      ---
      duration_ms: 124.122887
      type: 'test'
      ...
    # Subtest: rejects extensionless, doubled-extension, case-conflicting, duplicate, wrong-kind, stale, and mixed-target names
    ok 2 - rejects extensionless, doubled-extension, case-conflicting, duplicate, wrong-kind, stale, and mixed-target names
      ---
      duration_ms: 236.166874
      type: 'test'
      ...
    # Subtest: rejects altered DMG bytes even when fragment artifact metadata is rewritten
    ok 3 - rejects altered DMG bytes even when fragment artifact metadata is rewritten
      ---
      duration_ms: 22.822372
      type: 'test'
      ...
    # Subtest: rejects permanent DMG replacement or in-place mutation during held inspection without emitting evidence
    ok 4 - rejects permanent DMG replacement or in-place mutation during held inspection without emitting evidence
      ---
      duration_ms: 9.858674
      type: 'test'
      ...
    # Subtest: keeps held A bytes, evidence, and publication stable when original and public pathnames change during inspection
    ok 5 - keeps held A bytes, evidence, and publication stable when original and public pathnames change during inspection
      ---
      duration_ms: 8.15624
      type: 'test'
      ...
    # Subtest: continues to reject a mutable pathname passed directly to DMG inspection
    ok 6 - continues to reject a mutable pathname passed directly to DMG inspection
      ---
      duration_ms: 0.26542
      type: 'test'
      ...
    # Subtest: requires explicit fixture authority for Windows-hosted DMG evidence tests
    ok 7 - requires explicit fixture authority for Windows-hosted DMG evidence tests # SKIP
      ---
      duration_ms: 0.058895
      type: 'test'
      ...
    # Subtest: accepts real Darwin mode-0700 directory and mode-0600 single-link file authority
    ok 8 - accepts real Darwin mode-0700 directory and mode-0600 single-link file authority # SKIP
      ---
      duration_ms: 0.039435
      type: 'test'
      ...
    # Subtest: rejects native Darwin broad mode, foreign owner, extra link, replacement type, and symlink with fixed authority codes
    ok 9 - rejects native Darwin broad mode, foreign owner, extra link, replacement type, and symlink with fixed authority codes # SKIP
      ---
      duration_ms: 0.06677
      type: 'test'
      ...
    # Subtest: accepts native xattr/ctime-only change when held bytes and identity are unchanged
    ok 10 - accepts native xattr/ctime-only change when held bytes and identity are unchanged # SKIP
      ---
      duration_ms: 0.220895
      type: 'test'
      ...
    # Subtest: does not emit claimed DMG layout evidence without the native-validation marker
    ok 11 - does not emit claimed DMG layout evidence without the native-validation marker
      ---
      duration_ms: 7.774785
      type: 'test'
      ...
    # Subtest: strictly rejects missing, mixed, stale, malformed, or fabricated native DMG evidence
    ok 12 - strictly rejects missing, mixed, stale, malformed, or fabricated native DMG evidence
      ---
      duration_ms: 291.048106
      type: 'test'
      ...
    # Subtest: rejects native DMG evidence copied between x64 and arm64 fragments
    ok 13 - rejects native DMG evidence copied between x64 and arm64 fragments
      ---
      duration_ms: 18.60485
      type: 'test'
      ...
    # Subtest: rejects duplicate target fragments before aggregation
    ok 14 - rejects duplicate target fragments before aggregation
      ---
      duration_ms: 25.382232
      type: 'test'
      ...
    # Subtest: rejects either Windows fragment when the installed ordinary-user application gate was skipped
    ok 15 - rejects either Windows fragment when the installed ordinary-user application gate was skipped
      ---
      duration_ms: 65.961526
      type: 'test'
      ...
    # Subtest: fails closed when trusted update signing configuration is incomplete
    ok 16 - fails closed when trusted update signing configuration is incomplete
      ---
      duration_ms: 65.00574
      type: 'test'
      ...
    # Subtest: signs cryptographically bound feeds only in the trusted release phase
    ok 17 - signs cryptographically bound feeds only in the trusted release phase
      ---
      duration_ms: 48.197452
      type: 'test'
      ...
    # Subtest: refuses to sign a renamed extensionless distributable
    ok 18 - refuses to sign a renamed extensionless distributable
      ---
      duration_ms: 40.497065
      type: 'test'
      ...
    # Subtest: refuses to sign when artifact bytes changed after unsigned finalization
    ok 19 - refuses to sign when artifact bytes changed after unsigned finalization
      ---
      duration_ms: 43.444638
      type: 'test'
      ...
    # Subtest: rejects unsigned production metadata and actual signer mismatches
    ok 20 - rejects unsigned production metadata and actual signer mismatches
      ---
      duration_ms: 77.211403
      type: 'test'
      ...
    # Subtest: rejects mixed Windows signers and tampered fingerprint evidence
    ok 21 - rejects mixed Windows signers and tampered fingerprint evidence
      ---
      duration_ms: 44.990839
      type: 'test'
      ...
    # Subtest: parses x64 and arm64 ELF, PE, and Mach-O executable fixtures
    ok 22 - parses x64 and arm64 ELF, PE, and Mach-O executable fixtures
      ---
      duration_ms: 1.215238
      type: 'test'
      ...
    # Subtest: derives Windows target architecture from the full NUPKG independently of its supported bootstrapper
    ok 23 - derives Windows target architecture from the full NUPKG independently of its supported bootstrapper
      ---
      duration_ms: 10.532254
      type: 'test'
      ...
    # Subtest: binds ZIP and NUPKG executables to exact maker-specific canonical paths
    ok 24 - binds ZIP and NUPKG executables to exact maker-specific canonical paths
      ---
      duration_ms: 3.467485
      type: 'test'
      ...
    # Subtest: rejects missing, corrupt, mismatched, and ambiguous packaged Windows authority helpers
    ok 25 - rejects missing, corrupt, mismatched, and ambiguous packaged Windows authority helpers
      ---
      duration_ms: 6.101001
      type: 'test'
      ...
    # Subtest: accepts only the real Forge macOS framework-internal symbolic-link layout
    ok 26 - accepts only the real Forge macOS framework-internal symbolic-link layout
      ---
      duration_ms: 4.93099
      type: 'test'
      ...
    # Subtest: rejects hostile macOS ZIP symbolic links before trusting their payloads
    ok 27 - rejects hostile macOS ZIP symbolic links before trusting their payloads
      ---
      duration_ms: 15.434286
      type: 'test'
      ...
    # Subtest: rejects unsafe, duplicate, shadowed, forged, alternate, and noncanonical archive layouts
    ok 28 - rejects unsafe, duplicate, shadowed, forged, alternate, and noncanonical archive layouts
      ---
      duration_ms: 5.39878
      type: 'test'
      ...
    # Subtest: rejects cross-labeled package architectures at staging and finalization
    ok 29 - rejects cross-labeled package architectures at staging and finalization
      ---
      duration_ms: 37.112643
      type: 'test'
      ...
    1..29
ok 1 - desktop release artifacts
  ---
  duration_ms: 1216.664058
  type: 'suite'
  ...
1..1
# tests 29
# suites 1
# pass 25
# fail 0
# cancelled 0
# skipped 4
# todo 0
# duration_ms 1423.915498

[10/385] apps/desktop/scripts/release-preflight.test.mjs
TAP version 13
# Subtest: desktop release preflight
    # Subtest: accepts only a new immutable tag reachable from protected main and a protected environment
    ok 1 - accepts only a new immutable tag reachable from protected main and a protected environment
      ---
      duration_ms: 3.582639
      type: 'test'
      ...
    # Subtest: accepts an authorization-visible bypass list and fails closed for hidden or denied ruleset details
    ok 2 - accepts an authorization-visible bypass list and fails closed for hidden or denied ruleset details
      ---
      duration_ms: 1.147558
      type: 'test'
      ...
    # Subtest: paginates repository rulesets and reads every full rule definition
    ok 3 - paginates repository rulesets and reads every full rule definition
      ---
      duration_ms: 3.445412
      type: 'test'
      ...
    # Subtest: requires an exact active bypass-free update and deletion tag ruleset
    ok 4 - requires an exact active bypass-free update and deletion tag ruleset
      ---
      duration_ms: 1.687829
      type: 'test'
      ...
    # Subtest: rejects ruleset mutation or deletion during preflight
    ok 5 - rejects ruleset mutation or deletion during preflight
      ---
      duration_ms: 1.079741
      type: 'test'
      ...
    # Subtest: requires the complete effective environment policy set to be exactly desktop-v* tags
    ok 6 - requires the complete effective environment policy set to be exactly desktop-v* tags
      ---
      duration_ms: 2.82112
      type: 'test'
      ...
    # Subtest: requires the separately protected preflight credential environment
    ok 7 - requires the separately protected preflight credential environment
      ---
      duration_ms: 0.725421
      type: 'test'
      ...
    # Subtest: paginates all environment policies and rejects a permissive policy on a later page
    ok 8 - paginates all environment policies and rejects a permissive policy on a later page
      ---
      duration_ms: 0.94638
      type: 'test'
      ...
    # Subtest: rejects missing or ambiguous environment protection and explicit API denial
    ok 9 - rejects missing or ambiguous environment protection and explicit API denial
      ---
      duration_ms: 0.872944
      type: 'test'
      ...
    # Subtest: rejects tags not created by this push, tags off main, and moved or existing releases
    ok 10 - rejects tags not created by this push, tags off main, and moved or existing releases
      ---
      duration_ms: 1.58347
      type: 'test'
      ...
    1..10
ok 1 - desktop release preflight
  ---
  duration_ms: 19.173723
  type: 'suite'
  ...
1..1
# tests 10
# suites 1
# pass 10
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 230.705216

[11/385] apps/desktop/scripts/release-publish.test.mjs
TAP version 13
# Subtest: atomic desktop release publication
    # Subtest: creates a draft, paginates and verifies the exact final assets, then publishes
    ok 1 - creates a draft, paginates and verifies the exact final assets, then publishes
      ---
      duration_ms: 134.112135
      type: 'test'
      ...
    # Subtest: leaves a partial upload as a recoverable draft and resumes only matching assets
    ok 2 - leaves a partial upload as a recoverable draft and resumes only matching assets
      ---
      duration_ms: 9.969772
      type: 'test'
      ...
    # Subtest: rejects unexpected, duplicate, size, and content-digest asset mismatches without publishing
    ok 3 - rejects unexpected, duplicate, size, and content-digest asset mismatches without publishing
      ---
      duration_ms: 6.542279
      type: 'test'
      ...
    # Subtest: rejects tag drift before publishing the verified draft
    ok 4 - rejects tag drift before publishing the verified draft
      ---
      duration_ms: 4.19348
      type: 'test'
      ...
    # Subtest: rejects local files outside or missing from finalized checksums
    ok 5 - rejects local files outside or missing from finalized checksums
      ---
      duration_ms: 2.652864
      type: 'test'
      ...
    1..5
ok 1 - atomic desktop release publication
  ---
  duration_ms: 158.667417
  type: 'suite'
  ...
1..1
# tests 5
# suites 1
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 363.421538

[12/385] apps/desktop/scripts/verify-darwin-image.test.mjs
TAP version 13
# Subtest: Darwin image verification retries only bounded documented resource states
ok 1 - Darwin image verification retries only bounded documented resource states
  ---
  duration_ms: 12.899864
  type: 'test'
  ...
# Subtest: Darwin image verification does not retry malformed/truncated images or accept mutation
ok 2 - Darwin image verification does not retry malformed/truncated images or accept mutation
  ---
  duration_ms: 13.187847
  type: 'test'
  ...
# Subtest: Darwin image verification holds a fixed hdiutil image behind a real mutation and replacement barrier
ok 3 - Darwin image verification holds a fixed hdiutil image behind a real mutation and replacement barrier # SKIP
  ---
  duration_ms: 0.251356
  type: 'test'
  ...
1..3
# tests 3
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 230.483489

[13/385] apps/desktop/scripts/windows-fixture-acl.test.mjs
TAP version 13
# Subtest: keeps the encoded Windows PowerShell 5.1 ACL helper fail-closed and byte-empty
ok 1 - keeps the encoded Windows PowerShell 5.1 ACL helper fail-closed and byte-empty # SKIP
  ---
  duration_ms: 0.564283
  type: 'test'
  ...
1..1
# tests 1
# suites 0
# pass 0
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 198.602313

[14/385] apps/desktop/scripts/windows-packaged-connect-staging.test.mjs
TAP version 13
# Subtest: capture redirection mismatch reporting is total and redacted for each launch predicate
ok 1 - capture redirection mismatch reporting is total and redacted for each launch predicate
  ---
  duration_ms: 3.161046
  type: 'test'
  ...
# Subtest: positive host Node producer failures expose only fixed allowlisted evidence
ok 2 - positive host Node producer failures expose only fixed allowlisted evidence
  ---
  duration_ms: 0.902693
  type: 'test'
  ...
# Subtest: hostile diagnostics reject uppercase PATH without matching fixed path subphases
ok 3 - hostile diagnostics reject uppercase PATH without matching fixed path subphases
  ---
  duration_ms: 0.119052
  type: 'test'
  ...
# Subtest: packaged Windows Connect staging contract
    # Subtest: accepts only the exact generated leaf below the fixed canonical staging parent
    ok 1 - accepts only the exact generated leaf below the fixed canonical staging parent
      ---
      duration_ms: 1.104457
      type: 'test'
      ...
    # Subtest: accepts one bounded parent-owned handoff and rejects every other input shape
    ok 2 - accepts one bounded parent-owned handoff and rejects every other input shape
      ---
      duration_ms: 0.522905
      type: 'test'
      ...
    # Subtest: emits only fixed staged-contract predicate evidence
    ok 3 - emits only fixed staged-contract predicate evidence
      ---
      duration_ms: 0.653832
      type: 'test'
      ...
    # Subtest: rejects missing, inaccessible, reparse, wrong-type, and noncanonical entries before preflight
    ok 4 - rejects missing, inaccessible, reparse, wrong-type, and noncanonical entries before preflight
      ---
      duration_ms: 1.438129
      type: 'test'
      ...
    # Subtest: proves target PE architecture and ordinary-user access before returning the executable
    ok 5 - proves target PE architecture and ordinary-user access before returning the executable
      ---
      duration_ms: 1.197492
      type: 'test'
      ...
    # Subtest: maps a hostile preflight callback throw totally and redacts all supplied evidence
    ok 6 - maps a hostile preflight callback throw totally and redacts all supplied evidence
      ---
      duration_ms: 0.658024
      type: 'test'
      ...
    # Subtest: keeps PE type and architecture failures distinct
    ok 7 - keeps PE type and architecture failures distinct
      ---
      duration_ms: 0.521318
      type: 'test'
      ...
    # Subtest: maps hostile exceptions to a fixed path-free allowlist
    ok 8 - maps hostile exceptions to a fixed path-free allowlist
      ---
      duration_ms: 0.512356
      type: 'test'
      ...
    # Subtest: classifies fixed phases without collapsing pre-spawn failures into spawn
    ok 9 - classifies fixed phases without collapsing pre-spawn failures into spawn
      ---
      duration_ms: 0.29673
      type: 'test'
      ...
    # Subtest: maps every preflight transport and exit result to fixed subphase evidence
    ok 10 - maps every preflight transport and exit result to fixed subphase evidence
      ---
      duration_ms: 0.717524
      type: 'test'
      ...
    # Subtest: preflight diagnostics exclude path, SID, account name, stdout, and stderr evidence
    ok 11 - preflight diagnostics exclude path, SID, account name, stdout, and stderr evidence
      ---
      duration_ms: 0.3231
      type: 'test'
      ...
    # Subtest: scopes staged-root and executable leak needles to Windows
    ok 12 - scopes staged-root and executable leak needles to Windows
      ---
      duration_ms: 0.174629
      type: 'test'
      ...
    1..12
ok 4 - packaged Windows Connect staging contract
  ---
  duration_ms: 8.886978
  type: 'suite'
  ...
# Subtest: the workflow stages before alternate credentials and the harness preflights before application spawn
ok 5 - the workflow stages before alternate credentials and the harness preflights before application spawn
  ---
  duration_ms: 20.04047
  type: 'test'
  ...
# Subtest: the PS5.1 child-failure parser accepts only the two exact bounded producer schemas
ok 6 - the PS5.1 child-failure parser accepts only the two exact bounded producer schemas # SKIP
  ---
  duration_ms: 0.134753
  type: 'test'
  ...
# Subtest: the PS5.1 capture parser enforces native owner ACL path and identity authority
ok 7 - the PS5.1 capture parser enforces native owner ACL path and identity authority # SKIP
  ---
  duration_ms: 0.055864
  type: 'test'
  ...
# Subtest: nominal reaches zero with exact protected stdout and stderr capture
ok 8 - nominal reaches zero with exact protected stdout and stderr capture # SKIP
  ---
  duration_ms: 0.043565
  type: 'test'
  ...
# Subtest: a forced nonzero capture producer maps only to redirect-child-exit
ok 9 - a forced nonzero capture producer maps only to redirect-child-exit # SKIP
  ---
  duration_ms: 0.048922
  type: 'test'
  ...
# Subtest: empty and hostile producer results map only to fixed bounded buckets
ok 10 - empty and hostile producer results map only to fixed bounded buckets # SKIP
  ---
  duration_ms: 0.135371
  type: 'test'
  ...
# Subtest: each host preflight failure transition emits one fixed redacted subphase
ok 11 - each host preflight failure transition emits one fixed redacted subphase # SKIP
  ---
  duration_ms: 0.077399
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects zero command evidence
ok 12 - the PS5.1 host Node producer rejects zero command evidence # SKIP
  ---
  duration_ms: 0.039538
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects duplicate command evidence
ok 13 - the PS5.1 host Node producer rejects duplicate command evidence # SKIP
  ---
  duration_ms: 0.038295
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects multiple command evidence
ok 14 - the PS5.1 host Node producer rejects multiple command evidence # SKIP
  ---
  duration_ms: 0.038411
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects mixed-types command evidence
ok 15 - the PS5.1 host Node producer rejects mixed-types command evidence # SKIP
  ---
  duration_ms: 0.040491
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects case-collision command evidence
ok 16 - the PS5.1 host Node producer rejects case-collision command evidence # SKIP
  ---
  duration_ms: 0.045259
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects non-application command evidence
ok 17 - the PS5.1 host Node producer rejects non-application command evidence # SKIP
  ---
  duration_ms: 0.040387
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects missing-source command evidence
ok 18 - the PS5.1 host Node producer rejects missing-source command evidence # SKIP
  ---
  duration_ms: 0.037073
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer rejects non-scalar-source command evidence
ok 19 - the PS5.1 host Node producer rejects non-scalar-source command evidence # SKIP
  ---
  duration_ms: 0.045203
  type: 'test'
  ...
# Subtest: the PS5.1 host Node producer returns one validated scalar Source
ok 20 - the PS5.1 host Node producer returns one validated scalar Source # SKIP
  ---
  duration_ms: 0.093185
  type: 'test'
  ...
# Subtest: the host launcher accepts only a stable final ordinary-file identity
ok 21 - the host launcher accepts only a stable final ordinary-file identity # SKIP
  ---
  duration_ms: 0.041416
  type: 'test'
  ...
# Subtest: the bounded cleanup source requires proven child exit and bounded stream closure
ok 22 - the bounded cleanup source requires proven child exit and bounded stream closure
  ---
  duration_ms: 9.041072
  type: 'test'
  ...
# Subtest: the native timeout path terminates an actual child and descendant tree
ok 23 - the native timeout path terminates an actual child and descendant tree # SKIP
  ---
  duration_ms: 0.170154
  type: 'test'
  ...
# Subtest: a real never-settling cleanup is bounded, terminated, and remains secondary
ok 24 - a real never-settling cleanup is bounded, terminated, and remains secondary # SKIP
  ---
  duration_ms: 0.049862
  type: 'test'
  ...
1..24
# tests 35
# suites 1
# pass 17
# fail 0
# cancelled 0
# skipped 18
# todo 0
# duration_ms 286.650672

[15/385] apps/desktop/src/connect-discovery.test.ts
TAP version 13
# Subtest: desktop fixed-root Connect discovery
    # Subtest: projects only a stable opaque profile and canonical endpoint
    ok 1 - projects only a stable opaque profile and canonical endpoint
      ---
      duration_ms: 1.735654
      type: 'test'
      ...
    # Subtest: fences rediscovery to an existing managed profile and preserves its id and label
    ok 2 - fences rediscovery to an existing managed profile and preserves its id and label
      ---
      duration_ms: 0.860657
      type: 'test'
      ...
    # Subtest: discards rediscovery when the exact saved profile changes while native discovery awaits
    ok 3 - discards rediscovery when the exact saved profile changes while native discovery awaits
      ---
      duration_ms: 0.420787
      type: 'test'
      ...
    # Subtest: fails closed for unsupported hosts and malformed native results
    ok 4 - fails closed for unsupported hosts and malformed native results
      ---
      duration_ms: 0.463483
      type: 'test'
      ...
    # Subtest: generation-conditionally clears failed intents while keeping prior activations fenced
    ok 5 - generation-conditionally clears failed intents while keeping prior activations fenced
      ---
      duration_ms: 0.59665
      type: 'test'
      ...
    # Subtest: scopes discovery freshness per profile and only discards stale same-profile completions
    ok 6 - scopes discovery freshness per profile and only discards stale same-profile completions
      ---
      duration_ms: 0.330841
      type: 'test'
      ...
    1..6
ok 1 - desktop fixed-root Connect discovery
  ---
  duration_ms: 5.334111
  type: 'suite'
  ...
1..1
# tests 6
# suites 1
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 387.221627

[16/385] apps/desktop/src/credential-service.pairing-browser.test.ts
TAP version 13
# Subtest: DesktopCredentialService pairing browser sink
    # Subtest: pairs through the browser journey and rejects a response URL replacement
    ok 1 - pairs through the browser journey and rejects a response URL replacement
      ---
      duration_ms: 112.773562
      type: 'test'
      ...
    1..1
ok 1 - DesktopCredentialService pairing browser sink
  ---
  duration_ms: 113.559541
  type: 'suite'
  ...
1..1
# tests 1
# suites 1
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 589.781636

[17/385] apps/desktop/src/credential-service.test.ts
TAP version 13
# Subtest: main-process desktop credential service
    # Subtest: fails a relaunched same-origin replacement closed before sending the stored bearer
    ok 1 - fails a relaunched same-origin replacement closed before sending the stored bearer
      ---
      duration_ms: 91.352152
      type: 'test'
      ...
    # Subtest: fails malformed identity closed and classifies legacy public-discovery 401 safely
    ok 2 - fails malformed identity closed and classifies legacy public-discovery 401 safely
      ---
      duration_ms: 72.109591
      type: 'test'
      ...
    # Subtest: revalidates an old Socket.IO reconnect and sends zero bearer requests after identity rotation
    ok 3 - revalidates an old Socket.IO reconnect and sends zero bearer requests after identity rotation
      ---
      duration_ms: 48.901267
      type: 'test'
      ...
    # Subtest: fences old and concurrently rotated Connect claims through pairing, commit, and transport activation
    ok 4 - fences old and concurrently rotated Connect claims through pairing, commit, and transport activation
      ---
      duration_ms: 216.862601
      type: 'test'
      ...
    # Subtest: injects the active bearer only for its bound profile origin and strips renderer identity
    ok 5 - injects the active bearer only for its bound profile origin and strips renderer identity
      ---
      duration_ms: 52.363468
      type: 'test'
      ...
    # Subtest: uses only the active bearer when profiles share an origin and never a cookie identity
    ok 6 - uses only the active bearer when profiles share an origin and never a cookie identity
      ---
      duration_ms: 60.20623
      type: 'test'
      ...
    # Subtest: detaches origin and identity mismatches before bearer use or early protocol exits
    ok 7 - detaches origin and identity mismatches before bearer use or early protocol exits
      ---
      duration_ms: 108.563209
      type: 'test'
      ...
    # Subtest: does not mint a ticket when a delayed B probe observes credential replacement with origin A
    ok 8 - does not mint a ticket when a delayed B probe observes credential replacement with origin A
      ---
      duration_ms: 42.107986
      type: 'test'
      ...
    # Subtest: atomically rejects a ticket when delayed activation races with profile B credential A
    ok 9 - atomically rejects a ticket when delayed activation races with profile B credential A
      ---
      duration_ms: 47.803044
      type: 'test'
      ...
    # Subtest: keeps a slow successful same-origin A probe status-only after fast B activates
    ok 10 - keeps a slow successful same-origin A probe status-only after fast B activates
      ---
      duration_ms: 72.210278
      type: 'test'
      ...
    # Subtest: keeps A active while B is only probed and if B selection persistence fails
    ok 11 - keeps A active while B is only probed and if B selection persistence fails
      ---
      duration_ms: 69.201526
      type: 'test'
      ...
    # Subtest: keeps B active during a direct same-origin A probe and rejects replayed activation tickets
    ok 12 - keeps B active during a direct same-origin A probe and rejects replayed activation tickets
      ---
      duration_ms: 64.600972
      type: 'test'
      ...
    # Subtest: rejects activation after candidate removal, selection drift, or exact credential replacement
    ok 13 - rejects activation after candidate removal, selection drift, or exact credential replacement
      ---
      duration_ms: 276.17371
      type: 'test'
      ...
    # Subtest: binds REST and Socket.IO work to one fresh scope and rejects stale or malformed markers
    ok 14 - binds REST and Socket.IO work to one fresh scope and rejects stale or malformed markers
      ---
      duration_ms: 97.775588
      type: 'test'
      ...
    # Subtest: passes through a realistic packaged-origin CORS preflight without renderer identity or bearer injection
    ok 15 - passes through a realistic packaged-origin CORS preflight without renderer identity or bearer injection
      ---
      duration_ms: 0.388629
      type: 'test'
      ...
    # Subtest: rotates scope on every same-profile reprobe and rejects a cold reconnect from the old activation
    ok 16 - rotates scope on every same-profile reprobe and rejects a cold reconnect from the old activation
      ---
      duration_ms: 48.132681
      type: 'test'
      ...
    # Subtest: never sends an A-origin bearer after the profile URL is edited to an attacker origin
    ok 17 - never sends an A-origin bearer after the profile URL is edited to an attacker origin
      ---
      duration_ms: 22.483528
      type: 'test'
      ...
    # Subtest: preserves a re-paired credential and current connection after a stale definitive probe response
    ok 18 - preserves a re-paired credential and current connection after a stale definitive probe response
      ---
      duration_ms: 80.610091
      type: 'test'
      ...
    # Subtest: preserves a replacement credential at a changed origin after a stale definitive probe response
    ok 19 - preserves a replacement credential at a changed origin after a stale definitive probe response
      ---
      duration_ms: 83.320601
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during browser-launch
    ok 20 - preserves the active profile and credential when an origin edit fails during browser-launch
      ---
      duration_ms: 48.398733
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during cancellation
    ok 21 - preserves the active profile and credential when an origin edit fails during cancellation
      ---
      duration_ms: 53.319226
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during expiry
    ok 22 - preserves the active profile and credential when an origin edit fails during expiry
      ---
      duration_ms: 61.751257
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during polling
    ok 23 - preserves the active profile and credential when an origin edit fails during polling
      ---
      duration_ms: 51.873486
      type: 'test'
      ...
    # Subtest: preserves the active profile and credential when an origin edit fails during secure-storage
    ok 24 - preserves the active profile and credential when an origin edit fails during secure-storage
      ---
      duration_ms: 55.029668
      type: 'test'
      ...
    # Subtest: commits an edited profile and replacement credential before revoking the old token
    ok 25 - commits an edited profile and replacement credential before revoking the old token
      ---
      duration_ms: 67.190346
      type: 'test'
      ...
# NATIVE_SCENARIO delivery
    # Subtest: durably journals a provisional delivery before server activation and local publication
    ok 26 - durably journals a provisional delivery before server activation and local publication
      ---
      duration_ms: 47.785462
      type: 'test'
      ...
    # Subtest: retries an encrypted pending A revocation across failure, restart, remote success, and local cleanup failure
    ok 27 - retries an encrypted pending A revocation across failure, restart, remote success, and local cleanup failure
      ---
      duration_ms: 182.602496
      type: 'test'
      ...
# NATIVE_SCENARIO revocation-crash
    # Subtest: recovers B and retries idempotently after a real process crash during-revoke
    ok 28 - recovers B and retries idempotently after a real process crash during-revoke
      ---
      duration_ms: 467.070394
      type: 'test'
      ...
# NATIVE_SCENARIO revocation-crash
    # Subtest: recovers B and retries idempotently after a real process crash after-remote-success
    ok 29 - recovers B and retries idempotently after a real process crash after-remote-success
      ---
      duration_ms: 446.026364
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 204 success
    ok 30 - cleans durable retry material only for endpoint-bound terminal 204 success
      ---
      duration_ms: 43.361193
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 404 TOKEN_NOT_FOUND
    ok 31 - cleans durable retry material only for endpoint-bound terminal 404 TOKEN_NOT_FOUND
      ---
      duration_ms: 45.360428
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_REVOKED
    ok 32 - cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_REVOKED
      ---
      duration_ms: 40.935086
      type: 'test'
      ...
    # Subtest: cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_EXPIRED
    ok 33 - cleans durable retry material only for endpoint-bound terminal 401 INSTANCE_TOKEN_EXPIRED
      ---
      duration_ms: 53.506902
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 401
    ok 34 - retains encrypted retry material for empty 401
      ---
      duration_ms: 36.170649
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 404
    ok 35 - retains encrypted retry material for empty 404
      ---
      duration_ms: 31.719596
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for HTML route 404
    ok 36 - retains encrypted retry material for HTML route 404
      ---
      duration_ms: 34.968293
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for malformed JSON
    ok 37 - retains encrypted retry material for malformed JSON
      ---
      duration_ms: 35.365451
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong content type
    ok 38 - retains encrypted retry material for wrong content type
      ---
      duration_ms: 33.87642
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong schema version
    ok 39 - retains encrypted retry material for wrong schema version
      ---
      duration_ms: 33.957217
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong credential generation
    ok 40 - retains encrypted retry material for wrong credential generation
      ---
      duration_ms: 67.642263
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for unknown terminal code
    ok 41 - retains encrypted retry material for unknown terminal code
      ---
      duration_ms: 30.287136
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for status/code mismatch
    ok 42 - retains encrypted retry material for status/code mismatch
      ---
      duration_ms: 31.664712
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirect
    ok 43 - retains encrypted retry material for redirect
      ---
      duration_ms: 32.368705
      type: 'test'
      ...


...(truncated)

View Workflow

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Applied the requested follow-up changes in commit 6dcfa7a

Summary of Changes

Fixed the sole full-suite failure in test/config-followup.test.ts.

The test now uses the registry-independent valid clear value ('') while preserving the same pr_review_model write/rollback assertions.

Validation:

  • Focused failing suite: 13/13 passed
  • Related config routes: 100/100 passed
  • git diff --check: passed
  • No production or visual changes
  • No commit created, as requested

🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @github-actions[bot]
  • Time: 3m 54s
  • Tokens: 1,410,436 (1,405,601 in / 4,835 out)
  • Cost: $1.24

Undo ChangesView Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5540233118✓

…test.ts](/tmp/git-processor/worktrees/integry/propr/pr-2089-followup-2026-09-04T12-11-00/test/config-followup.test.ts:67).

Fixed the sole full-suite failure in [test/config-followup.test.ts](/tmp/git-processor/worktrees/integry/propr/pr-2089-followup-2026-09-04T12-11-00/test/config-followup.test.ts:67).

The test now uses the registry-independent valid clear value (`''`) while preserving the same `pr_review_model` write/rollback assertions.

Validation:

- Focused failing suite: 13/13 passed
- Related config routes: 100/100 passed
- `git diff --check`: passed
- No production or visual changes
- No commit created, as requested

PR: #2089
Comment by: @github-actions[bot] (ID: 5540233118)
Model: gpt-5.6-sol
@integry integry removed the AI label Sep 4, 2026
@integry
integry merged commit e31a4e6 into 1953-epic-desktop-transport-api Sep 4, 2026
25 of 34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant