Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
9056d44
Assert the three macOS probes a runner has now measured and close the…
JE-Chen Oct 8, 2026
6284d21
Hold every task callback weakly so a running task cannot be what keep…
JE-Chen Oct 8, 2026
c15a23f
Register and unregister the WebRTC host's LAN advertiser off the GUI …
JE-Chen Oct 8, 2026
4e8e750
Give every panel and tab that holds background work its own dispose()
JE-Chen Oct 8, 2026
04947a1
Park the pages of closed tabs for a restyle and let a parked page fin…
JE-Chen Oct 8, 2026
93e78df
Deny every device while the USB ACL file fails its integrity check
JE-Chen Oct 8, 2026
2e9e354
Hold acknowledged tombstones so a machine the bucket never listed mee…
JE-Chen Oct 8, 2026
87b8026
Push a mirrored file edited in the clock tick its state was recorded in
JE-Chen Oct 8, 2026
f942763
Refuse an oversized blob before uploading it and collect the blobs no…
JE-Chen Oct 8, 2026
3670aa2
Give the Config Sync tab a section picker and the assets_server switch
JE-Chen Oct 8, 2026
61532c8
Give each thread its own UIAutomation object and move the accessibili…
JE-Chen Oct 8, 2026
4527cb8
Merge branch 'sweep4/sync' into feat/progress-sweep-4
JE-Chen Oct 8, 2026
6e15101
Shrink the list of modules that fail against the real PySide6 types f…
JE-Chen Oct 8, 2026
91d27f0
Let a stop wake the polling waits, and give MCP and ChatOps a way to …
JE-Chen Oct 8, 2026
945c80a
Keep the RBAC caller, the bound device and the heal stamp on the thre…
JE-Chen Oct 8, 2026
bcffd45
Pin why AC_llm_run takes no owner
JE-Chen Oct 8, 2026
622c77e
Merge branch 'sweep4/gui' into feat/progress-sweep-4
JE-Chen Oct 8, 2026
303d964
Merge branch 'sweep4/executor-server' into feat/progress-sweep-4
JE-Chen Oct 8, 2026
c279b4d
Record the fourth sweep: re-measured counts, update entries 34-36, co…
JE-Chen Oct 9, 2026
63825c3
Wait for the worker to register its release before asserting it ran, …
JE-Chen Oct 9, 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
11 changes: 5 additions & 6 deletions .github/workflows/platform-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,11 @@ jobs:
# holds what was measured, and a capability appearing or disappearing
# turns this red and names which one.
#
# Three probes are newer than that measurement and are only reported
# (REPORTED in the script; they print what they found and cannot fail
# this step): the click-state read-back, the by-id lookup of a minimised
# window, and the point-based `grab_logical`. The first two re-run tests
# the headless suite already has, where a skip is a pass; here it is
# printed as a skip. That is what pytest is installed for.
# Three of the probes (the click-state read-back, the by-id lookup of a
# minimised window, and the point-based `grab_logical`) were measured on
# this runner on 2026-10-09 and are asserted since. The first two re-run
# tests the headless suite already has, where a skip is a pass; here a
# skip is a failure. That is what pytest is installed for.
- run: "python -m pip install --only-binary :all: pytest==9.1.1"

- name: Verify the macOS backend against a real window server
Expand Down
7 changes: 6 additions & 1 deletion .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,11 @@ jobs:
# on 3.14 (test_execution_scope_threads.py); this runs the same three files
# on a real free-threaded interpreter with the GIL off.
#
# The same rule covers the other per-thread state kept in context variables
# -- the caller a request is served as, the device bound by use_device, the
# heal-event stamp and a run's stop token (utils/thread_bound.py) -- whose
# tests are the fourth file, test_thread_bound_context.py.
#
# The project is not pip-installed: opencv-python ships abi3 wheels only,
# which a free-threaded interpreter cannot load, and nothing these tests
# import needs it. The packages below are what importing the executor needs,
Expand Down Expand Up @@ -299,7 +304,7 @@ jobs:
env:
PYTHON_GIL: "0"
PYTHONPATH: ${{ github.workspace }}
run: '"$FT_PYTHON" -X thread_inherit_context=1 -m pytest -q -p no:cacheprovider test/unit_test/headless/test_execution_scope_threads.py test/unit_test/headless/test_execution_scope_isolation.py test/unit_test/headless/test_scope_run_level_callers.py'
run: '"$FT_PYTHON" -X thread_inherit_context=1 -m pytest -q -p no:cacheprovider test/unit_test/headless/test_execution_scope_threads.py test/unit_test/headless/test_execution_scope_isolation.py test/unit_test/headless/test_scope_run_level_callers.py test/unit_test/headless/test_thread_bound_context.py'

# Sphinx with warnings as errors. The headless suite reads every page with
# the `dummy` builder when Sphinx is installed (test_sphinx_docs_build.py),
Expand Down
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,34 @@ it shipped into a `## [x.y.z] - date` section of their own; the tag's

### Changed

- Stop: inside a stoppable run the polling waits (`AC_wait_window`,
`AC_wait_text`, the smart waits, `AC_expect_poll`, `AC_assert_eventually`,
`AC_wait_actionable` and others) end with `ExecutionStopped` as soon as a
stop is requested instead of running to their timeout. `expect_poll`,
`wait_until_app_idle`, `wait_for_unlock`, `build_verifier`,
`run_with_budget` and `TokenBucket.acquire` default their `sleep` to
`run_control.pause`.
- ChatOps: a stopped command replies "`<name>` stopped." rather than a failure
naming `ExecutionStopped`.
- USB ACL: while the file fails its integrity check `UsbAcl.decide()` denies
every device and `default_policy` reads `"deny"`, also for an instance built
with `default_policy="allow"`.
- Config sync: an acknowledged deletion is kept for 30 days
(`tombstone_hold_s=0` restores immediate collection). `HttpAssetTransport`
asks the server's blob limit once and refuses a larger file without sending
it. Blob listings carry `age_s`.
- Folder mirror: a file whose size changes at an unchanged modification time,
or whose modification time goes backwards, is now pushed.
- GUI: releasing the Remote Desktop tab (`close_tab(..., release=True)`) ends
a running WebRTC host or viewer session; TCP and WebSocket sessions keep
running. Releasing any tab stops its background work at once. Callbacks
given to `start_worker`, `connect_viewer` and `start_panel_task` are held
weakly.
- Accessibility (Windows): each calling thread gets its own UI Automation
object, with COM initialised on that thread at its first call.
- Threads: a thread started inside `authorization_scope`, `use_device`,
`heal_context` or a stoppable run no longer sees that state on builds where
threads inherit context (free-threaded Python, `-X thread_inherit_context=1`).
- Config sync: `ConfigBucket.upsert` / `remove` without `origin=` now store a
versioned entry (`{"value", "vector", "origin", ...}`) instead of the flat
value. Read values with `bucket.values(section)`, or pass `versioned=False`
Expand Down
Loading
Loading