Skip to content

L03-01: keep a partial inspection visible in the one-document Quick operator shell (#27) - #197

Merged
mberrys merged 3 commits into
devfrom
codex/issue-27-quick-operator-shell
Oct 5, 2026
Merged

mberrys merged 3 commits into
devfrom
codex/issue-27-quick-operator-shell

Conversation

@mberrys

@mberrys mberrys commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

L03-01 (#27). Keeps a missing or partial inspection visibly incomplete in the one-document Quick operator shell, and proves it in the repository's mapped proof (the quick unit lane) and in the Quick interaction smoke.

The representative journey (open a PDF, select a finding, reach its page) already shipped with the L02 slices (#22–#25) and is covered, not re-implemented. The genuine delta for #27 is the failure case: a partial/missing inspection must never read as a clear document, and progress while it runs must be observable.

Per-criterion: already satisfied vs. built here

Acceptance criterion State Proof
Operator opens a PDF already satisfied UnitTestsProductOperatorLoop::operatorLoop_replayableTraceCompletesSaveAsAndRevalidation (opens bleed-missing.pdf, asserts hasDocument()/pageCount()==1); tst_productoperatorloop.cpp:194
Sees progress built here new slot asserts preflightStateName()=="running" and an observed progressChanged signal, then progress==100; smoke incomplete fixture asserts mid-run progress==40
Sees completeness built here new slot asserts the partial run resolves to incomplete with a named operator summary and limitation; smoke asserts the same
Selects a finding and reaches its page/object already satisfied findingNavigationMovesCanvasToTheFindingPage (page 2 navigation); Quick smoke finding-navigation-fixture (region centring + stale rejection); #23
Failure case: missing/partial inspection stays visible, never a clear document built here new mapped unit slot over a real restricted run + new Quick-smoke incomplete fixture

Required proof — representative and incomplete fixtures

Exact commands and observed results (host: Windows, MSVC 14.44, Qt 6.11.1, base 0f2f7599e3e17ce4e57bfdedfce85582c8f51115):

  1. Second, independent CLI check of the incomplete fixture (the corpus restriction-pages pair), via the existing built PdfTool:

    PdfTool.exe preflight loop-preflight/testdata/fixtures/bleed-missing.pdf \
      --profile loop-preflight/testdata/profiles/test-restriction-pages.json --console-format json
    

    → status preflight-incomplete exit 8, verdict.state = "incomplete", reason_code = "unsupported-scope" — i.e. the fixture really is a partial inspection, not a clear pass.

  2. Mapped unit lane (representative + incomplete), real engine through EditorHost:

    ctest --test-dir C:/.dev/repos/loop-build-27 -R '^UnitTestsProductOperatorLoop$' --output-on-failure
    

    → 1/1 Test #12: UnitTestsProductOperatorLoop ..... Passed 23.05 sec, 100% tests passed, 0 tests failed out of 1.

    New slot in isolation (UnitTestsProductOperatorLoop.exe partialInspectionStaysVisibleAndNeverLooksLikeAClearDocument -o ...junitxml): tests=3 failures=0 errors=0, the new case passed in 2.19 s.

  3. Quick interaction smoke, software backend (representative and incomplete fixtures):

    QT_QPA_PLATFORM=offscreen QT_QUICK_BACKEND=software ProductQuickAccessibilitySmoke.exe
    

    → exit 0, and both fixtures printed:

    product-quick-a11y-smoke status=pass
    finding-navigation-fixture id=generated-two-page-region-and-identical-byte-replacement region=100,200,60,80 stale_rejected=1
    incomplete-inspection-fixture id=generated-one-page-unsupported-scope state=incomplete incomplete=1
    
  4. Quick interaction smoke, native backend (a11y surface unchanged; interaction fixtures correctly not run without the software backend): exit 0, status=pass.

Fixture / artifact identity:

  • Representative fixture: loop-preflight/testdata/fixtures/bleed-missing.pdf (1 page).
  • Incomplete fixture: bleed-missing.pdf + the corpus profile shape loop-preflight/testdata/profiles/test-restriction-pages.json (restrictions.pages="2", one bleed check) → Core unsupported-scope / incomplete; smoke counterpart is a generated one-page document with the same Core fail-closed unsupported-scope result.

Changed files

  • UnitTests/tst_productoperatorloop.cpp — one new mapped slot (real restricted run; progress, incomplete verdict, operator summary/limitation, Core's incomplete visual treatment).
  • tools/ProductQuickAccessibilitySmoke/main.cpp — new incomplete-inspection fixture in the software interaction lane, chained after the existing representative finding-navigation fixture.
  • changes/codex-issue-27-quick-operator-shell.md — fragment.
  • changes/codex-issue-27-quick-operator-shell.evidence.yaml — evidence manifest (unit:agent-policy:quick).

No Core, LoopEditor host or QML behavior changed; the QML mirror is untouched.

Lanes run / not run

  • Run: agent-policy:quick unit lane (all mapped quick tests), architecture:agent-policy:quick (check-architecture.py → architecture contracts ok), the software and native Quick smoke on this host.
  • Not run locally: the hosted linux-build / windows-build packaging lanes (dispatch on the PR), and the Windows-only native-UIA host inspection (inspect-windows-uia.ps1, --operator-native-probe) which has no workflow caller — named in the evidence manifest unresolved.
  • check-change.py result: status pass, head fd368ad2 == base 0f2f7599; 27/27 checks pass, modules: ["quick"], targets: [LoopEditor, LoopLibQuick, ProductQuickAccessibilitySmoke], tests: the ten mapped quick suites (incl. UnitTestsProductOperatorLoop), focused_tests pass, clang_tidy:tools/ProductQuickAccessibilitySmoke/main.cpp pass, format clean on both files, risk: standard, no protected paths..

Refs #27.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

…erator shell (#27)

Add the operator-journey proof that a missing or partial inspection stays
visible and never reads as a clear document, in both the mapped
product-operator-loop suite and the Quick interaction smoke.

- UnitTests/tst_productoperatorloop.cpp: run the shipped representative
  fixture (bleed-missing.pdf) under the corpus restriction-pages profile
  through the real preflight engine, and assert the observable progress,
  the incomplete verdict, the operator summary/limitation and Core's
  incomplete visual treatment (never a pass).
- tools/ProductQuickAccessibilitySmoke: add an incomplete-inspection
  fixture to the software-backend interaction smoke and chain it after the
  existing finding-navigation (representative) fixture.

The representative open/select-find/navigate journey already shipped with
the L02 slices; it is covered, not re-implemented. No Core, editor-host or
QML behavior changes.
@mberrys
mberrys force-pushed the codex/issue-27-quick-operator-shell branch from fd368ad to 2c1cd65 Compare October 4, 2026 07:55
@mberrys

mberrys commented Oct 4, 2026

Copy link
Copy Markdown
Contributor Author

Amended after the independent review pass over the seven open slices, head fd368ad2 -> 2c1cd65f.

The changelog summary said the Quick interaction smoke "accepts Core\x27s fail-closed unsupported-scope result", which reads as though the engine produced that result. The smoke injects a result built the same way; the real engine path is pinned by the unit slot that runs the representative fixture loop-preflight/testdata/fixtures/bleed-missing.pdf under the corpus restriction-pages profile. The summary now says exactly that.

Re-run at the amended head: check-architecture.py --base origin/dev --head-branch codex/issue-27-quick-operator-shell -> architecture contracts ok; check-change.py --base origin/dev --build-dir C:/.dev/repos/loop-build-27 -> status pass, head 2c1cd65f, modules [quick], 27 checks, none non-pass. The independent check of the engine path is a direct PdfTool preflight run on that fixture, which returns preflight-incomplete with exit code 8.

@mberrys
mberrys merged commit 0af5d74 into dev Oct 5, 2026
16 checks passed
@mberrys
mberrys deleted the codex/issue-27-quick-operator-shell branch October 5, 2026 22:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant