Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
27fa47f
fix(desktop): bind session commands and lifecycle resources to their …
SivanCola Sep 7, 2026
d70902c
Merge the renderer parent qualification history
SivanCola Sep 7, 2026
45bbb56
Merge the standalone renderer acceptance documentation
SivanCola Sep 7, 2026
a141c4a
refactor(app): separate runtime composition from the shared page tree
SivanCola Sep 7, 2026
5caae8e
Merge the independently qualified parent history and acceptance contract
SivanCola Sep 7, 2026
5b0c914
Merge the final settings parent qualification history
SivanCola Sep 7, 2026
fb872b7
Merge the final parent qualification history into the shell slice
SivanCola Sep 7, 2026
f10e404
merge: integrate atomic transcript measurement commits
SivanCola Sep 7, 2026
fbb6d71
merge: integrate atomic transcript geometry into the App shell
SivanCola Sep 7, 2026
b0e19a1
merge: preserve input-owned transcript intent
SivanCola Sep 7, 2026
4a5ef4d
merge: propagate input-owned transcript intent to app shell
SivanCola Sep 7, 2026
84894a1
merge: align ownership slice with merged prerequisites
SivanCola Sep 7, 2026
02adae2
merge: align app shell with merged prerequisites
SivanCola Sep 7, 2026
00eaa0e
Merge qualified transcript geometry repair
SivanCola Sep 7, 2026
489e15b
Merge shared transcript geometry qualification
SivanCola Sep 7, 2026
fbf65d7
fix(desktop): publish rejected remote resumes atomically
SivanCola Sep 7, 2026
4f2a6b4
merge: carry atomic remote failure ownership into App shell
SivanCola Sep 7, 2026
54c5347
fix(remote): handle lock release during bootstrap acquisition
SivanCola Sep 7, 2026
95bb23a
merge: carry verified remote acquisition ownership into App shell
SivanCola Sep 7, 2026
4595e83
fix(desktop): commit first materialization before transcript paint
SivanCola Sep 7, 2026
5e9b1d1
merge: integrate first-materialization repair into App shell
SivanCola Sep 7, 2026
6dfb647
test(desktop): select message text before safety fault injection
SivanCola Sep 7, 2026
73270c9
merge: carry the real-selection safety replay into App shell
SivanCola Sep 7, 2026
6a24344
fix(desktop): preserve committed anchors across natural size changes
SivanCola Sep 7, 2026
9e200a7
merge: preserve reader anchor ownership in App shell
SivanCola Sep 7, 2026
f6ba849
merge: integrate current mainline Stop and catalog repairs
SivanCola Sep 7, 2026
cb4a42b
merge: integrate source-owned Stop and catalog baseline in App shell
SivanCola Sep 7, 2026
962ceb1
merge: preserve recovery notifications in the split App runtime
SivanCola Sep 7, 2026
d734a8c
merge: retain mainline recovery behavior in App composition
SivanCola Sep 7, 2026
ec6fff3
Merge current tool cancellation and liveness fixes into session owner…
SivanCola Sep 7, 2026
c4e44e5
Merge current tool cancellation and liveness integration into App shell
SivanCola Sep 7, 2026
8e36deb
Merge provider settings and native viewport fixes into session ownership
SivanCola Sep 7, 2026
da6e8f0
Merge provider settings and native viewport integration into App shell
SivanCola Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 174 additions & 0 deletions .github/workflows/app-memory.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
name: App memory screening

on:
pull_request:
branches: [main-v2]
push:
branches: [main-v2]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: app-memory-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
EXPECTED_SOURCE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}

jobs:
changes:
runs-on: ubuntu-22.04
outputs:
run: ${{ steps.paths.outputs.run }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ env.EXPECTED_SOURCE_SHA }}
fetch-depth: 0
- uses: actions/setup-node@v7
with:
node-version: "24"
- id: paths
env:
BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
if [ "$GITHUB_EVENT_NAME" != pull_request ]; then
echo 'run=true' >> "$GITHUB_OUTPUT"
else
git diff --name-only -z "$BASE_SHA...$EXPECTED_SOURCE_SHA" > "$RUNNER_TEMP/memory-paths"
node desktop/frontend/bench/app-memory-paths.mjs "$RUNNER_TEMP/memory-paths" >> "$GITHUB_OUTPUT"
fi

prepare:
needs: changes
if: needs.changes.outputs.run == 'true'
runs-on: ubuntu-22.04
timeout-minutes: 20
defaults:
run:
working-directory: desktop/frontend
steps:
- uses: actions/checkout@v7
with:
ref: ${{ env.EXPECTED_SOURCE_SHA }}
- uses: pnpm/action-setup@v6.0.9
with:
version: 10
run_install: false
- uses: actions/setup-node@v7
with:
node-version: "24"
cache: pnpm
cache-dependency-path: desktop/frontend/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: node --test bench/app-memory-shards.test.mjs bench/app-memory-paths.test.mjs
- run: pnpm build
- run: node bench/app-memory-prepare.mjs "$RUNNER_TEMP/app-memory-build"
- uses: actions/upload-artifact@v7
with:
name: app-memory-build-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/app-memory-build
include-hidden-files: true
if-no-files-found: error
retention-days: 7

shard:
needs: prepare
runs-on: ubuntu-22.04
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
defaults:
run:
working-directory: desktop/frontend
steps:
- uses: actions/checkout@v7
with:
ref: ${{ env.EXPECTED_SOURCE_SHA }}
- uses: pnpm/action-setup@v6.0.9
with:
version: 10
run_install: false
- uses: actions/setup-node@v7
with:
node-version: "24"
cache: pnpm
cache-dependency-path: desktop/frontend/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm exec playwright install --with-deps chromium
- uses: actions/download-artifact@v8
with:
name: app-memory-build-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/app-memory-build
- run: cp -a "$RUNNER_TEMP/app-memory-build/dist/." dist/
- name: Run complete independent memory process
env:
REASONIX_APP_MEMORY_SHARD: ${{ matrix.shard }}
REASONIX_APP_MEMORY_PREPARED: ${{ runner.temp }}/app-memory-build/identity.json
REASONIX_APP_MEMORY_ARTIFACTS: ${{ runner.temp }}/app-memory-results
PLAYWRIGHT_BROWSERS_PATH: /home/runner/.cache/ms-playwright
run: node bench/app-memory.mjs
- uses: actions/upload-artifact@v7
if: always()
with:
name: app-memory-shard-${{ matrix.shard }}-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/app-memory-results
if-no-files-found: error
retention-days: 7

app-memory:
if: always()
needs: [changes, prepare, shard]
runs-on: ubuntu-22.04
steps:
- name: Verify all prerequisite jobs
env:
CHANGES_RESULT: ${{ needs.changes.result }}
SHOULD_RUN: ${{ needs.changes.outputs.run }}
PREPARE_RESULT: ${{ needs.prepare.result }}
SHARD_RESULT: ${{ needs.shard.result }}
run: |
test "$CHANGES_RESULT" = success
if [ "$SHOULD_RUN" = true ]; then
test "$PREPARE_RESULT" = success
test "$SHARD_RESULT" = success
else
test "$SHOULD_RUN" = false
test "$PREPARE_RESULT" = skipped
test "$SHARD_RESULT" = skipped
fi
- uses: actions/checkout@v7
if: needs.changes.outputs.run == 'true'
with:
ref: ${{ env.EXPECTED_SOURCE_SHA }}
- uses: actions/setup-node@v7
if: needs.changes.outputs.run == 'true'
with:
node-version: "24"
- uses: actions/download-artifact@v8
if: needs.changes.outputs.run == 'true'
with:
pattern: app-memory-shard-*-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/app-memory-reports
- uses: actions/download-artifact@v8
if: needs.changes.outputs.run == 'true'
with:
name: app-memory-build-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/app-memory-build
- name: Verify same-build complete protocol
if: needs.changes.outputs.run == 'true'
run: |
node desktop/frontend/bench/app-memory-aggregate.mjs \
"$RUNNER_TEMP/app-memory-reports" "$RUNNER_TEMP/app-memory-build/identity.json" \
"$RUNNER_TEMP/app-memory-report.json" "$EXPECTED_SOURCE_SHA"
- uses: actions/upload-artifact@v7
if: success() && needs.changes.outputs.run == 'true'
with:
name: app-memory-aggregate-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/app-memory-report.json
if-no-files-found: error
retention-days: 7
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,9 @@ jobs:
pnpm --dir frontend test:motion-browser
pnpm --dir frontend test:composer
pnpm --dir frontend test:todo-visibility
pnpm --dir frontend test:app-lifecycle
PLAYWRIGHT_BROWSERS_PATH=.pw-browsers pnpm --dir frontend test:app-browser
pnpm --dir frontend test:all
pnpm --dir frontend test:transcript
xvfb-run -a env REASONIX_TRANSCRIPT_NATIVE_THUMB=1 pnpm --dir frontend test:transcript-browser
PLAYWRIGHT_BROWSERS_PATH=.pw-browsers pnpm --dir frontend test:transcript-reader-browser
Expand Down
18 changes: 14 additions & 4 deletions desktop/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,23 +67,33 @@ contracts when touching anything that can move the transcript viewport.
position and native scroll state into independently committed compositor
transactions.
- **Anchor-safe measurement commit**: DOM measurements enter a block-keyed
staging ledger before they can change TanStack's prefix sizes. While native
input owns reader intent, the entire painted viewport is immutable: both the pre-measurement
staging ledger before they can change TanStack's prefix sizes. First
materialization is distinct: each new native host must publish its real size
and complete prefix before its first paint, not wait for gesture release.
One generation-bound window origin can preserve common visible positions
while new preceding blocks are measured. Translate positions, extent, range
lookup and publication-frontier checks together; consume the origin
continuously toward the native leading edge, never reset it abruptly at zero.
Clear it using the committed prefix anchor in one prepaint commit after
input ends; ordinary growth retains the input-captured Kernel anchor. Acknowledge geometry only after materialization finishes. For
subsequent size changes, while native input owns reader intent, the entire painted viewport is immutable: both the pre-measurement
prefix range and mounted DOM must place a block after the viewport before it
becomes a publish boundary. The logical Kernel anchor may only move that
boundary later. This prevents stale listeners, underestimated ranges, or
lazy blocks from reflowing any content the reader can see. TanStack's
`scrollMargin` is measured in the native scroller's coordinate space,
including Transcript padding and any prefix. Earlier and visible sizes remain
staged during native ownership; only post-viewport overscan may publish.
staged during native ownership; only post-viewport overscan may publish later
changes. Newly materialized natural sizes follow the prepaint rule above.
After ownership ends, publish staged DOM sizes under a Kernel logical-anchor
restore transaction. Prefix layout and anchor correction must complete in
one before-paint commit, cancelling any queued older geometry work.
Preserve the first reading anchor, while allowing later
blocks to move with actual content growth; freezing every old top would
overlap expanded content. Observe mounted absolute blocks as well as the
projection root, since local folds do not change the root extent. Tail intent
does not refine invisible cold history; its exact geometry belongs to resident DOM. The measurement ledger owns sizes only.
does not refine subsequent invisible cold-history changes; first materialization
still establishes real mounted sizes. The measurement ledger owns sizes only.
Input leases belong to the Kernel and must not be duplicated in the window
adapter. Re-read physical viewport geometry at measurement admission; both
painted prefix and measured DOM must place the publication boundary beyond
Expand Down
2 changes: 2 additions & 0 deletions desktop/frontend/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ package-lock.json
# Playwright browsers for the real-DOM bench (kept inside the repo; see bench/).
.pw-browsers
bench/results.json
bench/app-memory-results.json
bench/app-memory-artifacts/
Loading
Loading