Skip to content

[2123 by GPT-5.6 Sol] Integrate packaged visual acceptance and Linux menu with current desktop transport - #2127

Open
propr-dev[bot] wants to merge 5 commits into
1950-epic-cross-platform-dskfrom
2123/gpt-5.6-sol-integrate-packaged-visual-20260904-2105-x0m
Open

[2123 by GPT-5.6 Sol] Integrate packaged visual acceptance and Linux menu with current desktop transport#2127
propr-dev[bot] wants to merge 5 commits into
1950-epic-cross-platform-dskfrom
2123/gpt-5.6-sol-integrate-packaged-visual-20260904-2105-x0m

Conversation

@propr-dev

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

Copy link
Copy Markdown
Contributor

AI Implementation Summary

Closes #2123

Branch: 2123/gpt-5.6-sol-integrate-packaged-visual-20260904-2105-x0m
Commits: ✅ Changes committed (24b2852)


AI Processing Completed

Execution Details:

Summary:
Implemented issue #2123.

  • Integrated the packaged Linux x64 acceptance harness: 12 journeys × 5 variants, axe, keyboard/focus checks, traces, OCR scanning, manifests, and secret-safe evidence.
  • Adapted current-user, socket lifecycle, zoom, setup fixtures, and authorization to the current desktop transport while preserving exact-loopback CSP and credential custody.
  • Removed Electron’s stock menu from packaged Linux builds.
  • Added unsigned/signed Linux acceptance CI jobs and required dependencies without disturbing native lifecycle jobs.
  • Documented the acceptance workflow.

Validation passed:

  • Desktop/UI typechecks
  • 563 desktop tests
  • 642 UI tests
  • Real-Chromium axe boundary
  • Linux x64 packaging and executable/fuse inspection
  • Dependency audits
  • Repository suite through 254/397 files; blocked afterward by unavailable Redis

The packaged visual run was attempted but could not start without Xvfb, gnome-keyring, and Tesseract, so rendered artifacts could not be visually inspected locally. CI now provides that required environment.

Detailed Logs:

  • Conversation: 31 messages
  • Session: null

Log files stored at:

  • conversation: /tmp/claude-logs/issue-2123-2026-09-04T21-46-17-671Z-conversation.json
  • output: /tmp/claude-logs/issue-2123-2026-09-04T21-46-17-671Z-output.txt
Latest Conversation Messages

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


💡 Need changes?

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


Visual preview

Suggested agent tools

  • Xvfb, gnome-keyring, and Tesseract: Required to launch the real packaged Linux Electron app in its isolated D-Bus/keyring session and produce verified screenshot/OCR evidence.

Closes #2044
Closes #2088
Closes #2081

…nd Linux men

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

Implementation completed successfully.
@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

/merge

Merge the current target desktop epic into this visual/menu integration and resolve only the integration conflicts. Preserve #2076 canonical macos-linux-v1 release profile (four targets, ten artifacts, two Darwin feeds; optional/nonblocking Windows validation), #2124 unconditional rollback CSP reconciliation, current dependency policy and exact transport boundary. Compose desktop-release-guard workflow and README with the new visual acceptance rather than replacing either side wholesale. Do not reintroduce mandatory Windows publication or discard native lifecycle steps. Native PR #2125 and real Linux setup task #2126 are independent; do not implement their work. Run the relevant workflow/typecheck tests and leave the PR open for one Ultrafix pass and independent audit. Retain Closes #2123 and add Closes #2044, Closes #2088 and Closes #2081 because this integration carries those original visual/menu/exact-origin follow-ups. Do not merge main.

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🔀 Resolved merge conflicts from 1950-epic-cross-platform-dsk into 2123/gpt-5.6-sol-integrate-packaged-visual-20260904-2105-x0m in commit 8297b44

Conflicting Files

  • .github/workflows/desktop-release-guard.yml

Resolution Summary

Resolved the conflict in desktop-release-guard.yml.

  • Conflict: The PR added signed Linux visual/accessibility evidence plus a Windows production smoke step, while the incoming branch removed Windows from the production release matrix.
  • Resolution: Preserved the Linux acceptance capture/upload steps and removed the obsolete Windows production smoke step.
  • Rationale: This retains the PR’s packaged-visual intent while remaining compatible with the incoming macOS/Linux-only production profile.

Validation:

  • No conflict markers remain in tracked files.
  • YAML parsing succeeded with js-yaml.
  • git diff --check passed.
  • Focused release-workflow tests passed: 24/24.

No commit was created. Git could not mark the file resolved because the linked worktree index is root-owned; git add failed with index.lock: Permission denied. The working-tree content is fully resolved, but Git still reports the file as UU until the system stages it with appropriate permissions.


🤖 Resolution Details

  • Model: gpt-5.6-sol
  • Time: 2m 55s

View Task Execution


System-triggered merge conflict resolution

…gpt-5.6-sol-integrate-packaged-visual-20260904-2105-x0m

Automatically resolved merge conflicts after merging target branch into PR branch.
Resolved conflicts in:
- .github/workflows/desktop-release-guard.yml

PR: #2127
Model: gpt-5.6-sol
@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

/ultrafix goal=8 max=1

@propr-dev propr-dev Bot added the ultrafix label Sep 4, 2026
@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🔄 Ultrafix loop started (goal: 8/10, max cycles: 1)

First action: /review

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

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

/review

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

AI Code Review Complete requested by @integry

Posted 1 review:

View Task Details

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Concrete regression on synced head8297b447: both packaged Linux Connect jobs now fail, while all four passed on the base desktop epic. Run33922887220, x64 job101184917283 and ARM64 job101184917245. Executable/fuse inspection passes; app and renderer become ready, strict Connect discovery passes, ACTIVATE reports READY, then JOURNEY_PAIR_ACTIVATION_PUBLISHED times out with phase pair / RENDERER_STAGE_TIMEOUT. Please diagnose and fix the introduced current-user/renderer/socket lifecycle integration using the actual failing logs. Preserve production connection semantics, exact CSP/credential ownership, and meaningful readiness assertions; do not simply remove a stage or inflate the timeout. Check ordinary packaged Connect and the real visual harness on current Mac/Linux CI. Native lifecycle #2125 and real setup #2126 remain separate. Leave open for validation; account for any concrete findings from the in-progress review.

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

Checks Failed

Validation failed during setup, tests, CLI packaging, linting, or build checks.

View Logs
Build check diagnostics for run 33922887183, attempt 1
Checkout outcome: success

--- GitHub Actions workflow lint ---
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667: Pulling from rhysd/actionlint
589002ba0eae: Pulling fs layer
c09af8888d6a: Pulling fs layer
4ccd7d76ca98: Pulling fs layer
b6b4b7b0e257: Pulling fs layer
b6b4b7b0e257: Waiting
c09af8888d6a: Verifying Checksum
c09af8888d6a: Download complete
4ccd7d76ca98: Verifying Checksum
4ccd7d76ca98: Download complete
589002ba0eae: Verifying Checksum
589002ba0eae: Download complete
589002ba0eae: Pull complete
b6b4b7b0e257: Verifying Checksum
b6b4b7b0e257: Download complete
c09af8888d6a: Pull complete
4ccd7d76ca98: Pull complete
b6b4b7b0e257: Pull complete
Digest: sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
Status: Downloaded newer image for rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667

--- Release shell script lint ---

--- Toolchain ---
v22.23.2
10.9.8

--- Dependency installation ---
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm warn deprecated gar@1.0.4: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

added 1125 packages, and audited 1134 packages in 20s

323 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- Fast unit tests ---
Running fast unit tests (no Redis/Docker dependencies)...

> propr@0.8.15 pretest:unit
> npm run build -w @propr/shared && npm run build -w @propr/local-setup


> @propr/shared@0.8.15 build
> tsc


> @propr/local-setup@0.8.15 build
> tsc


> propr@0.8.15 test:unit
> NODE_ENV=test npx tsx --experimental-test-module-mocks --test test/minimal.test.ts test/modelName.test.ts test/agentContainerResources.test.ts test/agentDockerfileSupplyChain.test.ts test/agentImagePreparation.test.ts test/daemonEventIntake.test.ts test/databaseMigrationGate.test.ts test/deployPrPreview.test.mjs test/generateContext.test.ts test/githubEventIntakeMode.test.ts test/intakeModePrerequisites.test.ts test/orchestratorMigrationPhase.test.mjs test/validateRoutingUrl.test.ts test/routingWebSocketProtocol.test.ts test/routingWebSocketIntakeService.test.ts test/routingStatusPublisher.test.ts test/releaseValidation.test.mjs test/sessionSecret.test.ts test/testSuiteRunner.test.mjs packages/api/test/connectAuth.test.ts packages/api/test/attachmentUploadCleanup.test.ts packages/api/test/configReloadSubscription.test.ts packages/api/test/desktopApiBoundary.test.ts packages/api/test/dockerCommandSafety.test.ts packages/api/test/listenAddress.test.ts packages/api/test/oauthState.test.ts packages/api/test/requestRateLimits.test.ts packages/api/test/statusRoutes.test.ts packages/api/test/agentRuntimeRoutes.test.ts packages/api/test/instanceAuthorization.test.ts packages/api/test/routeAuthorization.test.ts

TAP version 13
# Subtest: agent runtime package routes
    # Subtest: queues one validated package profile for the unified agent image
    ok 1 - queues one validated package profile for the unified agent image
      ---
      duration_ms: 5.440211
      type: 'test'
      ...
    # Subtest: persists a failed state when queue submission fails
    ok 2 - persists a failed state when queue submission fails
      ---
      duration_ms: 1.297358
      type: 'test'
      ...
    # Subtest: rejects a package missing from an effective runtime before queueing
    ok 3 - rejects a package missing from an effective runtime before queueing
      ---
      duration_ms: 0.98587
      type: 'test'
      ...
    # Subtest: times out slow runtime package validation before queueing
    ok 4 - times out slow runtime package validation before queueing
      ---
      duration_ms: 16.10852
      type: 'test'
      ...
    # Subtest: returns package suggestions from configured runtimes
    ok 5 - returns package suggestions from configured runtimes
      ---
      duration_ms: 0.736954
      type: 'test'
      ...
    # Subtest: enforces PROPR_ADMIN_USERS when configured
    ok 6 - enforces PROPR_ADMIN_USERS when configured
      ---
      duration_ms: 0.40801
      type: 'test'
      ...
    # Subtest: denies runtime package changes by default when no admin policy is configured
    ok 7 - denies runtime package changes by default when no admin policy is configured
      ---
      duration_ms: 0.361322
      type: 'test'
      ...
    # Subtest: requires runtime-management permission before returning runtime package state
    ok 8 - requires runtime-management permission before returning runtime package state
      ---
      duration_ms: 1.491814
      type: 'test'
      ...
    # Subtest: warms the package catalog when an admin loads runtime package state
    ok 9 - warms the package catalog when an admin loads runtime package state
      ---
      duration_ms: 0.680681
      type: 'test'
      ...
    # Subtest: does not warm the package catalog when a member is rejected
    ok 10 - does not warm the package catalog when a member is rejected
      ---
      duration_ms: 4.539406
      type: 'test'
      ...
    # Subtest: resolves the runtime build queue lazily when queueing
    ok 11 - resolves the runtime build queue lazily when queueing
      ---
      duration_ms: 0.86364
      type: 'test'
      ...
    # Subtest: reports apply load failures through the route response
    ok 12 - reports apply load failures through the route response
      ---
      duration_ms: 0.458854
      type: 'test'
      ...
    # Subtest: verifies the current effective images through the runtime-management boundary
    ok 13 - verifies the current effective images through the runtime-management boundary
      ---
      duration_ms: 0.624038
      type: 'test'
      ...
    # Subtest: rejects runtime verification without runtime-management permission
    ok 14 - rejects runtime verification without runtime-management permission
      ---
      duration_ms: 0.5298
      type: 'test'
      ...
    1..14
ok 1 - agent runtime package routes
  ---
  duration_ms: 39.867381
  type: 'suite'
  ...
# [2026-09-04 21:50:47.800 +0000] �[32mINFO�[39m: �[36mCreated data directory for SQLite database�[39m
#     directory: "/home/runner/work/propr/propr/data"
# [2026-09-04 21:50:48.436 +0000] �[32mINFO�[39m: �[36mSQLite database connection established successfully�[39m
#     filename: "/home/runner/work/propr/propr/data/propr.test.sqlite"
#     environment: "test"
# [2026-09-04 21:50:48.471 +0000] �[32mINFO�[39m: �[36mSQLite database connection closed�[39m
# Subtest: upload handler removes Multer files rejected before attachment processing
ok 2 - upload handler removes Multer files rejected before attachment processing
  ---
  duration_ms: 7.634177
  type: 'test'
  ...
# Subtest: attachment processing removes temporary and final files when persistence fails
ok 3 - attachment processing removes temporary and final files when persistence fails
  ---
  duration_ms: 5.027264
  type: 'test'
  ...
# Subtest: temporary cleanup refuses paths outside its configured root
ok 4 - temporary cleanup refuses paths outside its configured root
  ---
  duration_ms: 0.694
  type: 'test'
  ...
# Subtest: temporary cleanup rejects dot-segment paths that resolve above its root
ok 5 - temporary cleanup rejects dot-segment paths that resolve above its root
  ---
  duration_ms: 0.531441
  type: 'test'
  ...
# Subtest: attachment processing rejects path-like draft IDs and still cleans its temp file
ok 6 - attachment processing rejects path-like draft IDs and still cleans its temp file
  ---
  duration_ms: 2.288836
  type: 'test'
  ...
# [2026-09-04 21:50:48.573 +0000] �[32mINFO�[39m: �[36mSQLite database connection established successfully�[39m
#     filename: "/home/runner/work/propr/propr/data/propr.test.sqlite"
#     environment: "test"
# [2026-09-04 21:50:48.588 +0000] �[32mINFO�[39m: �[36mSQLite database connection closed�[39m
# Subtest: API config subscription serializes the startup reload with settings updates
ok 7 - API config subscription serializes the startup reload with settings updates
  ---
  duration_ms: 4.771667
  type: 'test'
  ...
# Subtest: API config subscription reloads repository updates
ok 8 - API config subscription reloads repository updates
  ---
  duration_ms: 0.392047
  type: 'test'
  ...
# Subtest: API config subscription ignores unrelated and malformed events
ok 9 - API config subscription ignores unrelated and malformed events
  ---
  duration_ms: 0.283707
  type: 'test'
  ...
# Subtest: a failed API settings reload does not block the next notification
ok 10 - a failed API settings reload does not block the next notification
  ---
  duration_ms: 0.352128
  type: 'test'
  ...
# Subtest: relay tunnel mode uses Connect without local OAuth credentials
ok 11 - relay tunnel mode uses Connect without local OAuth credentials
  ---
  duration_ms: 4.922319
  type: 'test'
  ...
# Subtest: relay tunnel mode preserves Connect for operator-supplied service endpoints
ok 12 - relay tunnel mode preserves Connect for operator-supplied service endpoints
  ---
  duration_ms: 0.364066
  type: 'test'
  ...
# Subtest: local relay mode uses Connect without a per-instance OAuth App
ok 13 - local relay mode uses Connect without a per-instance OAuth App
  ---
  duration_ms: 0.558812
  type: 'test'
  ...
# Subtest: off-tunnel relay inference uses the shared canonical loopback rule
ok 14 - off-tunnel relay inference uses the shared canonical loopback rule
  ---
  duration_ms: 1.493727
  type: 'test'
  ...
# Subtest: off-tunnel custom relay enrollment does not infer hosted Connect auth
ok 15 - off-tunnel custom relay enrollment does not infer hosted Connect auth
  ---
  duration_ms: 0.246773
  type: 'test'
  ...
# Subtest: literal example OAuth placeholders do not enable GitHub web auth
ok 16 - literal example OAuth placeholders do not enable GitHub web auth
  ---
  duration_ms: 0.214745
  type: 'test'
  ...
# Subtest: explicit custom GitHub web auth remains supported
ok 17 - explicit custom GitHub web auth remains supported
  ---
  duration_ms: 0.205933
  type: 'test'
  ...
# Subtest: explicit custom GitHub web auth wins over relay inference off-tunnel
ok 18 - explicit custom GitHub web auth wins over relay inference off-tunnel
  ---
  duration_ms: 0.303807
  type: 'test'
  ...
# Subtest: Connect authorization URL carries the exact callback and CSRF state
ok 19 - Connect authorization URL carries the exact callback and CSRF state
  ---
  duration_ms: 0.716554
  type: 'test'
  ...
# Subtest: Connect authorization URL rejects configured query strings and fragments
ok 20 - Connect authorization URL rejects configured query strings and fragments
  ---
  duration_ms: 0.962616
  type: 'test'
  ...
# Subtest: redeems a Connect code server-to-server without exposing the relay token in the body
ok 21 - redeems a Connect code server-to-server without exposing the relay token in the body
  ---
  duration_ms: 46.377646
  type: 'test'
  ...
# Subtest: binds the Connect identity username to the validated token owner
ok 22 - binds the Connect identity username to the validated token owner
  ---
  duration_ms: 1.25844
  type: 'test'
  ...
# Subtest: preserves expiring OAuth grant fields returned by Connect
ok 23 - preserves expiring OAuth grant fields returned by Connect
  ---
  duration_ms: 1.181778
  type: 'test'
  ...
# Subtest: assembled desktop API authentication boundary
    # Subtest: keeps discovery and bounded pairing bootstrap ahead of the operational API guard
    ok 1 - keeps discovery and bounded pairing bootstrap ahead of the operational API guard
      ---
      duration_ms: 89.197846
      type: 'test'
      ...
    1..1
ok 24 - assembled desktop API authentication boundary
  ---
  duration_ms: 90.497457
  type: 'suite'
  ...
# [2026-09-04 21:50:50.317 +0000] �[32mINFO�[39m: �[36mSQLite database connection established successfully�[39m
#     filename: "/home/runner/work/propr/propr/data/propr.test.sqlite"
#     environment: "test"
# [2026-09-04 21:50:50.383 +0000] �[32mINFO�[39m: �[36mSQLite database connection closed�[39m
# Subtest: accepts Docker IDs and ProPR-generated container names
ok 25 - accepts Docker IDs and ProPR-generated container names
  ---
  duration_ms: 0.856369
  type: 'test'
  ...
# Subtest: rejects container references that could be parsed as options or shell syntax
ok 26 - rejects container references that could be parsed as options or shell syntax
  ---
  duration_ms: 0.148608
  type: 'test'
  ...
# Subtest: production subprocess call sites do not invoke a command shell
ok 27 - production subprocess call sites do not invoke a command shell
  ---
  duration_ms: 168.558011
  type: 'test'
  ...
# Subtest: no-shell guard rejects aliases and enabled shell options
ok 28 - no-shell guard rejects aliases and enabled shell options
  ---
  duration_ms: 12.644293
  type: 'test'
  ...
# Subtest: instance authorization
    # Subtest: defaults unassigned authenticated users to members on a new installation
    ok 1 - defaults unassigned authenticated users to members on a new installation
      ---
      duration_ms: 16.020579
      type: 'test'
      ...
    # Subtest: refuses startup until a bootstrap or durable administrator exists
    ok 2 - refuses startup until a bootstrap or durable administrator exists
      ---
      duration_ms: 7.018681
      type: 'test'
      ...
    # Subtest: grants full admin permissions to PROPR_ADMIN_USERS
    ok 3 - grants full admin permissions to PROPR_ADMIN_USERS
      ---
      duration_ms: 3.633403
      type: 'test'
      ...
    # Subtest: resolves durable roles by numeric GitHub ID after a username change
    ok 4 - resolves durable roles by numeric GitHub ID after a username change
      ---
      duration_ms: 3.891492
      type: 'test'
      ...
    # Subtest: resolves demo users without installation permissions
    ok 5 - resolves demo users without installation permissions
      ---
      duration_ms: 3.219584
      type: 'test'
      ...
    # Subtest: permission middleware rejects members with a stable error code
    ok 6 - permission middleware rejects members with a stable error code
      ---
      duration_ms: 3.024948
      type: 'test'
      ...
    # Subtest: current-user responses expose capabilities without OAuth credentials
    ok 7 - current-user responses expose capabilities without OAuth credentials
      ---
      duration_ms: 2.580735
      type: 'test'
      ...
    1..7
ok 29 - instance authorization
  ---
  duration_ms: 41.12844
  type: 'suite'
  ...
# Subtest: instance member service
    # Subtest: does not let an unassigned user claim the initial administrator role
    ok 1 - does not let an unassigned user claim the initial administrator role
      ---
      duration_ms: 4.329677
      type: 'test'
      ...
    # Subtest: stores a bootstrap administrator against their numeric GitHub ID
    ok 2 - stores a bootstrap administrator against their numeric GitHub ID
      ---
      duration_ms: 6.992162
      type: 'test'
      ...
    # Subtest: adds explicit members and writes an audit entry
    ok 3 - adds explicit members and writes an audit entry
      ---
      duration_ms: 4.85586
      type: 'test'
      ...
    # Subtest: keeps environment authority separate from durable role assignments
    ok 4 - keeps environment authority separate from durable role assignments
      ---
      duration_ms: 3.209069
      type: 'test'
      ...
    # Subtest: prevents removing the last durable administrator
    ok 5 - prevents removing the last durable administrator
      ---
      duration_ms: 4.560757
      type: 'test'
      ...
    # Subtest: allows role changes once another administrator exists
    ok 6 - allows role changes once another administrator exists
      ---
      duration_ms: 16.209947
      type: 'test'
      ...
    1..6
ok 30 - instance member service
  ---
  duration_ms: 40.657838
  type: 'suite'
  ...
# Subtest: instance catalog
    # Subtest: returns operational agent and repository fields without installation internals
    ok 1 - returns operational agent and repository fields without installation internals
      ---
      duration_ms: 2.964669
      type: 'test'
      ...
    # Subtest: projects indexing status only for enabled repository and branch entries
    ok 2 - projects indexing status only for enabled repository and branch entries
      ---
      duration_ms: 2.270348
      type: 'test'
      ...
    1..2
ok 31 - instance catalog
  ---
  duration_ms: 5.369456
  type: 'suite'
  ...
# Subtest: instance admin routes
    # Subtest: resolves a GitHub username and creates one durable member assignment
    ok 1 - resolves a GitHub username and creates one durable member assignment
      ---
      duration_ms: 3.512405
      type: 'test'
      ...
    # Subtest: rejects a non-numeric audit limit with a 400
    ok 2 - rejects a non-numeric audit limit with a 400
      ---
      duration_ms: 1.79556
      type: 'test'
      ...
    # Subtest: rejects GitHub usernames with trailing or consecutive hyphens
    ok 3 - rejects GitHub usernames with trailing or consecutive hyphens
      ---
      duration_ms: 1.785195
      type: 'test'
      ...
    1..3
ok 32 - instance admin routes
  ---
  duration_ms: 7.237954
  type: 'suite'
  ...
# [2026-09-04 21:50:51.985 +0000] �[32mINFO�[39m: �[36mSQLite database connection established successfully�[39m
#     filename: "/home/runner/work/propr/propr/data/propr.test.sqlite"
#     environment: "test"
# [2026-09-04 21:50:52.071 +0000] �[32mINFO�[39m: �[36mSQLite database connection closed�[39m
# Subtest: direct API execution binds to loopback by default
ok 33 - direct API execution binds to loopback by default
  ---
  duration_ms: 0.931299
  type: 'test'
  ...
# Subtest: containerized API execution remains reachable through its published port
ok 34 - containerized API execution remains reachable through its published port
  ---
  duration_ms: 0.159174
  type: 'test'
  ...
# Subtest: an explicit API listen host overrides environment defaults
ok 35 - an explicit API listen host overrides environment defaults
  ---
  duration_ms: 0.153475
  type: 'test'
  ...
# Subtest: GitHub OAuth authorization stores and sends a random state nonce
ok 36 - GitHub OAuth authorization stores and sends a random state nonce
  ---
  duration_ms: 3.589558
  type: 'test'
  ...
# Subtest: GitHub OAuth callback rejects a mismatched state before token exchange
ok 37 - GitHub OAuth callback rejects a mismatched state before token exchange
  ---
  duration_ms: 1.613513
  type: 'test'
  ...
# [2026-09-04 21:50:53.984 +0000] �[32mINFO�[39m: �[36mSQLite database connection established successfully�[39m
#     filename: "/home/runner/work/propr/propr/data/propr.test.sqlite"
#     environment: "test"
# [2026-09-04 21:50:53.985 +0000] �[32mINFO�[39m: �[36mSQLite database connection closed�[39m
# Subtest: returns a standard 429 response after the configured quota
ok 38 - returns a standard 429 response after the configured quota
  ---
  duration_ms: 80.293331
  type: 'test'
  ...
# Subtest: the real global API limiter keeps no-store headers when saturated
ok 39 - the real global API limiter keeps no-store headers when saturated
  ---
  duration_ms: 9.521221
  type: 'test'
  ...
# Subtest: route limiting, 503, and errors inherit the earliest API no-store boundary
ok 40 - route limiting, 503, and errors inherit the earliest API no-store boundary
  ---
  duration_ms: 15.242515
  type: 'test'
  ...
# Subtest: does not charge CORS preflight requests against the quota
ok 41 - does not charge CORS preflight requests against the quota
  ---
  duration_ms: 8.682829
  type: 'test'
  ...
# Subtest: route-level webhook limiting preserves alternate-case raw bodies and rejects excess requests before parsing
ok 42 - route-level webhook limiting preserves alternate-case raw bodies and rejects excess requests before parsing
  ---
  duration_ms: 14.113965
  type: 'test'
  ...
# Subtest: does not let an unconfigured private peer rotate quota buckets with X-Forwarded-For
ok 43 - does not let an unconfigured private peer rotate quota buckets with X-Forwarded-For
  ---
  duration_ms: 10.624293
  type: 'test'
  ...
# Subtest: tunnel trust does not let an unrelated private peer rotate quota buckets
ok 44 - tunnel trust does not let an unrelated private peer rotate quota buckets
  ---
  duration_ms: 11.811959
  type: 'test'
  ...
# Subtest: trusted TLS proxy preserves per-client quotas and secure session cookies
ok 45 - trusted TLS proxy preserves per-client quotas and secure session cookies
  ---
  duration_ms: 19.88464
  type: 'test'
  ...
# Subtest: resolves secure defaults and explicit positive-integer overrides
ok 46 - resolves secure defaults and explicit positive-integer overrides
  ---
  duration_ms: 0.507606
  type: 'test'
  ...
# Subtest: rejects invalid overrides instead of silently disabling protection
ok 47 - rejects invalid overrides instead of silently disabling protection
  ---
  duration_ms: 0.766226
  type: 'test'
  ...
# Subtest: assembled instance permission routes
    # Subtest: captures Express 5 named wildcard parameters as path segments
    ok 1 - captures Express 5 named wildcard parameters as path segments
      ---
      duration_ms: 81.386464
      type: 'test'
      ...
    # Subtest: members can read only the sanitized catalog endpoints
    ok 2 - members can read only the sanitized catalog endpoints
      ---
      duration_ms: 129.692049
      type: 'test'
      ...
    # Subtest: administrators pass every management guard in the route matrix
    ok 3 - administrators pass every management guard in the route matrix
      ---
      duration_ms: 56.714649
      type: 'test'
      ...
    # Subtest: demo users can read only the synthetic Agent Tank usage feed
    ok 4 - demo users can read only the synthetic Agent Tank usage feed
      ---
      duration_ms: 12.526861
      type: 'test'
      ...
    1..4
ok 48 - assembled instance permission routes
  ---
  duration_ms: 281.928578
  type: 'suite'
  ...
# [2026-09-04 21:50:55.348 +0000] �[32mINFO�[39m: �[36mSQLite database connection established successfully�[39m
#     filename: "/home/runner/work/propr/propr/data/propr.test.sqlite"
#     environment: "test"
# [2026-09-04 21:50:55.625 +0000] �[32mINFO�[39m: �[36mSQLite database connection closed�[39m
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status omits disabled configured agents
ok 49 - /api/status omits disabled configured agents
  ---
  duration_ms: 2286.560887
  type: 'test'
  ...
# Subtest: /api/compatibility returns public version contract metadata
ok 50 - /api/compatibility returns public version contract metadata
  ---
  duration_ms: 4.687483
  type: 'test'
  ...
# Subtest: /api/desktop/discovery returns the bounded public identity and runtime origin
ok 51 - /api/desktop/discovery returns the bounded public identity and runtime origin
  ---
  duration_ms: 2.14225
  type: 'test'
  ...
# Subtest: /api/desktop/discovery redacts identity persistence failures
ok 52 - /api/desktop/discovery redacts identity persistence failures
  ---
  duration_ms: 1.324288
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status returns default Claude fallback when no agents are configured
ok 53 - /api/status returns default Claude fallback when no agents are configured
  ---
  duration_ms: 2.700191
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# [notifications] Failed to project system health snapshot: Error: notification persistence unavailable
#     at projectSystemSnapshot (/home/runner/work/propr/propr/packages/api/test/statusRoutes.test.ts:308:13)
#     at Object.getStatus (/home/runner/work/propr/propr/packages/api/routes/statusRoutes.ts:224:14)
#     at async readStatus (/home/runner/work/propr/propr/packages/api/test/statusRoutes.test.ts:186:3)
#     at async TestContext.<anonymous> (/home/runner/work/propr/propr/packages/api/test/statusRoutes.test.ts:305:16)
#     at async Test.run (node:internal/test_runner/test:1054:7)
#     at async Test.processPendingSubtests (node:internal/test_runner/test:744:7)
# Subtest: /api/status isolates system notification projection failures
ok 54 - /api/status isolates system notification projection failures
  ---
  duration_ms: 5.322597
  type: 'test'
  ...
# Subtest: /api/status surfaces unified agent image outages
ok 55 - /api/status surfaces unified agent image outages
  ---
  duration_ms: 1.402632
  type: 'test'
  ...
# Subtest: /api/status includes warnings field in demo mode
ok 56 - /api/status includes warnings field in demo mode
  ---
  duration_ms: 7.431017
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status caches agent health checks briefly
ok 57 - /api/status caches agent health checks briefly
  ---
  duration_ms: 4.842611
  type: 'test'
  ...
# Subtest: /api/status marks an unavailable synthetic pool degraded without downgrading direct agents
ok 58 - /api/status marks an unavailable synthetic pool degraded without downgrading direct agents
  ---
  duration_ms: 2.439948
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status reports resolved auth mode and event intake mode
ok 59 - /api/status reports resolved auth mode and event intake mode
  ---
  duration_ms: 2.797904
  type: 'test'
  ...
# Subtest: /api/status reports connected intake status when routing state is live
ok 60 - /api/status reports connected intake status when routing state is live
  ---
  duration_ms: 3.071346
  type: 'test'
  ...
# Subtest: /api/status reports disconnected intake status when routing state is down
ok 61 - /api/status reports disconnected intake status when routing state is down
  ---
  duration_ms: 2.201177
  type: 'test'
  ...
# Subtest: /api/status reports active intake status for polling when the daemon is running
ok 62 - /api/status reports active intake status for polling when the daemon is running
  ---
  duration_ms: 1.663636
  type: 'test'
  ...
# Subtest: /api/status reports disconnected intake status for polling when the daemon is stopped
ok 63 - /api/status reports disconnected intake status for polling when the daemon is stopped
  ---
  duration_ms: 1.533345
  type: 'test'
  ...
# Subtest: /api/status includes routing state published by the daemon
ok 64 - /api/status includes routing state published by the daemon
  ---
  duration_ms: 1.595987
  type: 'test'
  ...
# Subtest: /api/status exposes only validated UI-safe Connect account fields
ok 65 - /api/status exposes only validated UI-safe Connect account fields
  ---
  duration_ms: 1.987512
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status rejects impossible account dates and preserves valid leap-day instants
ok 66 - /api/status rejects impossible account dates and preserves valid leap-day instants
  ---
  duration_ms: 8.913387
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status drops malformed or disconnected Connect account state without assuming Community
ok 67 - /api/status drops malformed or disconnected Connect account state without assuming Community
  ---
  duration_ms: 3.074141
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status does not expose Connect account state for a non-Connect intake mode
ok 68 - /api/status does not expose Connect account state for a non-Connect intake mode
  ---
  duration_ms: 1.724887
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runner/work/propr/propr/packages/core/src/config/configStore.ts:17:24)
#     at async loadSummarizationRuntimeState (/home/runner/work/propr/propr/packages/core/src/config/configManagerSummarization.ts:101:19) {
#   code: 'SQLITE_ERROR'
# }
# Subtest: /api/status reports connected githubAuth for relay-auth deployments
ok 69 - /api/status reports connected githubAuth for relay-auth deployments
  ---
  duration_ms: 1.758446
  type: 'test'
  ...
# Subtest: /api/status reports unknown auth mode and disconnected health when the resolver is bypassed
ok 70 - /api/status reports unknown auth mode and disconnected health when the resolver is bypassed
  ---
  duration_ms: 1.370485
  type: 'test'
  ...
# Error loading summarization warnings: SqliteError: select * from `system_configs` where `key` = 'summarization_runtime_state' limit 1 - no such table: system_configs
#     at Database.prepare (/home/runner/work/propr/propr/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21)
#     at Client_BetterSQLite3._query (/home/runner/work/propr/propr/node_modules/knex/lib/dialects/better-sqlite3/index.js:35:34)
#     at executeQuery (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/query-executioner.js:37:17)
#     at Client_BetterSQLite3.query (/home/runner/work/propr/propr/node_modules/knex/lib/client.js:154:12)
#     at Runner.query (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:141:36)
#     at ensureConnectionCallback (/home/runner/work/propr/propr/node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13:17)
#     at Runner.ensureConnection (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:318:20)
#     at async Runner.run (/home/runner/work/propr/propr/node_modules/knex/lib/execution/runner.js:30:19)
#     at async getConfigWithClient (/home/runne

...(truncated)

View Workflow

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Independent audit identified the precise Connect regression: useCurrentUserBootstrap now calls getCurrentUser with scopeGeneration, and proprApi appends ?propr_scope_generation=N. smoke-packaged-connect.mjs still recognizes request.url === /api/auth/user and its evidence filters the same exact string. The request now gets401, currentUser stays absent, SocketProvider correctly stays disabled, and REACT_CONNECTED never arrives. Fix the fixture/contract integration by parsing pathname and validating the bounded expected generation query, updating evidence matching too (or retain compatible production route semantics). Preserve the requirement that sockets wait for validated current-user state; do not relax readiness or increase timeouts.

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

One small CI correction to include with the pending integration fix: Validate Changes run33922887183 fails only UI lint after typecheck passes. build-check-output artifact identifies propr-ui/src/desktop/PackagedAcceptanceLocalSetup.tsx:7:14 react-refresh/only-export-components, and --max-warnings0 makes that fatal. Move the non-component export to an appropriate shared module (or apply the repository-approved equivalent), keep the lint policy unchanged, and run UI lint. No broader refactor needed.

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

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

Overall Evaluation

This PR builds a comprehensive packaged Linux acceptance harness with accessibility, visual, authentication, socket, zoom, and artifact-verification coverage. No merge-blocking defect can be conclusively traced within the supplied partial diff. However, it is not merge-ready: both current Packaged Connect Linux checks are failing, and the omitted runner/artifact ranges prevent complete verification. It needs minor changes or check-level resolution before merging.

Acceptance capabilities are tightly isolated — Test behavior requires dual authorization, a packaged Linux binary, an isolated user-data directory, main-process attestation, and sender-bound IPC.

Credential custody is explicitly validated — The changed current-user and WebSocket paths strip renderer credentials, inject the active bearer in the main process, and emit bounded evidence for acceptance validation.

CI evidence is mandatory — Linux x64 jobs install the required runtime tools, run artifact verification, and fail when evidence is missing.

Merge blockers

No merge blockers.

Suggestions

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

S1: 🟢 Cover scope-switch rendering

Consider adding an App-level test for profile activation and switching while current-user validation remains pending. useCurrentUserBootstrap.ts exposes currentUserLoading, but App.tsx gates visible content only on isInitialLoading; explicitly testing the intended interim UI would guard against stale or unauthenticated content flashes. This is optional because the socket remains disabled and no concrete content-isolation regression is established by the supplied diff.

Score

The implementation shows strong security boundaries and unusually thorough focused tests, but the two authoritative Packaged Connect failures and the explicitly omitted diff ranges prevent a merge-ready assessment.

Score: 7/10


🤖 Review Details

  • Model: GPT-5.6 Sol
  • Time: 2m 41s
  • Tokens: 82,056 (73,440 in / 8,616 out)
  • Cost: $0.58
  • Review scope: Partial — PR diff files or ranges were unavailable from GitHub or omitted by the configured review context limit.

View Task

Files omitted from review diff

1 file was omitted because patch content was unavailable from GitHub or did not fit the review context budget. Large, binary, generated, and lockfile changes are deprioritized.

  • apps/desktop/scripts/run-packaged-acceptance.mjs

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

🤖 Review by ProPR

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🔄 Starting work on follow-up changes requested by @integry, @github-actions[bot]

I'll analyze the 4 requests and implement the necessary changes.

View Task Progress


Processing comment IDs: 5546866910✓, 5546879926✓, 5546886958✓, 5546889662✓

@integry

integry commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Additional real packaged-acceptance failure to resolve in the current integration correction: Linux x64 release job101185186430 reaches run-packaged-acceptance.mjs:1243 after successful correlated current-user OPTIONS/GET/main/fixture evidence (200 and accepted schema), then throws Acceptance Socket.IO handshake failed: renderer-lifecycle-evidence-invalid. This is distinct from the ordinary Connect raw-URL fixture mismatch. The required screenshot/trace artifact is not produced. Diagnose the renderer lifecycle reporter/collector schema and ordering from the actual packaged run, fix the instrumentation contract, and rerun the real Linux x64 acceptance to verified artifact completion. Preserve meaningful lifecycle/credential/socket assertions and all12x5 capture coverage; do not bypass evidence validation or claim preview completion from unit tests. This was also an explicitly required regression fix in issue2123.

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Processing Delayed: Claude's usage limit was reached while processing requests from @integry, @github-actions[bot].

The job has been automatically rescheduled and will restart at a later time.


Job ID: pr-comments-batch-integry-propr-2127-codex-gpt56-sol-2123-gpt-5-6-sol-integrate-pac-ratelimit-retry will run again after delay.

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

🔄 Starting work on follow-up changes requested by @integry

I'll analyze the 1 request and implement the necessary changes.

View Task Progress


Processing comment ID: 5546929190✓

@propr-dev

propr-dev Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Processing Delayed: Claude's usage limit was reached while processing requests from @integry.

The job has been automatically rescheduled and will restart at a later time.


Job ID: pr-comments-batch-integry-propr-2127-codex-gpt56-sol-2123-gpt-5-6-sol-integrate-pac-ratelimit-retry will run again after delay.

@integry

integry commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Resume the unfinished correction after the previous usage-limit stop. Current head8297b; no correction was pushed. Recover existing edits if available and complete the three demonstrated failures together: ordinary packaged Connect current-user raw-URL/evidence matching must accept the bounded expected proprDesktopScopeGeneration query; PackagedAcceptanceLocalSetup.tsx non-component export causes fatal UI lint; and real packaged acceptance job101185186430 fails renderer-lifecycle-evidence-invalid after current-user phases all pass, preventing60 screenshots. Prior comments contain exact logs and contracts. Preserve production credential/socket readiness boundaries, lifecycle evidence validation, release profile and full12x5 capture coverage. Fix actual fixture/instrumentation contracts rather than hiding evidence or extending timeouts. Run relevant tests/lint and actual packaged CI. No optional S1 polish or score chasing. Leave open, target desktop epic only; Linux production setup is separate issue2126.

@propr-dev

propr-dev Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

🛑 Execution Cancelled

The task processing was stopped by user request.

You can post a new comment to restart processing.

@propr-dev

propr-dev Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Applied the requested follow-up changes in commit 0e913d3

Summary of Changes

Implemented the three requested corrections:

  • Ordinary packaged Connect now strictly accepts the expected bounded proprDesktopScopeGeneration=1 URL for fixture routing and evidence matching.
  • Lifecycle evidence is emitted as an immutable JSON snapshot and synchronously parsed with the existing strict validation.
  • The non-component setup export moved out of the TSX module, resolving fatal React-refresh lint.

Validation passed:

  • Desktop/UI typecheck
  • UI lint with zero warnings
  • Desktop suite: 544 passed, 26 skipped
  • Focused UI/current-user regressions
  • Linux package build
  • Executable/fuse inspection
  • Real packaged Connect smoke

The 60-capture local attempt was blocked earlier at Connect confirmation by the container’s lack of a production-configured Electron sandbox, before reaching lifecycle validation. Corrected GitHub CI can only run after the system commits/pushes these changes; I did not commit per instruction. No release-profile/workflow changes or visual previews were added.


🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @integry
  • Time: 23m 2s
  • Tokens: 12,240,719 (12,206,128 in / 34,591 out)
  • Cost: $8.03
  • Subscription usage: Weekly +3%

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

@integry

integry commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Recovery evidence for the automatically rescheduled worker (not a new scope or request for another review pass): predecessor task pr-comments-batch-integry-propr-2127-1788688113021 had uncommitted corrections before its container was replaced around 10:02 UTC. A clean NEW worktree does not establish that the OLD worktree has no recoverable edits; please inspect the prior worktrees if accessible. It changed lifecycle console evidence to an immediate secret-free JSON snapshot with strict parsing/schema validation in the collector; reused the bounded current-user URL classifier in ordinary Connect routing and evidence; moved the setup discriminator/type out of the TSX module. It reported zero-warning UI lint, focused regressions, desktop suite 544 passed/26 skipped, Linux package build and fuse inspection passing, then was provisioning isolated Xvfb/keyring/Tesseract tools for actual acceptance. No commit was pushed. Recover and verify that delta where possible; the 60 captures and actual packaged Connect proof remain required. This note only preserves prior results, not permission to skip revalidation or weaken production gates.

Implemented the three requested corrections:

- Ordinary packaged Connect now strictly accepts the expected bounded `proprDesktopScopeGeneration=1` URL for fixture routing and evidence matching.
- Lifecycle evidence is emitted as an immutable JSON snapshot and synchronously parsed with the existing strict validation.
- The non-component setup export moved out of the TSX module, resolving fatal React-refresh lint.

Validation passed:

- Desktop/UI typecheck
- UI lint with zero warnings
- Desktop suite: 544 passed, 26 skipped
- Focused UI/current-user regressions
- Linux package build
- Executable/fuse inspection
- Real packaged Connect smoke

The 60-capture local attempt was blocked earlier at Connect confirmation by the container’s lack of a production-configured Electron sandbox, before reaching lifecycle validation. Corrected GitHub CI can only run after the system commits/pushes these changes; I did not commit per instruction. No release-profile/workflow changes or visual previews were added.

PR: #2127
Comment by: @integry (ID: 5558427812)
Model: gpt-5.6-sol
@propr-dev

propr-dev Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

🛑 Execution Cancelled

The task processing was stopped by user request.

You can post a new comment to restart processing.

@integry

integry commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Normal production-sandbox CI still reproduces the visual blocker at published head0e913d3: run34027467657, Linux x64 job101471017483, run-packaged-acceptance.mjs:1255 -> journey1481 reports renderer-lifecycle-evidence-invalid. Current-user evidence is exactly once throughout (OPTIONS/GET/main accepted/fixture200/requestIssued/responseCompleted/parsedUserAccepted/activeScopeAccepted all1, rejected0). The JSON snapshot change alone did not resolve the actual failing predicate. Diagnose and correct the exact producer/collector mismatch, including early/intermediate lifecycle records and cross-journey invalid-state attribution. Add bounded secret-free classification for the first invalid record if needed; do not guess, drop invalid records, relax schema/count invariants, or weaken socket proof. All4 ordinary Mac/Linux Connect now pass; preserve those and lint fixes. Complete the actual normal CI 12x5=60 capture run before claiming visual acceptance. No Windows work or additional feature scope.

@propr-dev

propr-dev Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Applied the requested follow-up changes in commit 4bd4557

Summary of Changes

Implemented the exact lifecycle correction without weakening evidence:

  • Added the missing production-shaped /api/auth/demo-mode fixture response. Its absent demoMode boolean caused disabledByDemoMode to disappear from intermediate JSON lifecycle records.
  • Replaced global invalid-state poisoning with strict per-journey attribution.
  • Added bounded, secret-free first-invalid classification while keeping invalid records fatal.
  • Preserved lifecycle schema/count limits and socket proof.

Validation passed:

  • Desktop suite: 544 passed, 26 skipped
  • Focused tests: 21 passed
  • UI lifecycle/setup tests: 6 passed
  • Desktop/UI typechecks
  • UI lint and runner lint
  • Linux package build
  • git diff --check

A local harness run produced all 60 captures with valid current-user, lifecycle, and socket evidence. Its final verifier reported separate accessibility findings. This container cannot run the required root-owned production SUID sandbox, and the corrected code is intentionally uncommitted, so normal hosted CI must run after the system publishes it. I am not claiming visual acceptance yet.


🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @integry
  • Time: 23m 55s
  • Tokens: 16,552,467 (16,516,799 in / 35,668 out)
  • Cost: $10.41
  • Subscription usage: Weekly +2%

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

@integry

integry commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Concrete independent diagnosis for the current active correction: createFixture has no explicit /api/auth/demo-mode response. Its generic /api/* fallback returns {agents:[],repositories:[],items:[],count:0}; getDemoModeStatus consumes this without schema validation, and DemoModeProvider sets isDemoMode=status.demoMode (undefined). App propagates that as the demoMode disable reason; SocketProvider reports disabledByDemoMode:undefined. JSON.stringify then omits this required key, so captureRendererLifecycleEvidence exactKeys fails and globally invalidates evidence. Add the truthful fixture demo-mode contract (demoMode:false plus any other required response fields) and regression coverage through this producer chain. Preserve strict lifecycle schema/count checks and all real socket/current-user proof. This is evidence for your existing request, not a separate feature or review cycle.

…g evidence:

Implemented the exact lifecycle correction without weakening evidence:

- Added the missing production-shaped `/api/auth/demo-mode` fixture response. Its absent `demoMode` boolean caused `disabledByDemoMode` to disappear from intermediate JSON lifecycle records.
- Replaced global invalid-state poisoning with strict per-journey attribution.
- Added bounded, secret-free first-invalid classification while keeping invalid records fatal.
- Preserved lifecycle schema/count limits and socket proof.

Validation passed:

- Desktop suite: 544 passed, 26 skipped
- Focused tests: 21 passed
- UI lifecycle/setup tests: 6 passed
- Desktop/UI typechecks
- UI lint and runner lint
- Linux package build
- `git diff --check`

A local harness run produced all 60 captures with valid current-user, lifecycle, and socket evidence. Its final verifier reported separate accessibility findings. This container cannot run the required root-owned production SUID sandbox, and the corrected code is intentionally uncommitted, so normal hosted CI must run after the system publishes it. I am not claiming visual acceptance yet.

PR: #2127
Comment by: @integry (ID: 5558656372)
Model: gpt-5.6-sol
@propr-dev

propr-dev Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

ℹ️ Analyzed the follow-up request by @integry

Analysis Summary

I’ll trace the fixture → demo-mode provider → socket lifecycle evidence path in the specified PR worktree, then add the smallest contract fix and focused regression coverage while keeping the strict evidence checks intact. I’ll first verify the worktree state and repository guidance so I don’t disturb recovered or unrelated edits.

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


🤖 Analysis Details

  • Model: GPT-5.6 Sol (high)
  • Time: 54s

View Task Execution


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

🤖 Generated by ProPR
Processing comment ID: 5558687266✓

@integry

integry commented Sep 6, 2026

Copy link
Copy Markdown
Owner

The lifecycle fix is independently verified at 4bd4557 and the hosted Linux run now reaches artifact verification, but it fails the accessibility threshold: run34028985075 job101475096977 at11:07:07, acceptance-artifacts.mjs:416. This confirms the failure is not solely the local user-space display setup. Please make one bounded correction for the actual contrast/accessibility findings in the 60-capture report; preserve thresholds and all strict lifecycle/socket/current-user/secret checks. Capture and publish sanitized report plus representative screenshots so we can visually inspect the result, including if verification fails. Do not redesign unrelated UI.

Consolidate the separate Intel Mac CI test failure in the same pass: job101475096923 has exactly one failed test, packaged-connect-lifecycle.test.mjs:726 transient Windows EBUSY mock. Its identityOptions has a 20ms wall-clock deadline, while CI took35ms. The test file is unchanged by this correction, so do not infer a production Windows regression or resume Windows implementation. Stabilize only this cross-platform test (deterministic timing or a justified test-only bound, retaining production deadlines and timeout tests), or provide evidence supporting a job-only rerun when GitHub allows it.

The delayed diagnostic worker for comment5558687266 was stopped because your published commit already implements it; do not search for or duplicate old work. Focus on these actual current-head CI failures and report exact-head Linux/macOS evidence. Do not merge.

@propr-dev

propr-dev Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Applied the requested follow-up changes in commit c759219

Summary of Changes

Implemented the bounded follow-up without committing or merging.

  • Corrected the three reported contrast failures in desktop.css.
  • Added accessible names to the flagged dashboard link and search input.
  • Stabilized only the transient EBUSY test with a test-local 250 ms bound; production and timeout-test deadlines remain unchanged.
  • Made unsigned and signed Linux evidence uploads run even after verification failure in desktop-release-guard.yml.
  • Staged two sanitized representative screenshots for preview publication.

Verification:

  • Full packaged Linux acceptance: 60/60 screenshots, 12 journeys, zero serious/critical findings, accessible names/focus/modal checks passed.
  • Strict standalone artifact verification passed, including OCR and secret scanning.
  • Lifecycle test: 25/25 repeated runs passed.
  • Desktop suite: 544 passed, 26 skipped, 0 failed.
  • Relevant UI tests: 21 passed.
  • UI lint, desktop/UI typechecks, YAML parsing, and git diff --check passed.

Exact-head diagnosis at 4bd45579: Linux had 10 serious contrast records across the chooser and profile manager; Intel macOS had only the 35.29 ms transient EBUSY test failure. No production Windows implementation was changed.

Visual preview

Profile manager accessibility correction

Profile manager accessibility correction

Packaged Linux standard-viewport capture showing the corrected Local instance helper label in the Manage instances dialog.

First-run chooser contrast correction

First-run chooser contrast correction

Packaged Linux standard-viewport capture showing the corrected helper-text contrast for both setup choices.


🤖 Implementation Details

  • Model: GPT-5.6 Sol (high)
  • Requested By: @integry
  • Time: 22m 36s
  • Tokens: 11,228,700 (11,200,770 in / 27,930 out)
  • Cost: $7.30
  • Subscription usage: Weekly +1%

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

…ging.

Implemented the bounded follow-up without committing or merging.

- Corrected the three reported contrast failures in [desktop.css](/home/node/workspace/propr-ui/src/desktop/desktop.css:113).
- Added accessible names to the flagged dashboard link and search input.
- Stabilized only the transient EBUSY test with a test-local 250 ms bound; production and timeout-test deadlines remain unchanged.
- Made unsigned and signed Linux evidence uploads run even after verification failure in [desktop-release-guard.yml](/home/node/workspace/.github/workflows/desktop-release-guard.yml:338).
- Staged two sanitized representative screenshots for preview publication.

Verification:

- Full packaged Linux acceptance: 60/60 screenshots, 12 journeys, zero serious/critical findings, accessible names/focus/modal checks passed.
- Strict standalone artifact verification passed, including OCR and secret scanning.
- Lifecycle test: 25/25 repeated runs passed.
- Desktop suite: 544 passed, 26 skipped, 0 failed.
- Relevant UI tests: 21 passed.
- UI lint, desktop/UI typechecks, YAML parsing, and `git diff --check` passed.

Exact-head diagnosis at `4bd45579`: Linux had 10 serious contrast records across the chooser and profile manager; Intel macOS had only the 35.29 ms transient EBUSY test failure. No production Windows implementation was changed.

PR: #2127
Comment by: @integry (ID: 5558814249)
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