Skip to content

feat(check): add axidev-osk check and a failure notice - #47

Open
inayayousfi wants to merge 10 commits into
feat/wheel-profilefrom
feat/config-check
Open

inayayousfi wants to merge 10 commits into
feat/wheel-profilefrom
feat/config-check

Conversation

@inayayousfi

Copy link
Copy Markdown
Contributor

Stacked on #46.

axidev-osk check decodes the bundled root config without starting the app and explores every profile from its start state. In each state it runs every binding, calls every node callback and every on handler with every event its arguments allow, and checks what comes back: actions decode, key and modifier names use axidev_io's official spelling (Escape, not esc), windows and profiles exist, and state.set / state.append fit their declarations. Each problem prints once with the shortest trail of callbacks that reaches it; the command exits nonzero on a problem or when axidev_io cannot be imported.

Depth

How many state units (a variable or one map entry) may differ from the start. A profile sets check_depth (default 1), and --depth N overrides every profile. Bundled config: depth 1 about 1 s (1,800 states), depth 2 about 80 s (630,000 states). CI does not run it.

Runtime changes

  • A non-official key or modifier name now fails with action.failed naming the right spelling instead of typing.
  • action.failed and callback.failed carry a hint field telling the user to run the check; their log lines end with it.
  • New engine action state.append: adds to a declared list when it runs, so appends queued together all land.
  • std.failures: opt-in notice window (every bundled profile uses it) listing each different failure once with its repeat count until OK clears it.

Architecture

  • APP_ACTION_DECODERS in runtime/app_messages.py is the one table of app action decoders, read by the app, the check and the tests.
  • Event argument records mark their fields (runtime/event_fields.py) so the check can generate every event a handler may receive.
  • ScreenCorner and new QuitReason live in app_messages; HOT_CORNERS and QUIT_REASONS derive from them.
  • New fixed profile field check_depth, read only by the check.

inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

axidev-osk check decodes the bundled root config without starting the
app and explores every profile from the state it starts in. In each
state it runs every binding, calls every node callback and every on
handler with every event its arguments allow, and checks what comes
back: actions decode, key and modifier names use axidev_io's official
spelling, windows and profiles exist, and state.set and state.append
fit their declarations. Each problem is printed once with the shortest
trail of callbacks that reaches it, and the command exits nonzero on a
problem or when axidev_io cannot be imported.

How far it explores is the depth: how many state units (a variable or
one map entry) may differ from the start. A profile sets it with
check_depth, default 1, and --depth overrides it for every profile. On
the bundled config depth 1 takes about a second and depth 2 about 80.

At runtime nothing is checked ahead. A key name that is not the
official spelling now fails with action.failed naming the right one,
and action.failed and callback.failed carry a hint to run the check.
std.failures adds an opt-in notice window, used by every bundled
profile, that lists each different failure once with its repeat count
until OK clears it. It appends through a new state.append action, which
reads the list when it runs, so failures queued together all land.

The app's action decoders now live in one table, APP_ACTION_DECODERS,
shared by the app, the check and the tests, and ScreenCorner and the
new QuitReason are the single source of the corner and quit-reason
lists.
…d marks

inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

CHECK_HINT moves into the dispatcher, which reports action.failed, and
runtime/hints.py, which held only that constant, is deleted. one_of and
stand_in built the same field mark, so samples replaces both.
APP_ACTION_DECODERS says what it is for.

AGENTS.md maps config_check/, APP_ACTION_DECODERS, and the event field
marks, and asks for axidev-osk check after a bundled profile or the
standard library changes; the check itself is described in its modules.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings in timers, hover, pointer reports, std.lit, and the font-proof
label tests. The config check now builds timer.fired with a stand-in
timer ID and the node.pointer_* events with each of the profile's
nodes at a sample point, so handlers for them are explored like any
other event.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings in the dwell tests' wait for clicks.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings in the dwell indicator options and the close_label window value.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings in the interaction reports and gives the check the field marks
and action decoders for the new messages.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings in optional built-ins and their raw reports, std.locator, window
anchors, and report_geometry in place of report_size.

The check now feeds the new reports: hover, leaving, wheel, and
geometry for profile nodes, and every mouse button name for title-bar
and grip drags and for the close button, whose button may also be
None. std.with_handlers takes both also and failure_notice.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

The check covers what the shape audit added: window.state_changed marks
its content size, display.configuration_changed marks no screens and one
screen, and window.move_to and window.resize_to join the application's
actions, whose window the check verifies.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings the Windows mouse-button fix.
inayayousfi directed the work and made every decision.
Claude Opus 5.5, running in Claude Code, carried inayayousfi's decisions out.

Brings plain-window moves and resizes.
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