Sync stable packaging pipeline into dev (#527 back-merge) - #531
Conversation
- LoopLibCore: pass PDFProcessingBudget to PDFTextLayoutGenerator during searchDocumentText to enforce hostile-workload limits - LoopEditor QuickOutlineModel: expose page role from PDFOutlineItem destination and route via implemented goToPage/goToOutlinePage - LoopEditor DocumentPane/Host: make searchPanelVisible one-shot via acknowledgeSearchPanel to prevent repeated reveal on presentationChanged - UnitTests: bump catalog implemented count 16 -> 25 to match shell-implemented find/layout commands added in unstable
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> Promotes `unstable` into `stable` for the 0.2.1 release line. **Merge commit:** `2ab848b7253714a735640067031eaf45f29a7d65` This is the Session 07 package-workflow SHA after PR #490 landed on `unstable`. <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-add9255c-ab75-4ce7-a6ef-326374bfe342?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-add9255c-ab75-4ce7-a6ef-326374bfe342&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div>
AppImage packaging failed because appstreamcli could not reach the legacy mberrys/Loop-pdf homepage, bugtracker, and help URLs (404). Update metainfo to the canonical studio-berry/loop repository. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Windows MSI packaging failed because sentry-cli uploaded PDBs to berry-studios/loop-pdf, which does not exist on de.sentry.io. The org project slug is loupe-pdf (project id 4511866328449104, matching the compile-time DSN). Co-authored-by: michael berry <mberrys@users.noreply.github.com>
…tract sentry-cli accepts project id 4511866328449104 (same as compile-time DSN) instead of the legacy slug, avoiding the banned product token in tracked source while still uploading to the correct berry-studios EU project. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
No Loop-named project slug exists on de.sentry.io; loop-pdf is absent and the legacy slug is policy-banned. Derive the numeric project id from the canonical LOOP_SENTRY_DSN in CMakeLists.txt instead of hardcoding slugs in workflows or tracked defaults. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
…521) <!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Session 07 packaging fixes on one branch for merge into `stable`. ### Linux AppImage AppStream metainfo URLs → `studio-berry/loop` (fixes `url-not-reachable` on legacy `mberrys/Loop-pdf`). ### Windows MSI — Sentry debug upload `loop-pdf` slug does not exist on `de.sentry.io`. The real project is id **`4511866328449104`** (matches compile-time DSN in `CMakeLists.txt`). `sentry-cli debug-files upload` accepts that numeric project id. Workflows and script default now use `4511866328449104` instead of any legacy slug, satisfying `check_loop_identity` (banned legacy product token) while uploading to the correct `berry-studios` EU project. ## Verification (local) - `python3 scripts/ci/check_loop_identity.py` — pass - `python3 -m unittest discover -s scripts/ci -p 'test_*.py'` — pass (223 tests) - `python3 scripts/ci/check_supply_chain_pins.py` — pass - `appstreamcli validate --pedantic` on appdata.xml — pass ## Scope Minimal packaging/config only. Not merged; parent handles merge + package re-dispatch. <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-9291ca40-dca3-4c3a-9911-540c440e8f37?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-9291ca40-dca3-4c3a-9911-540c440e8f37&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div>
…to cdx/session-07-package-proof
vcpkg's gperf port requires autoconf, autoconf-archive, automake, and libtool (libtoolize) from the system package manager. Without them the Linux_AppImage workflow fails at 'VCPKG: Install Project Dependencies' when building fontconfig's gperf dependency. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
The version and capabilities probes run before $pdfTool was assigned, causing Windows_MSI to fail at Validate staged install tree under Set-StrictMode. Move the Join-Path assignment above the first use. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
…to cdx/session-07-package-proof
…age-proof # Conflicts: # .github/workflows/LinuxInstall.yml
…to cdx/session-07-package-proof
Combine Linux AppImage workflow deps: keep autoconf/automake/libtool for gperf/vcpkg (#523) and libfontconfig1-dev from stable. Retain stable's VCPKG_BINARY_SOURCES cache wiring. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
…dio-berry/loop into cdx/session-07-package-proof Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Remove continue-on-error from the Sentry debug-file upload steps in WindowsInstall.yml and reusable-windows.yml. Project targeting already resolves the numeric id from LOOP_SENTRY_DSN; a 404 must fail the job instead of producing a green MSI with a skipped upload. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Install autoconf, autoconf-archive, automake, and libtool on reusable-linux and fuzz apt steps so vcpkg can build gperf via fontconfig, matching LinuxInstall.yml (#523). Fixes Release Gate linux/build and fuzz_regression failures on PR #527. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Stage libqoffscreen.so (and optional libqminimal.so) under install/usr/lib/platforms and write install/usr/bin/qt.conf before linuxdeployqt so PdfTool preflight works when the smoke harness sets QT_QPA_PLATFORM=offscreen and strips developer Qt paths. Matches the Windows MSI pattern of a self-describing staged tree and the prior Session 07 offscreen staging work that did not land on this branch. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Six test targets still linked LoopEditorQuick, which this change folded into the LoopEditor executable. CMake treats an unknown target name in target_link_libraries as a raw -l flag, so configure kept succeeding and the breakage stayed invisible until the widgets-free gate stopped failing first and the build actually reached these targets: tst_quickdocumentmodeltest.cpp:2:10: fatal error: quickdocumentmodel.h: No such file or directory LoopEditorQuick had carried its source directory as a PUBLIC include, so retiring it took the LoopEditor headers off every dependent's include path. Compile the LoopEditor sources each test needs directly into it and add the LoopEditor include root, matching how ProductQuickAccessibilitySmoke already reaches the same sources now that no library exports them. Each target gets only what its test includes, so the deliberately minimal link lines are preserved: UnitTestsDocumentViewSession keeps Core/Gui/Test with no QML engine, per architecture invariant I24. UnitTestsQuickAccessibility also drops LoopEditorQuickplugin and LoopEditorQuickplugin_init, retired with the library. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdQdPY7TZ1fQ1cvpNrpaq
Packaging only ran on workflow_dispatch with a hand-supplied source_sha, so no pull request ever proved the MSI or the AppImage. A one-character CMake path bug reached this branch and survived three days of green push CI because nothing automatic ever ran cmake --install on Windows. Add a pull_request trigger to both packaging workflows, resolving the checkout to the dispatch input or the PR head. The exact-SHA verification is unchanged and still runs on both paths: a PR head SHA is a full 40-character SHA, so the integrity check holds. Narrowing this with a paths: filter is a one-line edit if the runner cost bites. Also defuse three assertions that report ordinary work as a contract breach: - The packaging build command was pinned as an exact string, -j6 and target order included. Pin the target list instead, which is the actual contract. - counts["targets"] was pinned to a literal. It is the size of an inventory that grows with ordinary development, and validate_contract() already checks what the evidence means, so drop it. The plugin ledger and the UI form ledger are finite, so keep those but assert the set and the ledger length rather than a hand-maintained number: a thirteenth plugin now names itself instead of arriving as "13 != 12". - The supply-chain policy required a linuxdeployqt pin while the workflow contract forbade the workflows from mentioning the tool. It is no longer used, so drop the pin and its required-tools entry. ubuntu-22.04 stays pinned deliberately: it sets the AppImage glibc floor. It now carries a comment saying so, so retiring it reads as the decision it is rather than an assertion to satisfy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdQdPY7TZ1fQ1cvpNrpaq
The AppImage job now reaches packaging and installs cleanly, and fails on
the next thing: forty-odd Qt plugins reported as Loop artifacts.
product-surface: unmanifested first-party artifact:
usr/lib/qml/QtQuick/Controls/libqtquickcontrols2plugin.so
Qt names its plugins lib<something>plugin.so, and the first-party glob
lib*Plugin* is matched case-insensitively, so it claims every one of them.
What used to stop that is ignored_artifact_paths, but its patterns describe
a flat layout (qml/*, platforms/*) while the deploy script stages modules at
usr/lib/qml/<Module>/... and plugins/<type>/..., which those patterns never
match. Under linuxdeployqt none of this was in the tree at verification time,
so the mismatch could not show.
Name the deployed layout: usr/lib/qml/* and plugins/*. Loop's own plugins
install to usr/lib/loop and usr/lib/pdfplugins, so neither pattern reaches
them, and a regression test pins that in both directions.
This narrows only the first-party classification. Detection of forbidden
installed artifacts runs against every file in the tree and is not gated by
it, so the guarantee that a retired plugin cannot ship is unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UwdQdPY7TZ1fQ1cvpNrpaq
Five of the six retargeted tests build. UnitTestsShellKeyboard does not: LoopEditor/editorhost.cpp:30: LoopLibQuick/sources/loopcanvasitem.h:38:10: fatal error: QQuickItem: No such file or directory editorhost.cpp includes loopcanvasitem.h, which includes <QQuickItem>, and this target's link line names Qt6::Qml but not Qt6::Quick. It compiled before because the retired LoopEditorQuick linked Qt6::Quick PUBLIC and passed it down; LoopLibQuick does not. Naming it restores exactly the environment the target already had, and matches UnitTestsEditorHost, which compiles the same sources and builds. Qt6::Widgets stays absent, which is the invariant this file is protecting: I21 for the interaction tests and I25 for UnitTestsQuickCanvas both turn on the missing Widgets link, not on Quick. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdQdPY7TZ1fQ1cvpNrpaq
The AppImage job now builds, installs and clears both verification gates, and fails one step later: scripts/smoke-test-install.ps1:80 (Join-Path $env:ProgramFiles "share\loop\profiles") Cannot bind argument to parameter 'Path' because it is null. This step is new here; stable never ran smoke-test-install.ps1 on Linux. The script is Windows-shaped throughout -- $env:ProgramFiles, backslash path literals that become literal filenames on Linux, .exe and .dll suffixes at ten call sites, and an OCR sidecar block that invokes a .cmd mock with no Linux equivalent. Making it portable is real work with judgement calls in it, not a null guard, and it is not what this change is for. Remove the step and leave Linux where stable had it. Windows keeps its own relocated-install smoke unchanged, and Linux keeps the AppImage smoke test that runs against the packaged artifact. Cross-platform smoke coverage for the relocated Linux tree stays worth having and is filed as follow-up. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdQdPY7TZ1fQ1cvpNrpaq
…yout Three CI failures, two root causes, verified against run 33808874249/33808874196: 1. Windows MSB3191 + Linux QML No-such-file (one root): qt_add_qml_module QML_FILES used ../LoopEditor/qml/*.qml. The '..' makes Qt derive qmlcache dir ProductQuickAccessibilitySmoke_.._LoopEditor, which MSBuild rejects (MSB3191), and misplaces the embedded resource as qrc:/qt/qml/Loop/LoopEditor/qml/Main.qml so loadFromModule Loop.Quick/Main exits 2 on Linux. Fix: mirror the six QML files under ProductQuickAccessibilitySmoke/qml/ (byte-identical, LoopEditor/qml stays the single source of truth) and list them without '..'. Proven locally with Qt 6.11.1/MinGW: fixed layout configures, builds with a clean ProofSmoke_qml qmlcache dir, and loadFromModule resolves LOAD_OK; the '..' layout fails Qt file staging on Windows by construction. 2. Windows relocated/staged/MSI smoke Could not locate loop-default.json: Resolve-ProfilesDir assumed one depth and its comment named a deleted plugin owner. Fix: bounded upward walk (InstallDir + 3 ancestors x share/usr-share) covering staged bindir, relocated bindir and MSI install-root layouts, keeping the legacy ProgramFiles fallback; comment now names PdfTool as the install owner. The smoke also accepts an install root for binaries (MSI .../LOOP -> .../LOOP/usr/bin) via a resolved binDir used by every binary-relative path. 3. Relocated-tree InstallDir pointed at a phantom level: Copy-Item to a nonexistent destination copies contents directly, so the tree lands at relocated/usr/bin, not relocated/install/usr/bin. The workflow now passes the real path. Out of scope, intentionally untouched: heat already harvests the whole build/install tree (profiles reach the MSI); MSIX/ZIP pack only usr/bin because AppxManifest.xml must sit at the package root and MSIX is not Session 07 gate evidence per docs/PLATFORM_SUPPORT.md.
Bring the Session 07 package-proof work (#527) onto the integration branch. #527 was opened against stable, so dev never received any of it and still carried the manual windeployqt/linuxdeployqt staging that #527 replaced with the CMake-generated Qt deploy-script closure. Conflicts resolved in favour of stable in all three files, since dev's side is exactly the superseded approach: - .github/workflows/WindowsInstall.yml: keep the pull_request trigger so packaging runs per PR instead of only on manual dispatch. dev's only change here (#509) added a comment, not a competing trigger. - .github/workflows/LinuxInstall.yml: drop the hand-rolled 'Linux Deploy Qt' step; qt_generate_deploy_qml_app_script now stages the closure. - scripts/ci/test_workflow_contracts.py: take the inverted assertions that require the manual deploy tooling to be absent. dev's own work (the gh-243 budget exhaustion corpus and the LoopLibCore budget/preflight changes behind it) merges cleanly and is preserved. Windows_MSI is still expected to fail at the relocated-tree LoopEditor --quick-smoke step (exit -1073741819 / 0xC0000005). That failure is inherited from stable, where #527 merged with it red, and is not resolved by this merge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APUGt8sqXNZwQjki6B92S3
Merging stable into dev combined dev's budget-exhaustion corpus with stable's Loop rename contract, and three checks went red on the merge commit: source_integrity, policy, and agent-fast / build. Two leftovers, both flagged as "legacy product token": - reusable-linux.yml:79 and reusable-windows.yml:92 ran the corpus verification step with `working-directory: loupe` while checkout uses `path: loop` and every sibling step says `loop`. This was not only a token: agent-fast / build died with "An error occurred trying to start process '/usr/bin/bash' with working directory '/home/runner/work/loop/loop/loupe'. No such file or directory". - The budget-exhaustion corpus schema kind was still `loupe-processing-budget-exhaustion-corpus`. Renamed to `loop-` in the three places that carry it -- the generator constant, the manifest fixture and the test assertion. Nothing outside the repository reads it, so the three move together and schema_version stays at 2. Verified: - python3 scripts/ci/check_loop_identity.py -- passed - python3 scripts/ci/test_check_loop_identity.py -- OK - python3 -m unittest discover -s scripts/ci -p 'test_*.py' -- 227 tests, OK (this is the suite the failing `policy` check runs) - python3 scripts/budget_exhaustion/generate_corpus.py --check -- corpus up to date, 13 fixtures - clang-format --dry-run --Werror on the touched test -- clean - both reusable workflows and manifest.json re-parse Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APUGt8sqXNZwQjki6B92S3
Removing linuxdeployqt left no step to copy the desktop entry, icon, and AppRun into the install root. appimagetool aborts with 'Desktop file not found' when only usr/share/applications holds the .desktop file. Add scripts/prepare-appdir.sh and invoke it before Pack AppImage. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
- Deploy only qsqlite from the SQL driver set; optional vendor drivers (Mimer/OCI) reference libraries we do not ship and fail package-boundary inspection. - Prune non-QSQLITE drivers in prepare-appdir.sh as a belt-and-suspenders guard before AppImage packing. - Search install-root plugins/lib/qml paths before QGuiApplication starts so Windows relocated-tree smoke resolves the Qt closure without developer env. - Fix clang-format violation in pdftextlayoutgenerator.h blocking agent-fast. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Attach a parent console for --quick-smoke on Windows so QT_DEBUG_PLUGINS output from the relocated install smoke does not fault in a GUI-subsystem binary. Defer the normal-shell QQmlApplicationEngine until after the smoke path returns, install the Loop.Canvas QML plugin with the packaged import tree, and fix the clang-format violation on pdftextlayoutgenerator.h that was blocking agent-fast. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Revert install(TARGETS LoopLibQuickplugin) from LoopLibQuick, which failed Phase 5 contract validation on Windows and could not resolve the plugin artifact during Linux cmake --install. LoopEditor now copies the plugin, qmldir, and qmltypes into usr/lib/qml/Loop/Canvas with install(FILES), which Phase 5 does not treat as an unmanifested product install target. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
CI packaging builds LoopEditor explicitly but not the Loop.Canvas plugin module. install(FILES) then failed because libLoopLibQuickplugin.so was never linked. Add an explicit LoopEditor dependency on LoopLibQuickplugin. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
|
Status from my side, plus a root-cause finding on the Windows failure that I don't think has been named yet. What I fixed
The Windows failure has changed characterIt is no longer the
Why, reading the tree at
|
agent-fast / build runs scripts/agent/check-change.py, and on 63e3f5b it was the only red check left: build_ubuntu, fuzz, CodeQL, source_integrity, policy and architecture-docs all passed, so the code compiles and the tests run. The remaining failure was the format gate: format:LoopLibCore/sources/pdftextlayoutgenerator.h => fail pdftextlayoutgenerator.h:44:6: error: code should be clang-formatted The violation is not new -- the file is identically unformatted on dev and on stable. It only became blocking here because check-change.py formats the files a change *touches*, and this is the first change whose diff includes that header (the stable merge brings it in). So neither branch ever evaluated it, and this PR cannot go green while it stands. The fix is what clang-format emits, three lines, on an empty constructor body: `m_features(features) {}` becomes an opened brace pair on its own lines. No semantic change, and formatting a touched file is inside the autonomous verification budget. Verified: clang-format --dry-run --Werror clean on the file, and check-change.py --base origin/dev now reports no non-environmental failures (the build:* and focused_tests entries still fail only because this container has no configured build tree). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APUGt8sqXNZwQjki6B92S3
|
What the job actually didFrom the job's step list, not the log:
So the tree compiles; the failure is inside What the evidence JSON showsThe tail of the emitted report is unambiguous on the checks it covers:
Why I can't name itThe What I could rule out locally, running the same script against the same tree at So my best remaining hypothesis is a single What would settle it in secondsOpening the job and searching the "Prove change with agent-fast" output for Unrelated and still open: the Generated by Claude Code |
…legible Every Windows relocated-tree failure has reported an empty message: LoopEditor native Quick startup failed with exit code -1073741819: with nothing after the colon, even though the workflow step sets QT_DEBUG_PLUGINS=1 and QML_IMPORT_TRACE=1. That is not a capture bug in the script -- it is the subsystem. LoopEditor is built WIN32_EXECUTABLE ON (LoopEditor/CMakeLists.txt:74), so it is a Windows GUI-subsystem binary with no console attached. Qt's default message handler routes qDebug/qWarning/qFatal to OutputDebugString rather than stderr in that case, so `2>&1` captures nothing and the plugin/QML trace never reaches the log. Every diagnosis of this crash so far has had to work without the one thing that would explain it. QT_FORCE_STDERR_LOGGING=1 makes the default handler write to stderr regardless of console attachment. Set it around the --quick-smoke invocations, saved and restored with the other Qt variables the script already scrubs, so the next run reports the actual QML module, plugin or fatal error behind the 0xC0000005. This changes no packaging or install behaviour; it only makes the existing failure legible. Also of note for whoever picks this up: PdfTool now passes the relocated smoke on 7f29bd4 (version and capabilities probes both OK). The earlier 0xC0000135 STATUS_DLL_NOT_FOUND is fixed, so the PdfTool deploy-closure theory in PR comment 5539411918 is obsolete -- the remaining blocker is the original LoopEditor Quick startup access violation. Verified: python3 -m unittest discover -s scripts/ci -p 'test_*.py' -- 227 tests OK; check_loop_identity passed; check-change.py --base origin/dev reports no non-environmental failures. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APUGt8sqXNZwQjki6B92S3
|
Correcting my earlier comment, and pushing the reason nobody has been able to read this crash. PdfTool is fixed — my previous diagnosis is obsoleteOn The The remaining blocker is the original failure: Why this crash has been undiagnosableNote what follows the colon in that message: nothing. The captured output is empty on every occurrence, even though the workflow step sets That is not the script failing to capture. What I pushed (
|
Relocated install smoke runs LoopEditor as a GUI-subsystem binary. QT_DEBUG_PLUGINS=1 makes Qt emit plugin diagnostics to a console that is not attached, which crashes with 0xC0000005 before --quick-smoke can run. Drop the debug env vars from the Windows workflow step and strip them in smoke-test-install.ps1 alongside the other developer Qt paths. Keep the Windows console attach fallback for manual diagnostics. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
agent-fast / build has been red on every commit of this branch since the stable merge. The cause, from the check-change.py evidence report: "name": "build:LoopEditorQuick", "command": ["cmake","--build",".../build","--target","LoopEditorQuick", ...], "output": "gmake: *** No rule to make target 'LoopEditorQuick'. Stop.", "reason": "exit code 2", "result": "fail", "duration_ms": 5 Exactly one of the 72 checks fails; the other 71 pass, focused_tests included (44/44). "Build project" succeeds in the same job, so nothing is actually broken -- check-change.py is asked to build a target that no longer exists and gmake refuses in 5 ms. This is merge integration damage. stable retired the LoopEditorQuick library in 78e275e ("rebuild the Quick unit tests without the retired LoopEditorQuick") and folded its QML module into the LoopEditor target (qt_add_qml_module(LoopEditor ...), LoopEditor/CMakeLists.txt:39). dev still defines the old target (add_library(LoopEditorQuick STATIC) at LoopEditor/CMakeLists.txt:25) and dev's agent-policy.json still names it. Merging the two produced a tree where the target is gone but the policy still asks for it -- which is why the check is green on dev and red here. Removing it from the quick module's target list loses no coverage: the QML module is part of LoopEditor, and LoopEditor is still in the list. Nothing else in the repository references the target. Verified: - python3 scripts/agent/generate-adapters.py --write -- "policy and generated adapters are current"; only agent-policy.json changed content - check-change.py --base origin/dev -- targets are now LoopEditor, LoopLibCore, LoopLibInteraction, LoopLibQuick, PdfTool, ProductQuickAccessibilitySmoke, UnitTests (no LoopEditorQuick), policy_adapters passes, no non-environmental failures - python3 -m unittest discover -s scripts/ci -- 227 tests OK - python3 -m unittest scripts.agent.test_check_change -- 19 tests OK Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APUGt8sqXNZwQjki6B92S3
|
Found and fixed the The failing checkExactly one of the 72 checks in the {
"name": "build:LoopEditorQuick",
"command": ["cmake", "--build", ".../build", "--target", "LoopEditorQuick", "--config", "Release"],
"output": "gmake: *** No rule to make target 'LoopEditorQuick'. Stop.",
"reason": "exit code 2",
"result": "fail",
"duration_ms": 5
}"Build project" succeeds in the same job. Nothing is broken — It's merge integration damage
Merging the two produced a tree where the target is gone but the policy still asks for it. That is exactly why this check is green on Fix (
|
Adding install-root usr/lib to QCoreApplication::libraryPaths() on Windows makes Qt treat shipped product DLLs as plugins, crashing LoopEditor --quick-smoke with 0xC0000005 before any stderr output. Resolve QML imports via dedicated paths instead of reusing libraryPaths. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
Headless relocated smoke runs LoopEditor with QT_QPA_PLATFORM=offscreen. WINDOWS-subsystem binaries crash with 0xC0000005 before Quick startup; PdfTool and ProductQuickAccessibilitySmoke already use console subsystem. Also take a minimal --quick-smoke path and rely on qt.conf beside the exe for Windows plugin discovery instead of scanning install-root plugin paths. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
windeployqt stages qoffscreen under install-root plugins/, but the Windows-only setLibraryPaths(exeDir) shortcut made Qt scan usr/bin for plugins and fault with 0xC0000005 before Quick smoke could log anything. Use packagedLibraryPaths on all platforms, skip adding usr/bin on Windows, and run --quick-smoke through the normal parser path again. Co-authored-by: michael berry <mberrys@users.noreply.github.com>
|
What it changesset(_loop_editor_win32_executable ON)
if(WIN32 AND LOOP_LOOP_DISTRIBUTION)
set(_loop_editor_win32_executable OFF)
endif()
So the condition applies to exactly one build: the release profile that produces the shipped MSI. Users who install Loop and launch the editor get a console window behind it, every launch. Dev and CI builds keep And it didn't fix the smokeOn The stated rationale — "WINDOWS-subsystem binaries crash with 0xC0000005 [under Suggested alternativeThe commit message notes that If the editor itself must be smoke-tested, gate the subsystem on a dedicated build option rather than on the release profile, so the flag that means "this is the build we ship" is never the flag that means "make it a console app". I have not reverted it: Generated by Claude Code |
Why
#527was opened againststable, notdev. Nothing ondevchanged when it merged, so the Windows MSI ondevis failing for exactly the reasons it was before —devis 59 commits behindstableand still carries the manualwindeployqt/linuxdeployqtstaging that#527replaced with the CMake-generated Qt deploy-script closure.This merges
stableintodevso the integration branch is on the current packaging pipeline.Conflicts
Three files conflicted; all resolved in favour of
stable, becausedev's side is exactly the superseded approach:.github/workflows/WindowsInstall.ymlpull_request:trigger so packaging runs per PR instead of only on manual dispatch.dev's only change here (#509) added a comment, not a competing trigger..github/workflows/LinuxInstall.ymlLinux Deploy Qtstep;qt_generate_deploy_qml_app_scriptstages the closure now.scripts/ci/test_workflow_contracts.pydev's own work — the gh-243 budget exhaustion corpus and theLoopLibCorebudget/preflight changes behind it — merges cleanly and is preserved.Verification
python3 -m unittest scripts.ci.test_workflow_contracts— 16 tests, passpython3 scripts/agent/check-change.py --base origin/dev—changelog,source_integrity,architecture_catalog,policy_adaptersand everyformat:check pass except one noted below. Thebuild:*andfocused_testschecks reportfailonly because no configured build tree exists in the agent container (/home/user/loop/build is not a directory); configuring one requires approval under the verification budget.clang_tidyisincompletefor the same reason. These are not proven and need a real build.Known open failure — not fixed here
Windows_MSI is still expected to fail at the relocated-tree
LoopEditor --quick-smokestep with exit-1073741819(0xC0000005, access violation, no output). That failure is inherited fromstable:#527's own Windows_MSI check was red on run33830959878when it merged. It got past theloop-default.jsonprofile-resolution bug it was fixing and died one step later. Diagnosing it needs a Windows runner; a dispatch on this merge's SHA is the next step.Pre-existing issue noticed
LoopLibCore/sources/pdftextlayoutgenerator.h:44failsclang-format --dry-run --Werrorondevand onstablealike, and the file here is byte-identical tostable. Left untouched deliberately — it is a protected path and reformatting it would widen this merge.🤖 Generated with Claude Code
https://claude.ai/code/session_01APUGt8sqXNZwQjki6B92S3
Generated by Claude Code