Skip to content

sync(desktop): propagate finalized transport into top epic - #2035

Open
integry wants to merge 211 commits into
1950-epic-cross-platform-dskfrom
1953-epic-desktop-transport-api
Open

sync(desktop): propagate finalized transport into top epic#2035
integry wants to merge 211 commits into
1950-epic-cross-platform-dskfrom
1953-epic-desktop-transport-api

Conversation

@integry

@integry integry commented Aug 31, 2026

Copy link
Copy Markdown
Owner

Propagate the finalized desktop transport/API epic into the top-level cross-platform desktop epic.

This synchronization PR intentionally targets 1950-epic-cross-platform-dsk, not main. It will remain the integration boundary for the completed remote pairing, credential lifecycle, ProPR Connect transport, and secret-free Connect discovery work. Final top-level acceptance remains in draft PR #1970 and must not be merged to main by this PR.

integry and others added 30 commits August 29, 2026 21:39
[Epic sync] Bring Electron runtime foundation into transport lane
…rowser pairi

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

Implementation completed successfully.
…git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-06-53/propr-ui/src/desktop/DesktopExperience.tsx:23).

Fixed the PR build blocker in [DesktopExperience.tsx](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-06-53/propr-ui/src/desktop/DesktopExperience.tsx:23).

The formatting-only change reduces the file to the 400-line ESLint limit without changing behavior.

Validated successfully:

- UI lint with zero warnings
- UI typecheck
- 23 desktop tests
- Production UI build
- `git diff --check`

No commit was created.

PR: #1977
Comment by: @github-actions[bot] (ID: 5464276486)
Model: gpt-5.6-sol
…tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-11-47/propr-ui/src/desktop/browserAdapters.test.ts:33) by making the HTTP error assertion case-insensitive.

Fixed the full-suite failure in [browserAdapters.test.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-11-47/propr-ui/src/desktop/browserAdapters.test.ts:33) by making the HTTP error assertion case-insensitive.

Validation passed:

- Targeted test: 5/5
- Full UI suite: 498/498
- UI typecheck
- `git diff --check`

Only that test file changed; no commit was created.

PR: #1977
Comment by: @github-actions[bot] (ID: 5464306177)
Model: gpt-5.6-sol
…hitecture.

Implemented F1–F3 as a coherent main-process credential architecture.

Key outcomes:

- Bearers never enter renderer JavaScript or credential IPC. Pairing, persistence, probing, revocation, REST/Socket.IO injection, and invalidation live in [credential-service.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-16-21/apps/desktop/src/credential-service.ts).
- Credentials are encrypted and bound to profile ID plus normalized origin. URL changes revoke against the old origin and never forward Authorization to the new origin.
- Invalidation is scoped by profile ID and connection generation. Only definitive token-invalid codes clear credentials; authorization changes reconnect/re-probe, while transient errors remain retryable.
- Pairing start and polling now have cancellation, bounded timeouts, expiry deadlines, safe interval clamping, strict approval-origin validation, and completion race protection.
- Added adversarial regressions for A→attacker, delayed A failures after B, hung/cancelled pairing, malformed timing/URLs, and completion racing with deletion or switching.

Verification passed:

- Client: 17 tests
- Electron desktop: 30 tests
- UI: 502 tests
- API desktop auth/socket/status: 47 tests
- Client, desktop, UI, and API typechecks
- UI lint
- API and UI production builds
- Linux Electron packaging: [propr-desktop-linux-x64](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-16-21/apps/desktop/out/propr-desktop-linux-x64)

The branch remains based on `1953-epic-desktop-transport-api`; no commit or merge was created. I could not post the requested `/review` because this environment has no writable GitHub connector. The remaining handoff is to comment `/review` on PR #1977.

PR: #1977
Comment by: @integry (ID: 5464340590)
Model: gpt-5.6-sol
…equesting review.

Implemented the requested follow-up without committing or requesting review.

Key changes:

- Enforced integer polling intervals of 1–60 seconds on start and every pending response.
- Rejected invalid, expired, or over-30-minute pairing deadlines before scheduling or approval.
- Preserved deadline-clamped sleeps and start/poll cancellation behavior.
- Stripped renderer Cookie and Authorization headers across HTTP(S)/WS(S), including inactive and mismatched origins.
- Stripped remote Set-Cookie headers while preserving marked main-process bearer requests.
- Added active, inactive, same-origin multi-profile, forged-marker, WebSocket, cancellation, and deadline regressions.

Updated [desktopPairing.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-45-47/packages/client/src/desktopPairing.ts), [client.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-45-47/packages/client/src/client.ts), and [credential-service.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-45-47/apps/desktop/src/credential-service.ts).

Validation passed:

- Client: 20 tests
- Desktop: 31 tests
- UI: 503 tests across 70 files
- API desktop-auth/Socket.IO/status: 47 tests
- Client, desktop, UI, and API typechecks
- API build
- Linux x64 production Electron package
- `git diff --check`

PR: #1977
Comment by: @integry (ID: 5464477994)
Model: gpt-5.6-sol
…or changes.

Implemented the clean dependency fix without product-behavior changes.

- Root `test:prepare` now builds `@propr/shared` then `@propr/client` before the serial suite: [package.json](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-56-57/package.json:22)
- Desktop tests now self-prepare through the existing non-recursive hook: [apps/desktop/package.json](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-56-57/apps/desktop/package.json:21)
- CI verifies clean artifacts are absent, then present after preparation: [pr-test-on-label.yml](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-56-57/.github/workflows/pr-test-on-label.yml:49)
- Added script/workflow ordering regression: [testSuiteRunner.test.mjs](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T19-56-57/test/testSuiteRunner.test.mjs:18)

Validation:

- Clean `npm ci`: passed
- Clean `npm run desktop:test`: 31/31 passed
- Clean `npm run desktop:package`: passed
- `npm run desktop:typecheck`: passed
- Docs setup/typecheck/build: passed
- Package-script regression: 7/7 passed
- Serial full-suite entry passed the formerly failing credential test immediately. The remainder could not complete because this environment lacks Docker/Redis; the run was stopped after reaching Redis-dependent tests.
- `git diff --check`: passed

No commit or review request was created.

PR: #1977
Comment by: @integry (ID: 5464563805)
Model: gpt-5.6-sol
…out changing renderer token custody, origin policy, cookies, or build ordering.

Implemented the two race fixes on exact head `6cba577` without changing renderer token custody, origin policy, cookies, or build ordering.

- Stale definitive probe responses now atomically revalidate profile generation/selection, persisted origin, and exact credential identity before deletion.
- Pairing now applies one monotonic deadline/caller-abort race across approval, sleeps, and polls, with complete cleanup and safe late callback handling.
- Added deterministic replacement, origin-change, pending-approval expiry, caller-abort, and late-settlement regressions.

Validation:

- Focused credential/pairing tests: 20/20 passed.
- Clean `npm ci`: passed, zero vulnerabilities.
- Clean build-order preparation: passed; generated shared/client `dist` directories were removed and rebuilt.
- Desktop typecheck and UI typecheck: passed.
- Desktop Linux package: passed.
- `git diff --check`: passed.
- Full suite: 321/322 entries passed. Only `test/llmMetrics.test.ts` timed out because Redis was unavailable (`ECONNREFUSED 127.0.0.1:6379`); all remaining tests, including 70 UI files/503 tests, passed.

No commit was created.

PR: #1977
Comment by: @integry (ID: 5464641318)
Model: gpt-5.6-sol
… seamlessly

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

Implementation completed successfully.
…ing:

Implemented all four blockers on `ba9795f7` without committing:

- Unified ProfileStore mutations under one serialized queue, eliminating lock inversion.
- Enforced immediate pairing deadline/cancellation rejection with post-await lifetime checks.
- Scoped authorization events and socket reconnects to the captured profile generation, with cleanup listener detachment.
- Applied atomic exact-current credential deletion across stale pairing, invalidation, revoke, origin-change, and probe cleanup paths.

Validation passed:

- Final full suite: 321 non-live files plus native UI suite; 506 UI tests.
- Client, desktop, UI focused tests and typechecks.
- Production UI build.
- Linux desktop package.
- `git diff --check`.

Packaged smoke was attempted but blocked by the unprivileged environment: Electron requires a root-owned mode-4755 `chrome-sandbox`. The smoke correctly refused to disable sandboxing.

PR: #1977
Comment by: @integry (ID: 5464765371)
Model: gpt-5.6-sol
Fixed PR #1988’s build blockers:

- Restored correct URL warning classification in [runtimeConfig.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-29T21-22-36/propr-ui/src/config/runtimeConfig.ts:100).
- Compacted the Connect verification markup in [DesktopExperience.tsx](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-29T21-22-36/propr-ui/src/desktop/DesktopExperience.tsx:96) to satisfy the 400-line lint limit.

Verified:

- Failing CI regression: 66/66 passed
- Focused UI/desktop tests: 88/88 passed
- Client tests: 17/17 passed
- UI typecheck, lint, and production build passed
- Notification regression stage passed
- Browser smoke tests: 4/4 passed
- CLI package verification passed
- `git diff --check` passed

No commit was created.

PR: #1988
Comment by: @github-actions[bot] (ID: 5464959244)
Model: gpt-5.6-sol
…covery contr

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

Implementation completed successfully.
…p/git-processor/worktrees/integry/propr/pr-1989-followup-2026-08-29T21-41-13/propr-ui/src/config/runtimeConfig.ts:121).

Fixed PR #1989’s build regression in [runtimeConfig.ts](/tmp/git-processor/worktrees/integry/propr/pr-1989-followup-2026-08-29T21-41-13/propr-ui/src/config/runtimeConfig.ts:121).

The UI now trims redundant trailing slashes before strict proxy URL validation, while continuing to reject paths, queries, fragments, ports, and userinfo.

Validation passed:

- Exact hosted-tunnel regression suite: 317/317
- UI tests: 66/66
- UI typecheck
- UI lint
- `git diff --check`

Only the requested file was modified; no commit was created.

PR: #1989
Comment by: @github-actions[bot] (ID: 5465042091)
Model: gpt-5.6-sol
…acee1a376ee827`.

Implemented F4–F7 on exact head `b21fdf134a0b56166fa2f520f9acee1a376ee827`.

Key changes:

- Main-only monotonic probe tickets and fresh 128-bit opaque transport scopes per activation.
- Scope-bound REST and Socket.IO authentication with stale/malformed cancellation, header stripping, force-new Managers, and preflight handling.
- Authenticated attachment blob URLs with abort and guaranteed revocation.
- Exact transient credential cleanup after cancellation/failure.
- Atomic local profile/credential detachment before best-effort revocation, protecting later replacements.
- Added race, rotation, header, socket, CORS, attachment, F6, and F7 regressions.

Validation passed:

- Desktop: 41 tests and typecheck.
- UI: 509 tests, typecheck, lint, and production build.
- Client: 24 tests and typecheck.
- Remote-auth/CORS/socket/status: 59 tests.
- Linux production desktop package.
- Root typecheck.
- `git diff --check`.

Environmental limitations:

- Full serial suite reached 172/322 with no failures, then blocked because `redis-server` is not installed.
- Packaged smoke could not run securely because the host lacks root-owned mode-4755 `chrome-sandbox` setup and `xvfb-run`. Sandboxing was not bypassed.

No commit was created.

PR: #1977
Comment by: @integry (ID: 5465095640)
Model: gpt-5.6-sol
Implemented F1 only.

- Noncanonical reserved Connect URLs—including explicit `:443` and percent-encoded hosts—now fail before pairing creation.
- Returns bounded `PAIRING_CONFIGURATION_INVALID` / HTTP 503 without reflecting configured input.
- Valid Connect, arbitrary HTTPS remotes, lookalikes, and loopback behavior remain unchanged.
- Added regressions confirming no pairing row is persisted.

Changed [desktopAuthService.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-29T22-14-16/packages/api/desktopAuthService.ts:152) and [desktopAuth.test.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-29T22-14-16/packages/api/test/desktopAuth.test.ts:101).

Verification passed:

- 67 Connect/client/API tests
- 24 desktop tests
- 96 runtime-config/desktop UX tests
- 10 launcher drift tests
- Affected typechecks and API lint
- CLI release-package guard
- `git diff --check`

The full 321-file suite reached 176 files before hanging because Redis is unavailable at `127.0.0.1:6379`; it was stopped after repeated connection failures. No merge, base sync, commit, or PR creation was performed.

PR: #1988
Comment by: @integry (ID: 5465187212)
Model: gpt-5.6-sol
…Image.test.tsx](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T22-27-43/propr-ui/src/components/TaskPlanner/AuthenticatedAttachmentImage.test.tsx:39).

Fixed the TypeScript regression in [AuthenticatedAttachmentImage.test.tsx](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-29T22-27-43/propr-ui/src/components/TaskPlanner/AuthenticatedAttachmentImage.test.tsx:39).

The test now captures the signal in a typed collection, explicitly fails if absent, and verifies it is aborted after scope rotation—without a signal cast or assertion.

Passed:

- `npm run desktop:prepare`
- `npm run typecheck -w propr-ui`
- Focused authenticated attachment test: 2/2 passed
- `git diff --check`

Only the requested test file changed. HEAD remains `66cd848f7e91fd09b3376aed7a371fb2a948d90b`; no merge or base sync performed.

PR: #1977
Comment by: @integry (ID: 5465242965)
Model: gpt-5.6-sol
Implemented all selected blockers F1–F7.

Key results:

- Root access now uses one synchronous, descriptor-anchored, identity-checked snapshot; replacements and unsafe ancestry fail with `INVALID_ROOT`. Windows semantics fail closed when authority cannot be proven.
- CLI/API identity creation is centralized, permission-checked, atomic, durable, concurrency-safe, and interruption-recoverable.
- Discovery v1 parsing is strict and shared between producer and consumer.
- Every rejected/timeout response body is cancelled; invalid, unreachable, and timeout exit classes are separated correctly.
- Tunnel setup again normalizes redundant trailing slashes before strict validation.
- Added packaged CLI, replacement, concurrency, interruption, body-stream, schema, and Unix/Windows-semantics regressions.
- Updated desktop-pairing documentation.
- No commit or PR operations performed.

Verification:

- Focused CLI/API/shared/tunnel/launcher/hosted-UI tests: passed.
- Packaged CLI integration tests: passed.
- Typechecks and lint: passed.
- CLI package guard (`npm run cli:pack`): passed.
- `git diff --check`: passed.
- Full suite: 322/323 runners passed; all 69 UI files and 496 UI tests passed. The sole exception was the pre-existing Redis-backed `llmMetrics.test.ts`, which timed out because Redis and a Docker daemon are unavailable in the agent image.

PR: #1989
Comment by: @integry (ID: 5465164512)
Model: gpt-5.6-sol
…c0e83b082c4c75d8ac8894cd947aeb1`.

Implemented the remaining blockers on exact head `0b7c2961ac0e83b082c4c75d8ac8894cd947aeb1`.

Key changes:

- Strict raw Connect shorthand validation; credentials, ports, encoding, Unicode, paths, whitespace, alternate casing, trailing dots, and lookalikes are rejected before flow persistence.
- Reserved `t-*.propr.dev` attempts can no longer downgrade to generic HTTPS pairing/client behavior.
- Malformed runtime configuration is bounded and redacted. The API client is constructed only after successful validation, otherwise a safe configuration screen renders.
- Desktop logs, IPC errors, DOM messages, and profile presentation avoid raw endpoints and failure details.
- Added managed-tunnel stale/restart recovery with Retry, Re-enter, Rediscover, and explicit confirmation before replacing a profile.
- Added a secret-free optional rediscovery adapter seam.
- Formal F1 API files were not modified.

Validation passed:

- Client/shared pairing: 20 tests
- API desktop-auth/status: 39 tests
- Desktop/Electron: 24 tests
- Full UI: 507 tests across 70 files
- Root, client, UI, and desktop typechecks
- Root and UI lint
- CLI package guard
- `git diff --check`

The repository-wide runner reached 175/321 files, then hung on Redis-dependent tests because neither Redis nor Docker is available. A resumed run encountered the same environment blocker at `llmMetrics.test.ts`. All affected and independently runnable suites pass.

No commit, merge, sync, or PR operation was performed.

PR: #1988
Comment by: @integry (ID: 5465256401)
Model: gpt-5.6-sol
…ithout syncing, merging, or committing.

Implemented the requested exact-head fixes on `1c42418a…` without syncing, merging, or committing.

Key changes:

- Status-only probes with bounded, one-use activation tickets and atomic main-process activation.
- Profile origin updates and credential detachment serialized before best-effort revoke.
- Failure-safe profile removal for corrupt/decrypt/unlink/state-write scenarios.
- SocketProvider now reacts to scope and API-origin changes, with proper desktop null-scope behavior and full Manager teardown.
- Realistic packaged-origin CORS preflight coverage while retaining malformed OPTIONS tests.

Verification passed:

- Desktop, UI, client, and API typechecks
- Desktop suite: 51 tests
- Client suite: 24 tests
- API auth/socket/CORS/attachment suite: 38 tests
- Full configured UI suite: 513 tests
- UI lint: no errors
- Runtime and packaging audits: zero vulnerabilities
- Clean-dependency desktop package guard and production Linux package
- API production build
- `git diff --check`

Unavailable locally:

- Secure packaged smoke: `xvfb-run` is absent.
- Root full suite: 173/322 tests passed before Redis-dependent execution; neither Redis nor Docker is installed in the container.

PR: #1977
Comment by: @integry (ID: 5465267002)
Model: gpt-5.6-sol
…g head without merging, syncing, or committing.

Implemented the remaining A–D blockers on the exact existing head without merging, syncing, or committing.

Key fixes:

- Hermetic explicit-root discovery with robust `--root` parsing and a minimal non-ProPR environment allowlist.
- Docker execution failures now produce `internalFailure`/exit 1; exit 2 is reserved for proven not-ready states.
- No-store headers apply at the earliest `/api` boundary, including limiter and error responses.
- Strict raw Connect selector validation and consistent case normalization across shared, API, UI, CLI, and launcher paths.
- Added packaged hostile-CWD/env CLI tests, Docker failure regressions, real global limiter saturation, and selector parity tests.

Validation passed:

- CLI/API/shared/UI typechecks
- CLI/API/UI lint
- Focused CLI, API, pairing, tunnel, rate-limit, and UI tests
- CLI packaging
- `git diff --check`

The configured full suite passed 322/323 runs. The sole failure was the unrelated Redis-dependent `test/llmMetrics.test.ts`, which timed out while Redis at `127.0.0.1:6379` was unavailable.

PR: #1989
Comment by: @integry (ID: 5465371272)
Model: gpt-5.6-sol
…a03e6ce26429f7d6846286` without merging, syncing, or committing.

Implemented the exact-head follow-up on `38cdf456a090b8e252a03e6ce26429f7d6846286` without merging, syncing, or committing.

Key changes:

- Enforced atomic profile/requested/credential origin equality in [credential-service.ts](/home/node/workspace/apps/desktop/src/credential-service.ts) and [profile-store.ts](/home/node/workspace/apps/desktop/src/profile-store.ts), including stale detachment and delayed activation-race coverage.
- Bound renderer activation to the main-returned `profileId`; mismatches become authentication-required and never publish a scope.
- Restored authorization reconnect and stale deferred SocketProvider regressions.
- Split [DesktopExperience.tsx](/home/node/workspace/propr-ui/src/desktop/DesktopExperience.tsx) to 289 lines and [DesktopExperience.test.tsx](/home/node/workspace/propr-ui/src/desktop/DesktopExperience.test.tsx) to 390 lines, without weakening lint.

Validation passed:

- Focused desktop: 55 tests
- Focused adapter/apiClient/SocketProvider/UI: 58 tests
- Full UI: 517 tests
- UI lint, typecheck, and production build
- Desktop typecheck and Linux production package
- `git diff --check`

The configured full suite completed 167/322 serial files without failures, then blocked indefinitely on file 168 because Redis was unavailable at `127.0.0.1:6379`; neither `redis-server` nor Docker is installed in this environment.

PR: #1977
Comment by: @integry (ID: 5465456632)
Model: gpt-5.6-sol
…g or syncing the transport base.

Implemented the exact-head Connect follow-up without merging or syncing the transport base.

- Enforced byte-for-byte canonical Connect origins across shared, client, API, Electron, hosted UI, CLI, and launcher paths. Reserved nested/lookalike hosts cannot fall through as generic remotes.
- Removed renderer discovery fallback from managed recovery. Trusted rediscovery now requires current-attempt fencing, matching opaque profile ID, strict endpoint validation, and explicit confirmation.
- Added bounded/redacted confirmation copy and deterministic recovery regressions.
- Split the affected UI modules to eliminate all six lint warnings without changing lint configuration.

Verification:

- Connect suites: passed
- UI lint, typecheck, build: passed
- Desktop typecheck and Electron package: passed
- `git diff --check`: passed
- Full suite: 320/321 runs passed; only `test/llmMetrics.test.ts` timed out waiting for Redis at `127.0.0.1:6379`, which is unavailable in this environment.

No commit was created.

PR: #1988
Comment by: @integry (ID: 5465471435)
Model: gpt-5.6-sol
Implemented only F8 and F9.

- F8: successful A→B activation now clears renderer local/session storage before publishing the new scope, including same-origin switches.
- F9: pairing uses proposed profile data without modifying the stored profile. Profile and credential commit transactionally after successful pairing; failures preserve the prior active profile, credential, and connection. Old tokens are revoked only after replacement commit.
- Added regressions for browser-launch failure, cancellation, expiry, polling failure, secure-storage failure, commit/revoke ordering, and same-origin renderer isolation.

Verification passed:

- Desktop full test suite: 61 tests
- Desktop typecheck
- UI Electron adapter tests
- UI typecheck and lint
- `git diff --check`

No commit was created.

PR: #1977
Comment by: @integry (ID: 5465624544)
Model: gpt-5.6-sol
Implemented only F2 and F3.

- Hosted API client creation is now blocked for missing or non-Connect configurations, while OAuth completion remains exempt: [runtimeConfig.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-30T00-13-37/propr-ui/src/config/runtimeConfig.ts:350).
- Approval URLs now require canonical raw query names and values, rejecting encoded names/hosts: [desktopPairing.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-30T00-13-37/packages/shared/src/desktopPairing.ts:57).
- Added API-client gating and cross-contract encoding regressions.

Verification passed:

- Shared build
- Client tests: 21 passed
- UI tests: 66 passed
- UI typecheck and targeted lint
- `git diff --check`

PR: #1988
Comment by: @integry (ID: 5465683890)
Model: gpt-5.6-sol
…dc54004bb279e1` without merging, syncing, or committing.

Implemented F8/F9 on exact head `f491eb7137cd9ff0b36b1e2c90dc54004bb279e1` without merging, syncing, or committing.

Key changes:

- [profile-store.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-30T00-17-19/apps/desktop/src/profile-store.ts) now uses immutable encrypted credential slots and one atomic versioned state pointer, with fsync ordering, legacy migration, startup recovery, orphan cleanup, and fail-closed validation.
- Added injected durability failures, concurrent replacement, legacy migration, and real SIGKILL child-process recovery tests proving complete A or complete B.
- [electronAdapters.ts](/tmp/git-processor/worktrees/integry/propr/pr-1977-followup-2026-08-30T00-17-19/propr-ui/src/desktop/electronAdapters.ts) now clears renderer storage only after exact-profile, current-attempt activation validation.
- Mismatch, throw, stale activation, failed edits/pairing, and probing clear nothing. Clear failures restore sentinels, discard the main activation, publish no B scope, and return a fixed safe error.
- Added a scoped activation-discard IPC path without removing the credential.

Passed:

- Desktop suite: 64 tests
- UI isolation suites: 62 tests
- UI and desktop typechecks
- UI lint and production build
- Linux desktop package
- `git diff --check`
- Exact-head verification

The configured full suite was attempted and passed all tests reached, but the Redis-dependent portion blocked on `ECONNREFUSED 127.0.0.1:6379`; this environment has neither Redis nor Docker available.

PR: #1977
Comment by: @integry (ID: 5465699420)
Model: gpt-5.6-sol
Implemented only F4, F5, and F6:

- Added the 2048-character guard before parsing `API_PUBLIC_URL` in [desktopAuthService.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-30T00-37-29/packages/api/desktopAuthService.ts:156).
- Detects decoded `tunnel` parameter names such as `%74unnel`, blocking stored/configured fallback in [hostedTunnelConfig.ts](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-30T00-37-29/propr-ui/src/config/hostedTunnelConfig.ts:42).
- Connect pairing errors now apply only to authentication; help-launch failures retain the bounded help-specific message in [DesktopExperience.tsx](/tmp/git-processor/worktrees/integry/propr/pr-1988-followup-2026-08-30T00-37-29/propr-ui/src/desktop/DesktopExperience.tsx:221).
- Added focused regressions for all three findings.

Verification passed:

- API pairing suite: 8 tests
- Focused UI suites: 82 tests
- Desktop experience suite: 22 tests
- API and UI typechecks
- API and UI lint
- `git diff --check`

No commit was created.

PR: #1988
Comment by: @integry (ID: 5465785343)
Model: gpt-5.6-sol
…1b65ba6bc09e7e8edbc4c9ef418b12d436980` without merging, syncing, or committing.

Implemented all seven follow-up blockers on exact HEAD `c551b65ba6bc09e7e8edbc4c9ef418b12d436980` without merging, syncing, or committing.

Key outcomes:

- Real fail-closed Windows DACL/reparse-point and macOS ACL authority checks with deterministic fixtures.
- Crash-remnant identity recovery and strictly bounded, revalidated reads.
- Abort-before-listener race closed with exact cleanup.
- Root-specific persisted tunnel overrides restored through read-only config access.
- Noncanonical managed URL spellings rejected across launcher, shared, API, CLI, and hosted UI boundaries.
- Validated Docker transport environment forwarding with redacted failures.
- Clean-checkout unit preparation now builds required workspaces first.

Validation passed:

- Clean `npm ci` and 281 fast unit tests.
- Exact full suite: all 322 non-live files plus UI workspace; 497 UI tests.
- 321 hosted-tunnel tests and focused identity/discovery regressions.
- Node 22 and 24 CLI matrices.
- Desktop audits, clean package build, typecheck, and 24 runtime tests.
- CLI package dry run, API/CLI/UI builds, typechecks, and zero-warning lint.
- Actionlint, release shellcheck, release metadata, and `git diff --check`.

The packaged GUI launch smoke was unavailable because this host lacks Xvfb/root sandbox-helper setup; desktop packaging and runtime coverage passed.

PR: #1989
Comment by: @integry (ID: 5465520611)
Model: gpt-5.6-sol
…out merging, syncing, or committing.

Implemented the remaining discovery authority blockers without merging, syncing, or committing.

Key changes:

- Docker discovery now filters by exact `propr.stack`, rejects duplicate/unknown labeled containers, and retains the 64 KiB cap.
- Docker receives only strictly validated bootstrap, home/context, SSH, and documented Docker variables.
- Windows ACL inspection now reads owner/DACL/reparse metadata from the same native handle; macOS ACL inspection uses the pinned descriptor.
- Identity and `READY` entries receive consistent native authority validation, including recovery and publication paths.
- Persisted tunnel state now uses a bounded, handle-pinned OS-home read with platform-canonical root keys and fixed fail-closed errors.
- Added real Windows/macOS authority CI coverage in [pr-build-check.yml](/tmp/git-processor/worktrees/integry/propr/pr-1989-followup-2026-08-30T00-57-36/.github/workflows/pr-build-check.yml).
- Exit semantics now match the request: ready/not-ready `0`, internal/config failure `1`, unsupported/incompatible `2`.

Validation completed successfully:

- Clean `npm ci`, release verification, fast-unit and hosted-tunnel validation
- Focused root, identity, discovery, CLI, API, and orchestrator suites
- CLI package, typecheck, and lint
- Desktop audits, package, typecheck, and 24 runtime tests
- UI full suite: 497 tests passed
- `git diff --check`

The aggregate full suite passed 322/324 file runs. One Redis-dependent test timed out because Redis is unavailable locally; the other transient repository-manager failure passed its isolated rerun (9/9). Native Windows/macOS jobs, actionlint, and packaged GUI smoke remain CI-only because this Linux runner lacks those OSes, Docker/actionlint, and `xvfb-run`.

PR: #1989
Comment by: @integry (ID: 5465866322)
Model: gpt-5.6-sol
…30d30c7b9a2ab7024f8932fa2f` without merging, syncing, or committing.

Implemented all four blockers on exact head `8897926a40fe7030d30c7b9a2ab7024f8932fa2f` without merging, syncing, or committing.

- Added credential identity epochs through [profile-store.ts](/home/node/workspace/apps/desktop/src/profile-store.ts), activation IPC, and [electronAdapters.ts](/home/node/workspace/propr-ui/src/desktop/electronAdapters.ts). Real identity replacement clears local/session storage once; reconnecting the same credential retains it.
- Added alternating write-through, self-contained encrypted journals with recovery for pointer rollback, reordered visibility, corrupt/missing slots, and every credential/state boundary.
- Persisted bounded pending revocations atomically with B. Startup and pre-mutation retries retain network/5xx failures, terminally complete 2xx/401/404, and emit only redacted diagnostics.
- Serialized cancellation/profile switching through the publish gate, with deterministic pre-publish race coverage.
- Added native Windows child termination/restart tests plus real-process revocation crash fixtures.

Validation passed:

- Configured Full Suite: all 321 non-live files plus UI workspace passed in 501.7s.
- Desktop tests/typecheck/package.
- UI tests, focused renderer/isolation/SocketProvider tests, typecheck, lint, and build.
- Client, IPC/preload, API client, hosted-tunnel, notification, CLI packaging, release verification, and fast unit suites.
- `git diff --check`.

Environment-only limitations:

- Native Windows tests are included but skipped on this Linux host.
- Playwright Chromium could not start because the container’s 512-PID cgroup was exhausted by 352 unreapable test-runner zombie processes; it failed before loading a page.
- Docker-based actionlint/shellcheck could not run because Docker is unavailable.

PR: #1977
Comment by: @integry (ID: 5465910433)
Model: gpt-5.6-sol
…f…` without merging or syncing the transport base.

Implemented the durability follow-up on exact head `0a2cbd3f…` without merging or syncing the transport base.

Key changes:

- Added prepared → flush → verify → `O_SYNC` commit-marker journal publication. Flush/verification failures now fail before durable callbacks or B publication.
- Encrypted and authenticated self-contained journals with bounded size and lossless string/`BigInt` generations.
- Recovery now authenticates journals before reading or repairing `profiles.json`.
- Added mirror corruption, alternate-slot rollback, missing-slot, injected I/O failure, revocation, cancellation, and crash matrices.
- Added required x64 `windows-latest` durability job in [desktop-release-guard.yml](/home/node/workspace/.github/workflows/desktop-release-guard.yml:26), with explicit scenario-count enforcement and zero permitted skips.

Validation passed:

- Clean `npm ci`
- Desktop tests: 87/87
- Linux native durability command: 67/67, 0 skipped
- Client tests: 24/24
- UI transport tests: 39/39
- Fast validation tests: 279/279
- Desktop/UI typechecks, UI lint/build, root lint/build
- Linux desktop package
- Release metadata and `git diff --check`

Native Windows success is not claimed: the hosted job must execute after push. Local `actionlint` and the Redis-backed configured Full Suite could not run because this environment has no Docker or Redis; both remain covered by CI.

PR: #1977
Comment by: @integry (ID: 5466169482)
Model: gpt-5.6-sol
@integry

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Top-to-transport synchronization scope before composing #2089: merge the current target branch 1950-epic-cross-platform-dsk at c726c6eb8e943887bd5f681b4ac271799e5d64af into transport head 8bcd46b9287a7b2b27e1c4c63618654a96e76a24. Preserve all transport-specific work from #2086, especially the single strict shared discovery parser, one deadline across fetch and body, pre-abort and synchronous-abort authority, late-response disposal, unauthenticated public identity before bearer/persistence/socket use, identity-bound profile/origin/generation/scope claims, mismatch detach, Connect rotation invalidation, exact 72 credential durability tests and 119 native total. Take current top/main behavior for unrelated API/core/UI, lock metadata, and CI fixes. Resolve semantically; do not drop either side, do not introduce Windows-specific corrections, and do not merge this PR into top. Run diff-check, lock validation, focused client/credential/native durability, Mac/Linux packaged gates where available, shared validation, and full suite.

@integry

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Cancelled specialized merge trigger after repeated temporary-worktree infrastructure failures; superseded by scoped ordinary ProPR task 16164.

@propr-dev

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Failed to resolve merge conflicts from 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

Worktree path does not exist: /tmp/git-processor/worktrees/integry/propr/pr-2035-merge-2026-09-03T19-31-52

System-triggered merge conflict resolution

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

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Failed to resolve merge conflicts from 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

Worktree path does not exist: /tmp/git-processor/worktrees/integry/propr/pr-2035-merge-2026-09-03T19-34-25

System-triggered merge conflict resolution

@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/361] 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.877966
      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.232365
      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.730537
      type: 'test'
      ...
    1..3
ok 1 - Windows MVP ASAR main entry
  ---
  duration_ms: 33.988383
  type: 'suite'
  ...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 314.603609

[2/361] 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.7592
  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.437648
  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.925872
  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.413713
  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.813892
  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.553936
  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.28858
  type: 'test'
  ...
# Subtest: keeps WiX processes and their emitted diagnostics bounded
ok 8 - keeps WiX processes and their emitted diagnostics bounded
  ---
  duration_ms: 0.161983
  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.40627
  type: 'test'
  ...
1..9
# tests 9
# suites 0
# pass 9
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 243.244955

[3/361] 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.690873
      type: 'test'
      ...
    # Subtest: forces a ready app with a hung descendant through an exact bounded taskkill invocation
    ok 2 - forces a ready app with a hung descendant through an exact bounded taskkill invocation
      ---
      duration_ms: 7.430885
      type: 'test'
      ...
    # Subtest: keeps timeout-before-ready primary while terminating and draining the tree
    ok 3 - keeps timeout-before-ready primary while terminating and draining the tree
      ---
      duration_ms: 16.150697
      type: 'test'
      ...
    # Subtest: classifies asynchronous spawn errors without exposing their message
    ok 4 - classifies asynchronous spawn errors without exposing their message
      ---
      duration_ms: 6.24993
      type: 'test'
      ...
    # Subtest: settles close/timeout races once and never upgrades an early exit to success
    ok 5 - settles close/timeout races once and never upgrades an early exit to success
      ---
      duration_ms: 0.945338
      type: 'test'
      ...
    # Subtest: accepts a clean post-proof close racing a taskkill no-process result
    ok 6 - accepts a clean post-proof close racing a taskkill no-process result
      ---
      duration_ms: 6.817339
      type: 'test'
      ...
    # Subtest: rejects malformed, partial, truncated, and extra-field ready records
    ok 7 - rejects malformed, partial, truncated, and extra-field ready records
      ---
      duration_ms: 12.605885
      type: 'test'
      ...
    # Subtest: terminates an exact-event record whose platform proof is invalid
    ok 8 - terminates an exact-event record whose platform proof is invalid
      ---
      duration_ms: 1.473436
      type: 'test'
      ...
    # Subtest: fails after proof when Windows tree termination cannot be proven
    ok 9 - fails after proof when Windows tree termination cannot be proven
      ---
      duration_ms: 6.613976
      type: 'test'
      ...
    # Subtest: never returns secret-bearing raw output or non-allowlisted record fields
    ok 10 - never returns secret-bearing raw output or non-allowlisted record fields
      ---
      duration_ms: 1.690541
      type: 'test'
      ...
    # Subtest: revokes success when sensitive output arrives after the exact ready proof
    ok 11 - revokes success when sensitive output arrives after the exact ready proof
      ---
      duration_ms: 1.43295
      type: 'test'
      ...
    # Subtest: rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
    ok 12 - rejects a JSON-escaped Windows path in a non-allowlisted record before readiness
      ---
      duration_ms: 1.21922
      type: 'test'
      ...
    # Subtest: revokes success for a JSON-escaped Windows path after the exact ready proof
    ok 13 - revokes success for a JSON-escaped Windows path after the exact ready proof
      ---
      duration_ms: 0.88786
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the record-count cap
    ok 14 - revokes success when a JSON-escaped Windows path follows the record-count cap
      ---
      duration_ms: 4.03164
      type: 'test'
      ...
    # Subtest: revokes success when a JSON-escaped Windows path follows the byte cap
    ok 15 - revokes success when a JSON-escaped Windows path follows the byte cap
      ---
      duration_ms: 10.761966
      type: 'test'
      ...
    1..15
ok 1 - packaged Connect bounded child lifecycle
  ---
  duration_ms: 86.252435
  type: 'suite'
  ...
# Subtest: packaged Connect fixture cleanup
    # Subtest: retries a transient Windows EBUSY only inside the authorized fixture
    ok 1 - retries a transient Windows EBUSY only inside the authorized fixture
      ---
      duration_ms: 7.684642
      type: 'test'
      ...
    # Subtest: redacts cleanup failure and preserves the primary lifecycle outcome
    ok 2 - redacts cleanup failure and preserves the primary lifecycle outcome
      ---
      duration_ms: 1.203421
      type: 'test'
      ...
    # Subtest: bounds a never-settling removal and preserves the primary result
    ok 3 - bounds a never-settling removal and preserves the primary result
      ---
      duration_ms: 10.151815
      type: 'test'
      ...
    # Subtest: bounds a never-settling authorization call as a fixed cleanup failure
    ok 4 - bounds a never-settling authorization call as a fixed cleanup failure
      ---
      duration_ms: 11.198212
      type: 'test'
      ...
    # Subtest: isolates default Windows filesystem cleanup from the harness process
    ok 5 - isolates default Windows filesystem cleanup from the harness process
      ---
      duration_ms: 43.366481
      type: 'test'
      ...
    # Subtest: refuses a link, renamed leaf, or fixture outside the canonical temporary parent
    ok 6 - refuses a link, renamed leaf, or fixture outside the canonical temporary parent
      ---
      duration_ms: 0.816146
      type: 'test'
      ...
    1..6
ok 2 - packaged Connect fixture cleanup
  ---
  duration_ms: 74.965086
  type: 'suite'
  ...
1..2
# tests 21
# suites 2
# pass 21
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 396.272566

[4/361] 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.42808
      type: 'test'
      ...
    # Subtest: returns undefined when the event is absent
    ok 2 - returns undefined when the event is absent
      ---
      duration_ms: 0.193763
      type: 'test'
      ...
    1..2
ok 1 - packaged desktop event parsing
  ---
  duration_ms: 2.581799
  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.989911
      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.252111
      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.229248
      type: 'test'
      ...
    1..3
ok 2 - packaged desktop layout assertions
  ---
  duration_ms: 1.743891
  type: 'suite'
  ...
1..2
# tests 5
# suites 2
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 246.691829

[5/361] 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.501929
      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.235291
      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.157875
      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.216445
      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.576117
      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.264865
      type: 'test'
      ...
    1..6
ok 1 - packaged smoke native window layout
  ---
  duration_ms: 4.552454
  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.455421
      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: 23.680005
      type: 'test'
      ...
    # Subtest: keeps cleanup bounded to the generated profile root
    ok 3 - keeps cleanup bounded to the generated profile root
      ---
      duration_ms: 16.845734
      type: 'test'
      ...
    # Subtest: accepts only a normalized absolute Windows SystemRoot directory
    ok 4 - accepts only a normalized absolute Windows SystemRoot directory
      ---
      duration_ms: 2.093174
      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: 3.028894
      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.787252
      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.807921
      type: 'test'
      ...
    1..7
ok 2 - packaged smoke child environment
  ---
  duration_ms: 51.325727
  type: 'suite'
  ...
1..2
# tests 13
# suites 2
# pass 13
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 321.356247

[6/361] 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: 9.274986
  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.167814
      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.506459
      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.888
      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.747803
      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: 11.481482
      type: 'test'
      ...
    # Subtest: maps extractor failures to one redacted tool code
    ok 6 - maps extractor failures to one redacted tool code
      ---
      duration_ms: 3.38464
      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.039565
      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: 140.350346
      type: 'test'
      ...
    1..8
ok 2 - administrative MSI payload inspection
  ---
  duration_ms: 183.717061
  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: 19.429306
      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: 17.353724
      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: 19.863655
      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: 16.073651
      type: 'test'
      ...
    # Subtest: reject special files with the executable name
    ok 5 - reject special files with the executable name
      ---
      duration_ms: 22.363231
      type: 'test'
      ...
    1..5
ok 3 - DEB and RPM executable layouts
  ---
  duration_ms: 95.578591
  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: 18.764703
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper bundle
    ok 2 - rejects a symbolic-link canonical helper bundle
      ---
      duration_ms: 8.581321
      type: 'test'
      ...
    # Subtest: rejects a symbolic-link canonical helper executable ancestor
    ok 3 - rejects a symbolic-link canonical helper executable ancestor
      ---
      duration_ms: 8.565468
      type: 'test'
      ...
    # Subtest: rejects every symbolic link outside canonical framework internals
    ok 4 - rejects every symbolic link outside canonical framework internals
      ---
      duration_ms: 15.75243
      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: 46.568583
      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: 13.114356
      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: 16.494773
      type: 'test'
      ...
    # Subtest: rejects alternate top-level application bundles
    ok 8 - rejects alternate top-level application bundles
      ---
      duration_ms: 8.108296
      type: 'test'
      ...
    # Subtest: rejects unsafe links inside the canonical application bundle
    ok 9 - rejects unsafe links inside the canonical application bundle
      ---
      duration_ms: 13.140094
      type: 'test'
      ...
    # Subtest: rejects non-helper nested application bundles
    ok 10 - rejects non-helper nested application bundles
      ---
      duration_ms: 15.226836
      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: 9.301875
      type: 'test'
      ...
    # Subtest: rejects special files inside the canonical application bundle
    ok 12 - rejects special files inside the canonical application bundle
      ---
      duration_ms: 18.096333
      type: 'test'
      ...
    1..12
ok 4 - DMG application layout
  ---
  duration_ms: 192.71586
  type: 'suite'
  ...
1..4
# tests 26
# suites 3
# pass 26
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 727.948779

[7/361] 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: 105.392473
      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: 301.401373
      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: 32.02989
      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.893102
      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: 10.889034
      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.297336
      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.080961
      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.061826
      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.099175
      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.234749
      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.924672
      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: 380.732454
      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: 32.087251
      type: 'test'
      ...
    # Subtest: rejects duplicate target fragments before aggregation
    ok 14 - rejects duplicate target fragments before aggregation
      ---
      duration_ms: 23.312713
      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: 85.513476
      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: 89.890554
      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: 64.45396
      type: 'test'
      ...
    # Subtest: refuses to sign a renamed extensionless distributable
    ok 18 - refuses to sign a renamed extensionless distributable
      ---
      duration_ms: 52.631743
      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: 44.994865
      type: 'test'
      ...
    # Subtest: rejects unsigned production metadata and actual signer mismatches
    ok 20 - rejects unsigned production metadata and actual signer mismatches
      ---
      duration_ms: 106.456957
      type: 'test'
      ...
    # Subtest: rejects mixed Windows signers and tampered fingerprint evidence
    ok 21 - rejects mixed Windows signers and tampered fingerprint evidence
      ---
      duration_ms: 61.965451
      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.515131
      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: 16.759042
      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.275771
      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.188211
      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.884023
      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.898545
      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.97358
      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: 43.769563
      type: 'test'
      ...
    1..29
ok 1 - desktop release artifacts
  ---
  duration_ms: 1523.942457
  type: 'suite'
  ...
1..1
# tests 29
# suites 1
# pass 25
# fail 0
# cancelled 0
# skipped 4
# todo 0
# duration_ms 1776.227897

[8/361] 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.625552
      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.973046
      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: 5.102222
      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.701247
      type: 'test'
      ...
    # Subtest: rejects ruleset mutation or deletion during preflight
    ok 5 - rejects ruleset mutation or deletion during preflight
      ---
      duration_ms: 1.416216
      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.050679
      type: 'test'
      ...
    # Subtest: requires the separately protected preflight credential environment
    ok 7 - requires the separately protected preflight credential environment
      ---
      duration_ms: 0.558123
      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: 2.466729
      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.079988
      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: 3.288865
      type: 'test'
      ...
    1..10
ok 1 - desktop release preflight
  ---
  duration_ms: 29.969492
  type: 'suite'
  ...
1..1
# tests 10
# suites 1
# pass 10
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 293.502546

[9/361] 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: 181.806612
      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: 15.813197
      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.716897
      type: 'test'
      ...
    # Subtest: rejects tag drift before publishing the verified draft
    ok 4 - rejects tag drift before publishing the verified draft
      ---
      duration_ms: 6.677567
      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: 4.166795
      type: 'test'
      ...
    1..5
ok 1 - atomic desktop release publication
  ---
  duration_ms: 220.714952
  type: 'suite'
  ...
1..1
# tests 5
# suites 1
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 470.248177

[10/361] 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: 18.514444
  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: 14.754921
  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.260717
  type: 'test'
  ...
1..3
# tests 3
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 274.63297

[11/361] 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.767034
  type: 'test'
  ...
1..1
# tests 1
# suites 0
# pass 0
# fail 0
# cancelled 0
# skipped 1
# todo 0
# duration_ms 239.283256

[12/361] 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: 4.266301
  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.073666
  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.155711
  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.305078
      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.591375
      type: 'test'
      ...
    # Subtest: emits only fixed staged-contract predicate evidence
    ok 3 - emits only fixed staged-contract predicate evidence
      ---
      duration_ms: 0.742006
      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.267267
      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.736725
      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.026478
      type: 'test'
      ...
    # Subtest: keeps PE type and architecture failures distinct
    ok 7 - keeps PE type and architecture failures distinct
      ---
      duration_ms: 0.752997
      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.514151
      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.391451
      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.859296
      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.445512
      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.244427
      type: 'test'
      ...
    1..12
ok 4 - packaged Windows Connect staging contract
  ---
  duration_ms: 11.933567
  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: 33.032181
  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.18145
  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.094226
  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.073707
  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.071263
  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.171511
  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.180337
  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.067606
  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.068067
  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.063839
  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.054212
  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.04806
  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.044553
  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.043321
  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.043892
  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.097723
  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.110647
  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: 14.496523
  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.231542
  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.087694
  type: 'test'
  ...
1..24
# tests 35
# suites 1
# pass 17
# fail 0
# cancelled 0
# skipped 18
# todo 0
# duration_ms 332.330968

[13/361] 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: 4.658023
      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: 1.908486
      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.859777
      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.778524
      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: 1.020226
      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: 1.324876
      type: 'test'
      ...
    1..6
ok 1 - desktop fixed-root Connect discovery
  ---
  duration_ms: 13.311872
  type: 'suite'
  ...
1..1
# tests 6
# suites 1
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 384.975729

[14/361] apps/desktop/src/credential-service.pairing-browser.test.ts
TAP version 13
# Subtest: DesktopCredentialService pairing browser sink
    # Subtest: binds the API base, pairing id, and response URL through the final shell validator
    ok 1 - binds the API base, pairing id, and response URL through the final shell validator
      ---
      duration_ms: 81.528633
      type: 'test'
      ...
    # Subtest: rejects a URL replaced after the credential service receives the API response
    ok 2 - rejects a URL replaced after the credential service receives the API response
      ---
      duration_ms: 19.094254
      type: 'test'
      ...
    1..2
ok 1 - DesktopCredentialService pairing browser sink
  ---
  duration_ms: 101.697977
  type: 'suite'
  ...
1..1
# tests 2
# suites 1
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 559.200473

[15/361] 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: 107.660668
      type: 'test'
      ...
    # Subtest: durably rejects malformed relaunch discovery without sending the stored bearer
    ok 2 - durably rejects malformed relaunch discovery without sending the stored bearer
      ---
      duration_ms: 47.982932
      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: 54.759415
      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: 260.112204
      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.620671
      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: 71.293197
      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: 134.745965
      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: 49.428755
      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.960231
      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.199293
      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: 88.360717
      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: 74.065562
      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: 274.99841
      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: 81.419838
      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.473435
      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: 64.696972
      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.214818
      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: 95.782524
      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.588198
      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: 55.659438
      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: 75.701963
      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: 55.462352
      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: 62.374083
      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: 56.674881
      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: 78.607704
      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: 37.225793
      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: 191.799137
      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: 480.134182
      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: 438.830998
      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.515548
      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: 70.244706
      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: 35.949552
      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: 41.69829
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 401
    ok 34 - retains encrypted retry material for empty 401
      ---
      duration_ms: 40.226861
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for empty 404
    ok 35 - retains encrypted retry material for empty 404
      ---
      duration_ms: 31.221056
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for HTML route 404
    ok 36 - retains encrypted retry material for HTML route 404
      ---
      duration_ms: 31.995612
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for malformed JSON
    ok 37 - retains encrypted retry material for malformed JSON
      ---
      duration_ms: 37.397094
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong content type
    ok 38 - retains encrypted retry material for wrong content type
      ---
      duration_ms: 32.513382
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong schema version
    ok 39 - retains encrypted retry material for wrong schema version
      ---
      duration_ms: 31.553082
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong credential generation
    ok 40 - retains encrypted retry material for wrong credential generation
      ---
      duration_ms: 35.850575
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for unknown terminal code
    ok 41 - retains encrypted retry material for unknown terminal code
      ---
      duration_ms: 38.788533
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for status/code mismatch
    ok 42 - retains encrypted retry material for status/code mismatch
      ---
      duration_ms: 30.067889
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirect
    ok 43 - retains encrypted retry material for redirect
      ---
      duration_ms: 35.607121
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for redirected 204
    ok 44 - retains encrypted retry material for redirected 204
      ---
      duration_ms: 34.44594
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for wrong endpoint 204
    ok 45 - retains encrypted retry material for wrong endpoint 204
      ---
      duration_ms: 36.665156
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for server failure
    ok 46 - retains encrypted retry material for server failure
      ---
      duration_ms: 30.489899
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for oversized JSON
    ok 47 - retains encrypted retry material for oversized JSON
      ---
      duration_ms: 30.438854
      type: 'test'
      ...
    # Subtest: accepts encrypted retry material for chunked 2048-byte terminal JSON
    ok 48 - accepts encrypted retry material for chunked 2048-byte terminal JSON
      ---
      duration_ms: 38.756203
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for chunked 2049-byte terminal JSON
    ok 49 - retains encrypted retry material for chunked 2049-byte terminal JSON
      ---
      duration_ms: 35.826543
      type: 'test'
      ...
    # Subtest: accepts encrypted retry material for terminal JSON without Content-Length
    ok 50 - accepts encrypted retry material for terminal JSON without Content-Length
      ---
      duration_ms: 31.783062
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for deceptive short Content-Length
    ok 51 - retains encrypted retry material for deceptive short Content-Length
      ---
      duration_ms: 32.516734
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for extra chunk after declared Content-Length
    ok 52 - retains encrypted retry material for extra chunk after declared Content-Length
      ---
      duration_ms: 37.564707
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for malformed UTF-8
    ok 53 - retains encrypted retry material for malformed UTF-8
      ---
      duration_ms: 26.922393
      type: 'test'
      ...
    # Subtest: retains encrypted retry material for premature body error
    ok 54 - retains encrypted retry material for premature body error
      ---
      duration_ms: 29.969086
      type: 'test'
      ...
    # Subtest: bounds a one-byte slowloris body and retains its encrypted retry material
    ok 55 - bounds a one-byte slowloris body and retains its encrypted retry material
      ---
      duration_ms: 55.937165
      type: 'test'
      ...
    # Subtest: dispose aborts a stalled header fetch, deduplicates its generation, and leaves no later activity
    ok 56 - dispose aborts a stalled header fetch, deduplicates its generation, and leaves no later activity
      ---
      duration_ms: 57.06916
      type: 'test'
      ...
    # Subtest: dispose cancels a headers-then-stall body and retains exact encrypted material
    ok 57 - dispose cancels a headers-then-stall body and retains exact encrypted material
      ---
      duration_ms: 62.962975
      type: 'test'
      ...
# NATIVE_SCENARIO dispose
    # Subtest: dispose waits for terminal journal cleanup and no file operation runs afterward
    ok 58 - dispose waits for terminal journal cleanup and no file operation runs afterward
      ---
      duration_ms: 56.820155
      type: 'test'
      ...
    # Subtest: bounds aggregate startup across stalled records and recovers all encrypted records later
    ok 59 - bounds aggregate startup across stalled records and recovers all encrypted records later
      ---
      duration_ms: 336.599727
      type: 'test'
      ...
# NATIVE_SCENARIO transient-revocation
# NATIVE_SCENARIO provisional
    # Subtest: retries a crash-left provisional pairing credential on startup
    ok 60 - retries a crash-left provisional pairing credential on

...(truncated)

View Workflow

@propr-dev

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Failed to resolve merge conflicts from 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

Agent failed to resolve all merge conflicts. 18 conflict marker(s) still present in files.

System-triggered merge conflict resolution

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

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Retry the previously scoped top-to-transport synchronization after the temporary worktree infrastructure failure; no code result was pushed. Merge current top c726c6eb8e943887bd5f681b4ac271799e5d64af into transport 8bcd46b9287a7b2b27e1c4c63618654a96e76a24. Preserve the full #2086 identity/deadline/rotation security contract and exact 72/119 native durability. For conflicts, explicitly take lock metadata electron-to-chromium 1.5.420 while retaining all desktop workspace/native entries; union package scripts so pretest:unit remains and test:unit includes deployPrPreview; union status routes/tests so strict public desktop identity/discovery and synthetic-agent health both remain; retain the transport deterministic SQLite fixture clock/strftime webPush tests plus main’s intended assertions, avoiding wall-clock flakiness. Preserve unrelated current top/main behavior. No Windows correction, no child PR merge, and do not merge #2035 into top.

@integry

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Cancelled specialized merge retry after repeated temporary-worktree infrastructure failures; superseded by scoped ordinary ProPR task 16164.

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

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Failed to resolve merge conflicts from 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

Worktree path does not exist: /tmp/git-processor/worktrees/integry/propr/pr-2035-merge-2026-09-03T19-38-13

System-triggered merge conflict resolution

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

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Normal ProPR implementation follow-up (do not invoke the specialized merge-conflict worker): on exact transport head 8bcd46b9287a7b2b27e1c4c63618654a96e76a24, fetch target/top head c726c6eb8e943887bd5f681b4ac271799e5d64af, perform a real non-fast-forward merge of that target into the transport head, resolve semantically, commit, and push only to the existing #2035 head branch. This brings current main into transport through the canonical hierarchy; do not merge #2035 into its target.

Preserve every #2086 transport invariant: one strict shared parser, credential-free discovery before bearer/persistence/socket, exact profile+origin+identity+generation+scope fencing, mismatch detach, per-profile rotation, one authoritative header/body deadline, pre-abort and late-body disposal, and exact native counts 72 credential / 119 total.

Resolve the six actual conflict hunks as follows:

  1. package-lock.json: take the top/main electron-to-chromium@1.5.420 resolution and preserve qs@6.16.0, fast-uri@3.1.6, browserslist@4.28.8; regenerate from the merged manifest if necessary.
  2. package.json: retain transport pretest:unit shared+local-setup build and add main/top test/deployPrPreview.test.mjs to test:unit.
  3. packages/api/test/statusRoutes.test.ts: union transport desktop discovery/parser/public identity coverage with top/main SyntheticAgentConfig/degraded-pool coverage and imports.
  4. packages/api/test/webPushDispatcher.test.ts: keep transport deterministic fixed SQLite/dispatcher clock throughout; union main pagination and lease-expiry intent, retain fixed-width VAPID key; remove duplicate declarations/options and never restore Date.now timing.
    5–6. Preserve both sides of remaining import/export/shared-index conflict hunks without duplicate symbols.

Semantically audit all other auto-merges, especially .env.example, desktop release guard, statusRoutes/server, CLI/shared indexes, docs, and lock metadata. No Windows-specific correction. Run git diff --check, lock/install validation, focused status/webPush/client/credential/native durability tests, desktop/client/API/shared typechecks, and full suite. Report the merge parents, every conflict resolution, and tests.

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

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🔀 Auto-resolving merge conflicts — merging 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

This is a system-triggered action to keep the PR branch up to date.

@propr-dev

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Failed to resolve merge conflicts from 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

Cannot create worktree: branch '1953-epic-desktop-transport-api' is locked by another worktree

System-triggered merge conflict resolution

@propr-dev

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Failed to resolve merge conflicts from 1950-epic-cross-platform-dsk into 1953-epic-desktop-transport-api

Worktree path does not exist: /tmp/git-processor/worktrees/integry/propr/pr-2035-merge-2026-09-03T19-45-58

System-triggered merge conflict resolution

Automatically resolved merge conflicts after merging target branch into PR branch.
Resolved conflicts in:
- package-lock.json
- package.json
- packages/api/test/statusRoutes.test.ts
- packages/api/test/webPushDispatcher.test.ts
- packages/cli/src/commands/taskInspectCommands.test.ts

PR: #1976
Model: gpt-5.6-sol
@integry integry added the AI label Sep 3, 2026
@integry

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Ordinary ProPR implementation follow-up only; do NOT post or invoke /merge and do NOT use the specialized merge-conflict worker. On exact current transport head f7d0bf42e9e62e27f29ead196c0b49e331b857c5, fetch current target/top c726c6eb8e943887bd5f681b4ac271799e5d64af, create a real non-fast-forward Git merge of c726 into f7 in this normal follow-up worktree, resolve every conflict semantically, commit, and push only to the existing #2035 head branch. The prior direct main merge is valid but omitted top-only desktop/runtime/release changes.

Preserve all #2086 transport invariants: one strict shared parser; credential-free identity before bearer/persistence/socket; exact profile+origin+identity+generation+scope fencing; mismatch detach; per-profile Connect rotation; one authoritative fetch/body deadline; pre-abort/synchronous abort/late-response disposal; counts 72 credential/119 native. Preserve transport release/native behavior: Linux gnome-keyring setup and native durability, target artifacts, Forge ASAR native unpack/copy and desktop workspace dependencies. Preserve top runtime/UX behavior: CORS/permission hardening, renderer/dashboard/UI and top-only release corrections. Union status routes/tests (public strict desktop identity + synthetic agents), package/workspace scripts/deps/docs, CORS/socket tests, shared exports, and UI API/runtime/socket changes. For Windows-conflicted regions, preserve both existing behaviors without diagnosing or adding new Windows work. Keep the already resolved 1.5.420 lock and deterministic fixed SQLite webPush fixture plus main assertions. No lock regeneration beyond semantic merge; no unrelated change; do not merge #2035 into top. Verify marker scan, diff-check, lock consistency, focused client/credential/native durability 72/119, API status/CORS/socket tests, typechecks, shared validation and full suite as available.

@propr-dev

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Applied the requested follow-up changes in commit b494635

Summary of Changes

The exact native gate is confirmed in-repo: 72 credential-service cases + 37 profile-store + 10 pairing-shutdown = 119. I’m building the shared/client/local-setup/CLI prerequisites once, then will run the focused client suite, the exact 119-case native durability gate, and API status/CORS/socket tests concurrently.


🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @integry
  • Time: 13m 36s

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: 5531301079✓

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

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Continue the existing task now from the successful clean staged merge. Do not wait on unavailable jq; use node for JSON checks. Verify the merge parents/invariants and relevant available tests, then commit and push the merge to the existing #2035 head. If the shared-object store blocks commit, use the already-created node-owned object/index directories or GitHub Git Data API. Do not start another task, do not invoke /merge, and do not add unrelated changes.

…ervice cases + 37 profile-store + 10 pairing-shutdown = 119. I’m building the shared/client/local-setup/CLI prerequisites once, then will run the focused client suite, the exact 119-case native durability gate, and API status/CORS/socket tests concurrently.

The exact native gate is confirmed in-repo: 72 credential-service cases + 37 profile-store + 10 pairing-shutdown = 119. I’m building the shared/client/local-setup/CLI prerequisites once, then will run the focused client suite, the exact 119-case native durability gate, and API status/CORS/socket tests concurrently.

PR: #2035
Comment by: @integry (ID: 5531301079)
Model: gpt-5.6-sol
@integry integry added the AI label Sep 3, 2026
@integry

integry commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Scoped Mac/Linux/shared correction only on exact transport head b494635c865883b65ce172afcd9437b8b34be02a: scripts/verify-platform-safe-connect.mjs runs 86 tests after the status-route public-identity + synthetic-agent test union; CI proves tests=86 pass=86 fail=0 skipped=0, but the wrapper still requires 85/85 and exits 1. Update every exact expected/report occurrence 85→86, retain the strict equality/fail-closed assertion and 90000ms budget, and add or adjust only the smallest focused self-check if one exists. Run the script to prove exact 86/86 and diff-check. No production, lockfile, workflow, release, UI, credential, transport, or Windows changes; do not merge the PR.

@propr-dev

propr-dev Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Applied the requested follow-up changes in commit 6beeda9

Summary of Changes

Updated verify-platform-safe-connect.mjs:

  • Changed all expected/report counts from 85 to 86.
  • Preserved strict fail-closed equality checks.
  • Preserved the 90,000ms timeout.
  • No focused self-check existed to adjust.
  • Script passes: tests=86 pass=86 fail=0 skipped=0.
  • git diff --check passes; only the requested script changed.
  • No commit, merge, or preview artifacts created.

🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @integry
  • Time: 1m 47s
  • Tokens: 145,312 (143,981 in / 1,331 out)
  • Cost: $0.26

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: 5531518247✓

@integry integry removed the AI label Sep 3, 2026
…or/worktrees/integry/propr/pr-2035-followup-2026-09-03T20-11-59/scripts/verify-platform-safe-connect.mjs):

Updated [verify-platform-safe-connect.mjs](/tmp/git-processor/worktrees/integry/propr/pr-2035-followup-2026-09-03T20-11-59/scripts/verify-platform-safe-connect.mjs):

- Changed all expected/report counts from 85 to 86.
- Preserved strict fail-closed equality checks.
- Preserved the 90,000ms timeout.
- No focused self-check existed to adjust.
- Script passes: `tests=86 pass=86 fail=0 skipped=0`.
- `git diff --check` passes; only the requested script changed.
- No commit, merge, or preview artifacts created.

PR: #2035
Comment by: @integry (ID: 5531518247)
Model: gpt-5.6-sol
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