English · 日本語
Future vision¶
The overall direction Bajutsu is heading, and the one constraint every direction must respect. This page gives the strategic overview across the individual roadmap items — including how far each axis has already progressed, not just what is planned; the granular, prioritized backlog is in roadmap, and the rationale behind today's design is in
DESIGN.md. Read this to understand how the pieces fit together, then follow the links for each plan.
Related: concepts · drivers · selectors · roadmap · roadmap dashboard → Hosting
The invariant: what never changes¶
Every future direction is evaluated against the prime directives (CLAUDE.md · concepts · DESIGN §2). They stay fixed across every direction below:
- AI is the author and the failure investigator, never the judge. No future feature may put
an LLM (large language model) into the Tier-2
run/CI (continuous integration) gate. Pass/fail stays machine-checkable, always. - Determinism first. No fixed sleeps; an ambiguous selector fails fast. Every new platform, host, or authoring tool inherits this — it is not negotiable for reach or convenience.
- App-agnostic / backend-agnostic. Per-app and per-platform differences live in config and
behind the
Driver/ environment seams; the deterministic core stays the same everywhere.
The test of any roadmap item is whether it keeps AI out of the gate and the gate deterministic. If not, it belongs in Tier 1 (authoring) or triage (investigation), outside the gate, or it does not belong in Bajutsu.
Three axes of growth¶
Bajutsu expands along three independent axes. They compose (none blocks the others), and each maps to concrete pages.
Mermaid source
flowchart LR
core(["Bajutsu core<br/>deterministic · app-agnostic"])
reach["REACH<br/>more platforms / surfaces<br/>Web · Android · Flutter / hybrid<br/>→ below, §1"]
scale["SCALE & COLLABORATION<br/>hosted / self-hosted service · MCP<br/>→ roadmap: Hosting (BE-0015 / BE-0016)"]
authoring["AUTHORING & MAINTENANCE<br/>GUI editor · capture ·<br/>visual-regression · self-healing triage<br/>→ roadmap §3, §6, §10"]
core --> reach
core --> scale
core --> authoring
1. Reach — more platforms and surfaces¶
The Driver / environment / id-convention seams were built to be replaced, not just configured, so
the same deterministic core drives iOS, Android, and the Web today, with each platform adding
only its own actuator + environment + stable-id convention. iOS (idb / XCUITest), web
(Playwright), and Android (adb) backends have all landed and are validated end-to-end (see
architecture → implementation status); Flutter is the
remaining phase.
The abstraction is already platform-shaped. Only three seams are platform-specific: the
actuator (drives the UI — drivers/idb.py, drivers/adb.py, …), the environment manager
(boot / erase / launch — simctl.py on iOS, its Android counterpart), and the stable-id
convention (accessibilityIdentifier on iOS, resource-id on Android, data-testid on the web —
concepts §4). Everything else —
scenario DSL, selector resolution, machine assertions, the orchestrator, evidence, the reporter —
never names a platform. Adding one means adding a new triple, not forking the core; this pattern is the
same move the design already made for a second iOS actuator (XCUITest).
The crux is selector portability. A scenario is portable across platforms only to the extent
its selectors are by id. Each platform's native equivalent of accessibilityIdentifier maps onto
the same Selector field:
Selector field |
iOS | Android | Web |
|---|---|---|---|
id (primary) |
accessibilityIdentifier |
resource-id (Compose: testTag) |
data-testid |
label (auxiliary) |
accessibilityLabel |
content-desc / text |
accessible name / aria-label |
traits (role filter) |
UI traits | widget class | ARIA role |
The YAML selector { id: settings.reindex } is already platform-neutral — only which app-side
attribute the backend reads to satisfy it differs, and that lives entirely inside the Driver, never
in the scenario. One wrinkle: a platform's native id syntax may not reproduce the SPEC id
verbatim — Android's android:id (Views) allows neither . nor -, so stable.refresh
surfaces as stable_refresh. Rather than a hidden driver-side rewrite, the scenario keeps the
difference explicit with a list of id candidates (id: [stable.refresh, stable_refresh],
matched as an OR) — the explicit list is what lets the showcase's shared scenarios run unchanged on both Android
UI toolkits (BE-0221; see scenarios).
| Phase | Scope | Status |
|---|---|---|
| Shared abstractions | Platform-aware backend registry + Environment Protocol |
Implemented (BE-0042, BE-0009) |
| Web | Playwright; runs on the existing Linux gate, no Mac / emulator | Implemented (BE-0041, BE-0054) |
| Android | adb + UI Automator, the coordinate-driven twin of idb | Implemented (BE-0007, BE-0208, BE-0209) |
| Flutter / hybrids | Cross-rendered UIs need a semantics bridge, not a new OS actuator | Planned (BE-0008) |
Web landed before Android, even though Android is architecturally closer to idb: Web needed no
macOS and no device emulator, so it fit inside the make check / CI gate
from day one — proving the core platform-neutral at the lowest possible cost. Android then confirmed
the same lean / coordinate path on an already-generalized core, on its own emulator-backed gate.
Full per-platform detail: drivers, roadmap dashboard → Platform support.
2. Scale & collaboration — from local tool to shared service¶
bajutsu serve started as a local, single-user launcher; it now also runs as a shared service:
a cheap Linux control plane (auth, history, queue, report viewer) split from an expensive
device-worker pool, so a team runs and reviews from a browser.
- BE-0015 — public / cloud hosting and BE-0016 — self-hosting are both implemented: the control-plane ⇄ Mac-worker-pool split, a job queue, multi-org support, and the security hardening public exposure mandates. See self-hosting for running it yourself, on your own hardware, today.
- MCP (Model Context Protocol) server (BE-0017)
is implemented:
run/doctoras MCP tools and run evidence as MCP resources, so agents drive Bajutsu directly. The MCP server stays on the Tier-1 side of the boundary — agents author and investigate, the gate stays deterministic.
3. Authoring & maintenance — lower the cost of owning tests¶
The scenario is just YAML owned by humans; this axis makes writing and maintaining it cheaper without softening the gate.
- GUI (graphical user interface) editor & non-AI action capture
(BE-0012,
BE-0013) are implemented
in
bajutsu serve: visually edit scenarios, pick selectors on a screenshot, and capture real taps/types into a scenario with no LLM involved. - Visual-regression assertions (BE-0029)
are implemented: a deterministic assertion type (baseline diff,
approvepromotes a new baseline). It fits the directives because it is machine-checked, not AI-judged. - Self-healing triage (BE-0021) is
implemented: AI reads failure evidence and proposes a minimal diff, which a human reviews and
applies with
--write. The guardrail (never auto-soften a committed test) is what keeps self-healing triage inside the directives.
This axis keeps extending — e.g. the ongoing work cataloged under roadmap dashboard → Authoring experience — but the foundational capability (edit visually, capture without AI, self-heal a failure) is in place on all three fronts.
What stays fixed across all three¶
Everything in the table below is shared, deterministic, and platform-/host-neutral, and it does not fork as Bajutsu grows. This shared core is what makes the three axes independent: they extend the edges, not the core.
| Fixed core | Where |
|---|---|
| Scenario DSL (domain-specific language) & grammar | scenarios · dsl-grammar |
| Selector model & deterministic resolution | selectors |
| Machine assertions (the only judges) | assertions/ · concepts |
| observe → act → verify orchestrator | run-loop |
| Evidence subsystem (capturePolicy / manifest) | evidence |
| Reporter (manifest / JUnit / HTML) | reporting |
Config layering (defaults × targets) |
configuration |
New platforms add backends behind the Driver seam; new hosting changes where run is invoked,
not what it does; new authoring produces the same YAML. The core stays constant.
Where each axis stands¶
Web (Playwright), the MCP server, and visual-regression assertions — the near-term sequence this page once recommended — have all landed, along with both the public and self-hosted topologies of the scale axis and the GUI editor / non-AI capture piece of the authoring axis. Reach's open item is Flutter (BE-0008); the other two axes keep extending incrementally rather than converging on one big remaining piece. For what is next, the roadmap is the prioritized, living backlog — this page explains the rationale and direction, not the sequencing. When a roadmap item ships, it moves to the architecture status table; keep the three in sync.