Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
5b2fbfb
docs(policy): move agent-fast / build gate from dev to unstable
claude Aug 31, 2026
10d4672
docs(policy): move agent-fast / build gate from dev to unstable (#484)
mberrys Aug 31, 2026
e2d0197
fix: repair Session 07 package runtime workflows
mberrys Aug 31, 2026
3769e0b
fix: install Linux fontconfig headers for package build
mberrys Sep 1, 2026
be68d1e
fix: harden package deployment evidence
mberrys Sep 1, 2026
d099622
fix: close Session 08 residue sweep
mberrys Sep 1, 2026
d7d7ae8
fix: repair package runtime deployment
mberrys Sep 1, 2026
c46d040
ci: speed up package boundary workflows
mberrys Sep 1, 2026
76ca91a
Add Quick PDF4QT parity foundation
mberrys Sep 1, 2026
4599918
ci: speed up package boundary workflows (#486)
mberrys Sep 1, 2026
1e9c687
fix: close Session 08 residue sweep (#485)
mberrys Sep 1, 2026
50f818f
Document gh-143 parity checklist and update Quick tests (#489)
mberrys Sep 1, 2026
e97eff9
Expose competitor document capability state
mberrys Sep 1, 2026
7326e10
Format Quick search changes
mberrys Sep 1, 2026
62a225e
fix: correct PDFTextLayoutGenerator arity and FlowFlags construction …
mberrys Sep 1, 2026
dd9e04f
fix: rename changelog fragment to match branch
mberrys Sep 1, 2026
8d7e86b
fix: move Quick document search into LoupeLibCore and wire Find to Se…
mberrys Sep 1, 2026
94b8776
fix: correct PDFTextLayoutGenerator arity and FlowFlags construction …
mberrys Sep 1, 2026
f7fa814
fix: address remaining Quick parity review comments
mberrys Sep 1, 2026
daa123a
test: add resource envelope fixture matrix runner (#493)
mberrys Sep 1, 2026
cf5c0d9
fix: validate resource-envelope evidence identity per run (#497)
mberrys Sep 1, 2026
98a487b
Fix Linux cache and Windows MSI Qt packaging (#494)
mberrys Sep 1, 2026
1ae955d
Merge remote-tracking branch 'origin/codex/fix-issues-from-codex-revi…
mberrys Sep 1, 2026
3794d7c
Merge remote-tracking branch 'origin/dev' into cdx/quick-pdf4qt-core-…
mberrys Sep 1, 2026
70af4b6
fix: resolve Quick parity CI failures (#498)
mberrys Sep 1, 2026
c39ddd5
test: add the gh-146 interaction trace corpus and CI checker
claude Sep 1, 2026
12f3081
test: complete the gh-146 lane-1 scenario corpus
claude Sep 1, 2026
de844ac
fix: stage Loupe.Quick QML and drop unbundlable SQL drivers for packa…
mberrys Sep 1, 2026
13b48fd
fix: use PDFObject null check in Quick document model
mberrys Sep 1, 2026
3c5e1a6
Add gh-243 resource-exhaustion corpus for PDFProcessingBudget
claude Sep 1, 2026
c6e21fa
Regenerate Phase 5 Widgets evidence for the new UnitTestsBudgetCorpus…
claude Sep 1, 2026
087969c
Register tst_budgetcorpustest.cpp with the core module boundary
claude Sep 1, 2026
a101d48
Fix UnitTestsBudgetCorpus build: QJsonArray has no constFirst()
claude Sep 2, 2026
e626113
fix: stage Loupe.Quick from LoupeEditor build output (#503)
mberrys Sep 2, 2026
dcffef2
fix: detect document forms via PDFForm in QuickDocumentModel (#501)
mberrys Sep 2, 2026
5493a49
test: concurrent revision-authority stress scenario (#236) (#505)
mberrys Sep 2, 2026
974f6f4
Merge branch 'dev' into cc/nice-noether-u5ie9s
mberrys Sep 2, 2026
e320366
Add gh-243 resource-exhaustion corpus for PDFProcessingBudget (#504)
mberrys Sep 2, 2026
787cdea
fix: merge unstable into dev for PR 490 promotion readiness
cursoragent Sep 2, 2026
ac702f8
chore: add changelog fragment for PR 490 promotion fix
cursoragent Sep 2, 2026
12083f8
fix: reword changelog to satisfy loop identity contract
cursoragent Sep 2, 2026
0cf1acf
fix: merge unstable into dev for PR 490 promotion readiness (#514)
cursor[bot] Sep 2, 2026
2ab848b
0.2.1 promotion: move agent-fast build gate to unstable and update po…
mberrys Sep 2, 2026
003a3c5
Merge branch 'stable' into unstable
mberrys Sep 2, 2026
6c628b4
fix: apply P1-P2 codex fixes and linux test catalog drift (PR 516)
mberrys Sep 2, 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
4 changes: 2 additions & 2 deletions .claude/policy-brief.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ Repository: `studio-berry/loop`; version: `0.2.0-alpha`; language: `C++20`; mini

## Branches and safety

- Integration: `dev`; release/default: `stable`; topic branches start from `dev`.
- Protected branches: `dev`, `stable`. Do not commit, push, merge, force-push, or rewrite history without approval.
- Integration: `dev`; qualification: `unstable`; release/default: `stable`; topic branches start from `dev`. Promotion: `dev` → `unstable` → `stable`.
- Protected branches: `unstable`, `stable`. Do not commit, push, merge, force-push, or rewrite history without approval.
- Keep private data, credentials, logs, scratch plans, and build artifacts outside the repository. Do not edit vendored dependencies unless explicitly scoped.

## Autonomous verification budget
Expand Down
4 changes: 2 additions & 2 deletions .cursor/agent-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ Repository: `studio-berry/loop`; version: `0.2.0-alpha`; language: `C++20`; mini

## Branches and safety

- Integration: `dev`; release/default: `stable`; topic branches start from `dev`.
- Protected branches: `dev`, `stable`. Do not commit, push, merge, force-push, or rewrite history without approval.
- Integration: `dev`; qualification: `unstable`; release/default: `stable`; topic branches start from `dev`. Promotion: `dev` → `unstable` → `stable`.
- Protected branches: `unstable`, `stable`. Do not commit, push, merge, force-push, or rewrite history without approval.
- Keep private data, credentials, logs, scratch plans, and build artifacts outside the repository. Do not edit vendored dependencies unless explicitly scoped.

## Autonomous verification budget
Expand Down
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*.sh text eol=lf
docs/generated/phase5-widgets-inventory.json text eol=lf
docs/generated/phase5-widgets-disposition.json text eol=lf
UnitTests/testdata/interaction-traces/** text eol=lf
*.pdf binary
*.icc binary
Fuzz/corpus/regression/** binary
Expand Down
33 changes: 28 additions & 5 deletions .github/workflows/LinuxInstall.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,21 @@ permissions:

jobs:
build_ubuntu:
runs-on: ubuntu-24.04
# linuxdeployqt is pinned to a glibc-2.35-compatible build. Keep the
# packaging runner aligned with that oldest-supported deployment tool.
runs-on: ubuntu-22.04
env:
VCPKG_OVERLAY_PORTS: ${{ github.workspace }}/loop/vcpkg/overlays/linux:${{ github.workspace }}/loop/vcpkg/overlays/general
VCPKG_INSTALLED_DIR: ${{ github.workspace }}/vcpkg_installed
VCPKG_DEFAULT_BINARY_CACHE: ${{ github.workspace }}/vcpkg-binary-cache
GNUPGHOME: ${{ github.workspace }}/gnupg
QT_QPA_PLATFORM: offscreen

steps:
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libxcb-cursor0 libspeechd2 gnupg2 wget appstream libcups2 libcups2-dev
sudo apt-get install -y libxcb-cursor0 libspeechd2 libfontconfig1-dev gnupg2 wget appstream libcups2 libcups2-dev

- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
Expand Down Expand Up @@ -106,6 +109,7 @@ jobs:

- name: 'VCPKG: Set up VCPKG'
run: |
mkdir -p "$VCPKG_DEFAULT_BINARY_CACHE"
VCPKG_COMMIT="$(python3 - <<'PY'
import json
with open("loop/vcpkg-configuration.json", encoding="utf-8") as f:
Expand All @@ -128,7 +132,8 @@ jobs:
}

./vcpkg/bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg/vcpkg integrate install
echo "VCPKG_BINARY_SOURCES=clear;files,$VCPKG_DEFAULT_BINARY_CACHE,readwrite" >> "$GITHUB_ENV"

- name: 'VCPKG: Cache vcpkg dependencies'
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
Expand All @@ -137,6 +142,7 @@ jobs:
./vcpkg/downloads
./vcpkg/packages
./vcpkg_installed
./vcpkg-binary-cache
key: ${{ runner.os }}-vcpkg-v2-${{ hashFiles('**/vcpkg.json', '**/vcpkg-configuration.json') }}
restore-keys: |
${{ runner.os }}-vcpkg-v2-
Expand All @@ -162,7 +168,7 @@ jobs:
working-directory: loop
run: |
cmake -B build -S . -DLOOP_INSTALL_QT_DEPENDENCIES=0 -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_VCPKG_BUILD_TYPE=Release -DLOOP_INSTALL_TO_USR=ON -DLOOP_LOOP_DISTRIBUTION=ON -DLOOP_PLUGIN_OCR=OFF -DLOOP_BUILD_PRODUCT_QUICK_A11Y_SMOKE=ON
cmake --build build --target all release_translations -j6
cmake --build build --target LoopEditor PdfTool ProductQuickAccessibilitySmoke release_translations -j6
cmake --install build
pwsh ./scripts/verify-loop-surface.ps1 -InstallDir "$GITHUB_WORKSPACE/loop/build/install" -Profile loop-release -BuildDir build -InstallManifestPath build/install_manifest.txt

Expand Down Expand Up @@ -196,14 +202,31 @@ jobs:
- name: 'Linux Deploy Qt'
working-directory: loop/build
run: |
evidence_dir="$RUNNER_TEMP/loop-package-boundary-linux"
mkdir -p "$evidence_dir"
set -o pipefail
loop_quick_src="$GITHUB_WORKSPACE/loop/build/LoopEditor/Loop/Quick"
qml_dest="install/usr/lib/qml/Loop/Quick"
if [ ! -d "$loop_quick_src" ]; then
echo "::error::Built Loop.Quick QML module was not found: $loop_quick_src"
exit 1
fi
mkdir -p "$(dirname "$qml_dest")"
cp -a "$loop_quick_src" "$qml_dest"
# Qt 6.11 ships optional SQL drivers that linuxdeployqt probes but we do
# not bundle. Remove them so deploy does not fail on missing vendor libs.
rm -rf "${QT_ROOT_DIR}/plugins/sqldrivers"
cp install/usr/share/icons/hicolor/scalable/apps/io.github.mberrys.Loop-pdf.svg install/io.github.mberrys.Loop-pdf.svg
bash "$GITHUB_WORKSPACE/loop/scripts/ci/download_verified.sh" \
--gh-asset "probonopd/linuxdeployqt" \
"$LINUXDEPLOYQT_ASSET_ID" \
deploy.AppImage \
"$LINUXDEPLOYQT_SHA256"
chmod +x deploy.AppImage
./deploy.AppImage install/usr/share/applications/io.github.mberrys.Loop-pdf.desktop -executable-dir=install/usr/bin -extra-plugins=iconengines,imageformats,texttospeech
./deploy.AppImage --appimage-extract-and-run \
install/usr/share/applications/io.github.mberrys.Loop-pdf.desktop \
-executable-dir=install/usr/bin \
-extra-plugins=iconengines,imageformats,texttospeech 2>&1 | tee "$evidence_dir/linuxdeployqt.txt"

- name: Prepare GPG home
if: vars.SIGN_APPIMAGE == 'true'
Expand Down
58 changes: 51 additions & 7 deletions .github/workflows/WindowsInstall.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,17 +185,16 @@ jobs:
cd vcpkg
.\bootstrap-vcpkg.bat -disableMetrics
.\vcpkg integrate install
set VCPKG_ROOT=${env:GITHUB_WORKSPACE}\vcpkg\
set "VCPKG_BINARY_SOURCES=clear;files,${env:GITHUB_WORKSPACE}\vcpkg\archives,readwrite"
"VCPKG_BINARY_SOURCES=clear;files,$env:GITHUB_WORKSPACE\vcpkg-binary-cache,readwrite" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: 'VCPKG: Cache vcpkg dependencies'
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
./vcpkg/downloads
./vcpkg/packages
./vcpkg/installed
./vcpkg/archives
./vcpkg_installed
./vcpkg-binary-cache
key: ${{ runner.os }}-vcpkg-v2-${{ hashFiles('**/vcpkg.json', '**/vcpkg-configuration.json') }}
restore-keys: |
${{ runner.os }}-vcpkg-v2-
Expand Down Expand Up @@ -252,11 +251,56 @@ jobs:
shell: pwsh
run: |
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DCMAKE_VCPKG_BUILD_TYPE=Release -DLOOP_INSTALL_QT_DEPENDENCIES=ON -DLOOP_INSTALL_DEPENDENCIES=ON -DCMAKE_TOOLCHAIN_FILE="${env:GITHUB_WORKSPACE}\vcpkg\scripts\buildsystems\vcpkg.cmake" -DLOOP_QT_ROOT="${env:QT_ROOT_DIR}" -DLOOP_INSTALL_MSVC_REDISTRIBUTABLE=ON -DLOOP_INSTALL_PREPARE_WIX_INSTALLER=ON -DLOOP_INSTALL_TO_USR=ON -DLOOP_LOOP_DISTRIBUTION=ON -DLOOP_PLUGIN_OCR=OFF -DLOOP_BUNDLE_OCR_SERVICE=OFF -DLOOP_BUILD_PRODUCT_QUICK_A11Y_SMOKE=ON
cmake --build build --target release_translations --config Release -j6
cmake --build build --config Release -j6
ctest --test-dir build -C Release --output-on-failure
cmake --build build --target LoopEditor PdfTool ProductQuickAccessibilitySmoke release_translations --config Release -j6
cmake --install build --config Release
.\scripts\verify-loop-surface.ps1 -InstallDir "${env:GITHUB_WORKSPACE}\loop\build\install\usr\bin" -Profile loop-release -BuildDir .\build -InstallManifestPath .\build\install_manifest.txt

- name: Deploy Qt runtime closure to staged install tree
working-directory: loop
shell: pwsh
run: |
$evidenceDir = Join-Path $env:RUNNER_TEMP "loop-package-boundary-windows"
New-Item -ItemType Directory -Force -Path $evidenceDir | Out-Null
$installBin = Join-Path $env:GITHUB_WORKSPACE "loop\build\install\usr\bin"
$windeployqt = Join-Path $env:QT_ROOT_DIR "bin\windeployqt.exe"
if (-not (Test-Path -LiteralPath $windeployqt)) {
throw "Qt deployment tool was not found: $windeployqt"
}

foreach ($name in @("LoopEditor.exe", "PdfTool.exe")) {
$target = Join-Path $installBin $name
if (-not (Test-Path -LiteralPath $target)) {
throw "Expected staged executable was not found: $target"
}
$output = @(& $windeployqt --release --no-compiler-runtime --no-translations `
--qmldir (Join-Path $env:GITHUB_WORKSPACE "loop\LoopEditor\qml") `
--dir $installBin $target 2>&1)
$exitCode = $LASTEXITCODE
$output | Tee-Object -FilePath (Join-Path $evidenceDir "windeployqt-$name.txt")
if ($exitCode -ne 0) {
throw "windeployqt failed for $name with exit code $exitCode"
}
}

$builtLoopQuick = Join-Path $env:GITHUB_WORKSPACE "loop\build\LoopEditor\Loop\Quick"
$qmlLoopQuick = Join-Path $installBin "qml\Loop\Quick"
if (-not (Test-Path -LiteralPath $builtLoopQuick)) {
throw "Built Loop.Quick QML module was not found: $builtLoopQuick"
}
New-Item -ItemType Directory -Force -Path (Split-Path -Parent $qmlLoopQuick) | Out-Null
Copy-Item -Recurse -Force -LiteralPath $builtLoopQuick -Destination $qmlLoopQuick

# The clean installed-artifact smoke intentionally removes developer
# Qt environment variables. Make the staged tree self-describing so
# Qt resolves its bundled QML imports and plugins without the runner's
# Qt installation.
@"
[Paths]
Prefix=.
Plugins=.
Qml2Imports=qml
"@ | Set-Content -LiteralPath (Join-Path $installBin "qt.conf") -Encoding ascii
Copy-Item -LiteralPath (Join-Path $installBin "qt.conf") -Destination (Join-Path $evidenceDir "qt.conf")
env:
VCToolsRedistDir: ${{ env.VCToolsRedistDir }}
VSCMD_ARG_TGT_ARCH: ${{ env.VSCMD_ARG_TGT_ARCH }}
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ on:
push:
branches:
- dev
- unstable
- stable
pull_request:
branches:
- dev
- unstable
workflow_dispatch:

concurrency:
Expand Down Expand Up @@ -41,6 +43,10 @@ jobs:
python3 scripts/ci/check_phase5_residue.py
- name: Verify unmanaged async launch allowlist
run: python3 scripts/ci/check_unmanaged_async.py
- name: Verify interaction trace corpus
run: |
python3 -m unittest scripts.ci.test_check_interaction_traces -q
python3 scripts/ci/check_interaction_traces.py --corpus-only
- name: Verify semantic-trust source boundaries
run: python3 scripts/ci/test_check_trust_contract_sources.py && python3 scripts/ci/check_trust_contract_sources.py
- name: Verify generated dependency paths are untracked
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ name: "CodeQL Advanced"

on:
push:
branches: [ "dev", "stable" ]
branches: [ "dev", "unstable", "stable" ]
pull_request:
branches: [ "dev", "stable" ]
branches: [ "dev", "unstable", "stable" ]
schedule:
- cron: '31 16 * * 4'

Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ on:
branches:
- stable
- dev
- unstable
pull_request:
branches:
- stable
- dev
- unstable
workflow_dispatch:

permissions:
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ Repository: `studio-berry/loop`; version: `0.2.0-alpha`; language: `C++20`; mini

## Branches and safety

- Integration: `dev`; release/default: `stable`; topic branches start from `dev`.
- Protected branches: `dev`, `stable`. Do not commit, push, merge, force-push, or rewrite history without approval.
- Integration: `dev`; qualification: `unstable`; release/default: `stable`; topic branches start from `dev`. Promotion: `dev` → `unstable` → `stable`.
- Protected branches: `unstable`, `stable`. Do not commit, push, merge, force-push, or rewrite history without approval.
- Keep private data, credentials, logs, scratch plans, and build artifacts outside the repository. Do not edit vendored dependencies unless explicitly scoped.

## Autonomous verification budget
Expand Down
3 changes: 3 additions & 0 deletions LoopEditor/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ add_library(LoopEditorQuick STATIC
editorhost.h
focusrestoration.cpp
focusrestoration.h
quickdocumentmodel.cpp
quickdocumentmodel.h
)

qt_add_qml_module(LoopEditorQuick
Expand All @@ -38,6 +40,7 @@ qt_add_qml_module(LoopEditorQuick
QML_FILES
qml/Main.qml
qml/Workspace.qml
qml/DocumentPane.qml
qml/CanvasPane.qml
qml/PreflightPane.qml
qml/InspectorPane.qml
Expand Down
Loading
Loading