Commit Graph
82 Commits
Author SHA1 Message Date
q792602257 d551a36f04 build(workspace): verify member wheel ownership 2026-07-12 14:21:39 +08:00
q792602257 d2f9567909 docs(workspace): document uv member workflows 2026-07-12 14:17:59 +08:00
q792602257 5db68bfa0d test(workspace): verify member scoped commands 2026-07-12 14:16:39 +08:00
q792602257 2d7ea87d74 test(workspace): verify locked clean sync 2026-07-12 14:15:51 +08:00
q792602257 77a27dece3 build(workspace): lock workspace dependencies 2026-07-12 14:14:56 +08:00
q792602257 351b2c6637 test(workspace): verify distribution boundaries 2026-07-12 14:14:09 +08:00
q792602257 00bf5ee428 test(workspace): enforce cloud package ownership 2026-07-12 14:12:51 +08:00
q792602257 bfd56fd2da refactor(cloud): move package into workspace member 2026-07-12 14:11:51 +08:00
q792602257 07b7c9fc48 build(workspace): link cloud platform to runtime 2026-07-12 14:09:54 +08:00
q792602257 b739f6d175 build(workspace): add cloud platform member 2026-07-12 14:09:08 +08:00
q792602257 10df245f66 build(workspace): initialize uv workspace root 2026-07-12 14:08:03 +08:00
q792602257 a868dd5fc8 chore(workspace): record packaging migration baseline 2026-07-12 14:06:54 +08:00
q792602257andClaude Sonnet 5 635ed91041 docs(macos-setup): add macOS migration and real iPhone control guide
Documents moving the repo from Windows/other dev machines to macOS and
driving a real iPhone end-to-end via Appium + WebDriverAgent: Xcode/Appium
toolchain setup, WDA signing (using the extra_capabilities passthrough
already supported by WDADriverConfig), minimal real-device verification,
and starting a Runtime API that explicitly registers and connects the
device (neither the Console nor REST API currently expose a
connect/disconnect endpoint). Also covers multi-device port allocation,
common failure modes, and a completion checklist. README gains a pointer
to it under a new "Operator Guides" section.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 13:49:57 +08:00
q792602257andClaude Sonnet 5 61ff3b425d feat(agent-runtime): add LLM-driven AI Planner with dual-provider tool calling
Replaces the stub Planner's fixed describe_screen/[] behavior with a real
decision-maker: AIPlanner uses native tool/function calling (Anthropic or
OpenAI, pluggable via AI_PLANNER_PROVIDER) to select exactly one grounded
action per turn, with an explicit finish_task(success, reason) tool for
completion/failure instead of an ambiguous "no tool call" signal. Default
disabled (AI_PLANNER_ENABLED=false) and additive; TaskRunner falls back to
the existing stub Planner unchanged when disabled.

Amends CONSTITUTION.md's Perception Boundary with one narrow exception:
only the AI Planner may receive the current step's raw screenshot bytes
alongside Scene, for vision-grounded coordinate grounding. Also fixes a
latent gap in TaskRunner.run(): observe/plan exceptions are now caught per
iteration and turned into a failed task with a failure_reason, instead of
propagating uncaught.

openspec change: ai-planner-runtime.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 13:48:50 +08:00
q792602257andClaude Opus 4.6 b94abde92a feat(skill-catalog-subscription): synced catalog + HTTP sync + MCP tools
Consumes the external Subscription Platform as source of truth for skill
content; reuses skills_learning domain models (extended with KnowledgeSkill)
and workflow.skill_exec resolver. HTTP/MCP deps land in api/ per
CONSTITUTION.md; synced skills use a physically separate SQLite file
(tasks/skills.sqlite3) to preserve the skill-authoring capability boundary.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-07 10:33:23 +08:00
q792602257 763c1b2299 test(perception-provider): cover NullPerceptionProvider/DefaultPerceptionProvider directly
Existing tests only exercised perception.scene_builder.build_scene()
directly or substituted a FakePerceptionProvider, so the real provider
port classes had no direct coverage. Both were already correct on
manual inspection; this closes the coverage gap.

openspec: perception-provider capability, archived change device-agent-runtime-foundation
2026-07-07 08:31:14 +08:00
q792602257 a279441aee fix(skill-versioning): consume divergence_tolerance, replace vacuous catalog-isolation guard
- divergence_tolerance was loaded from config but diff_flow_versions
  never consulted it, so structural_divergence was always plain
  sequence-equality regardless of the configured tolerance. Now
  actually applied per design.md D4.
- The skill-catalog-subscription isolation guard test asserted
  'skills.catalog' not in sys.modules, which is vacuously true since
  that module doesn't exist anywhere yet. Replaced with a real check
  against store.py's actual imports.

openspec: skill-versioning capability, archived change skill-learning-runtime
2026-07-07 08:31:11 +08:00
q792602257 ca5e300289 fix(semantic-scene): preserve page/intents when all widgets are dangling, drop dead exception-name set
- _with_known_widgets_only used to discard the entire SemanticScene
  (returning None) when filtering dangling-element-id widgets left an
  empty list, losing valid page/intents. Now returns a SemanticScene
  with widgets=[] instead, matching design.md's 'dropped, not a hard
  failure' intent.
- Removed _SDK_UNAVAILABLE_EXCEPTION_NAMES, dead code left over from an
  abandoned name-based exception-matching approach; the blanket except
  Exception already maps every SDK failure correctly.

openspec: semantic-scene capability, archived change semantic-scene-runtime
2026-07-07 08:31:03 +08:00
q792602257 725bf4cd9c fix(plugin-system): implement register_driver_type and stop discover() aborting on one bad manifest
- driver/registry.py never actually defined register_driver_type, so
  the plugin-system's 'driver plugin registered successfully' scenario
  was unreachable in production (only simulated via test monkeypatch).
  Added a real implementation wired into the existing driver factory
  registry.
- PluginRegistry.discover() only caught PluginValidationError/
  DuplicatePluginError, so a driver-kind manifest that failed wiring
  (DriverRegistryUnavailableError/PluginTargetResolutionError) aborted
  the whole scan, silently skipping co-located tool/skill manifests.
  Now caught and skipped per manifest instead.

openspec: plugin-system capability, archived change cloud-runtime
2026-07-07 08:31:00 +08:00
q792602257 031b929067 fix(multi-agent-collaboration): compose TaskRunner bookkeeping instead of forking it
CollaborativeTaskRunner hand-rolled its own step loop instead of
composing runtime/task.py's TaskRunner as design.md D3 requires,
silently dropping Timeline recording, WorldModel wiring,
TaskMetadataStore sync, and the on_task_succeeded/skill-synthesis
hook. Now calls TaskRunner's shared _start_world_view/
_record_step_result helpers for that bookkeeping. Also fixes
pre_observation being reused stale across steps in a multi-step plan
instead of refreshing to the prior step's post-observation.

openspec: multi-agent-collaboration capability, archived change multi-agent-runtime
2026-07-07 08:30:57 +08:00
q792602257 49ad589c2d fix(semantic-scene): move describe_screen_semantic out of the tools/ layer
tools/ is a Hexagonal inner layer that must never depend on LLM
concerns (ADR 0002), but describe_screen_semantic.py imported
semantic.enricher, which pulls in the Anthropic client by default.
Relocated the wrapper to runtime/, which is where LLM-dependent code
is allowed to live; updated the tool registry and all test imports
accordingly. No behavior change.

openspec: semantic-scene capability, archived change semantic-scene-runtime
2026-07-07 08:30:49 +08:00
q792602257 1bdc3784dc fix(device-pool): scope primary key by host and thread through capability_tags
- pooled_devices primary key changed from device_id alone to
  (host_id, device_id), so two hosts reporting the same local
  device_id no longer crash sync_host_devices() with an uncaught
  sqlite3.IntegrityError.
- Device gained a capability_tags field so DevicePool.sync_host_devices()
  can actually populate PooledDevice.capability_tags from a real host
  sync instead of always falling back to an empty list.

openspec: device-pool capability, archived change cloud-runtime
2026-07-07 08:30:47 +08:00
q792602257 a15756835c fix(workflow-orchestration): correct resume and failure-branch routing in WorkflowRunner
- Resume no longer infinite-loops when a crash occurs between
  append_step_result() and update_run() for a BranchStep: the recorded
  branch target is now read from the persisted result instead of
  recomputed as None.
- Resume no longer silently discards a recorded step failure that
  happened right before the crash; the run correctly ends failed.
- A failed step's own next_step_id (e.g. routing to a BranchStep that
  evaluates step_result_success) is now honored instead of
  unconditionally forcing the run to failed, per spec.

openspec: workflow-orchestration capability, archived change workflow-orchestration-runtime
2026-07-07 08:30:43 +08:00
q792602257 b5e68398f8 fix(world-model): scope WorldModel state per-task to prevent cross-task contamination
WorldModel routed all state through a single mutable _current_task_id,
so concurrent tasks sharing one instance could corrupt each other's
state. start_task() now returns a TaskWorldView handle scoped to that
task; TaskRunner.run() threads it through as a local variable instead
of reading self.world_model implicitly. Also extracts _start_world_view/
_record_step_result as reusable TaskRunner methods for composed runners.

openspec: world-model capability, archived change world-model-runtime
2026-07-07 08:30:36 +08:00
q792602257 8e29fcf3c2 spec 2026-07-06 23:52:53 +08:00
q792602257 d899b875ce cloud 2026-07-06 23:44:18 +08:00
q792602257 a453d9e6ba multi agent 2026-07-06 23:23:44 +08:00
q792602257 1fb62f9d45 workflow 2026-07-06 23:15:30 +08:00
q792602257 c7ae2d86ec feat: add skill learning runtime 2026-07-06 18:07:53 +08:00
q792602257 5658735bca feat: checkpoint device agent runtime milestones 2026-07-06 17:24:03 +08:00
q792602257 2d4251e98e gitignore 2026-07-06 13:32:34 +08:00
q792602257 02ef4d23f2 Implement Apex Agent MVP scaffold 2026-07-06 13:22:15 +08:00