[WORKER] Core+Android — mobile usability, offline/runtime integration and hardening loop #346

Open
opened 2026-09-08 02:03:36 +00:00 by nsaspy · 19 comments
Owner

Mission

Continuously advance Zara Core and Android with Android usability as the primary product bar. This worker owns implementation slices where mobile/runtime integration is the limiting factor and must keep the phone app useful under connected, offline, degraded and lifecycle-stressed conditions.

Stagger slot

fleet_cycle = 2h
slot = +30m

Start after Frontier Research (+00) and Cross-Repo Review (+15). Preserve the relative stagger if cadence changes.

Primary queue

  1. dependency-satisfied Core blockers raised by plugins: composition, cancellation, principal/capability isolation, install/runtime plumbing;
  2. Android product usability and current dependency-satisfied slices under #622, #152 and #194;
  3. offline-first symbolic mode: composer remains usable with no server/account/network; supported deterministic commands work locally;
  4. Compose/application shell quality, assistant-role integration, reconnect/session state, device capabilities and lifecycle hardening;
  5. Android voice edge and client-owned mic/playback integration as dependencies permit;
  6. cross-platform semantic/Prolog parity and hot-reloadable reviewed configuration;
  7. cognitive-kernel features only when existing release/dependency gates permit them.

Android-first acceptance bar

Every Android slice must consider and test, where applicable:

  • app launch with no server, no credentials and airplane-mode fixture;
  • composer/chat remains usable offline rather than becoming a disconnected tombstone;
  • small/minimum supported screen and keyboard/IME interaction;
  • rotation/configuration change, activity recreation and process-death restore;
  • background/foreground transition and reconnect storms;
  • OS permission denial/revocation while active;
  • stale event/runtime-generation fencing;
  • accessibility labels/focus/navigation and readable layouts;
  • bounded memory/thread/native-resource growth;
  • exact debug/test APK built in CI with source head recorded;
  • screenshots/Compose UI evidence for important states;
  • emulator evidence labeled honestly; hardware-only cases stay pending for human gates.

Deep-testing contract

No feature-only PR. Before merge, add the strongest relevant layers:

  1. deterministic unit/contract tests;
  2. property/fuzz tests for parsers/state machines where useful;
  3. integration tests crossing runtime/Prolog/device boundaries;
  4. Android JVM/Compose/emulator lifecycle tests;
  5. resource/repeat tests for leaks/races;
  6. full repo + Nix + Android gates at exact head.

Every discovered bug gets a deterministic regression case before repair when practical. No xfail, skip, fake-success sentinel or swallowed exception may satisfy acceptance.

Feature-expansion rule

Choose one bounded dependency-satisfied feature slice at a time. Prefer features that materially improve daily phone use: offline commands, reliable chat, activation, voice, local device actions, notifications/tasks/calendar, reconnect and clear capability/degraded state.

Current architecture

Current master permits pinned Prolog-RLM use in bounded direct-mode where explicitly designed. Prolog/typed runtime policy remains side-effect authority; model/RLM outputs are proposals until validated. Android must not fork a second unrelated assistant/runtime/memory stack.

State loop

worker = core-android
mode = RESEARCH | IMPLEMENT | REVIEW
  • RESEARCH: reconcile current source/issues/PRs and research output from #645; freeze one dependency-satisfied slice.
  • IMPLEMENT: worktree, tests first, bounded implementation, focused + full gates, PR.
  • REVIEW: self-adversarial pass focused on Android lifecycle, runtime ownership, authority, cancellation, stale state and resource behavior; independent final review belongs to #646.

Output contract

WORKER_STATE
worker: core-android
mode_used: <RESEARCH|IMPLEMENT|REVIEW>
result: <one-line outcome>
issue_or_pr: <refs or none>
head: <sha or none>
android_tests: <unit/compose/emulator/apk/resource summary>
core_tests: <summary>
plugin_handoffs: <refs or none>
blockers: <summary or none>
next_mode: <RESEARCH|IMPLEMENT|REVIEW>
next_target: <specific issue/slice>

Guardrails

  • Never commit directly to master.
  • Use current issue state + current master; stale roadmap prose never wins.
  • No arbitrary remote shell/eval/Intent capability.
  • SmartThings credentials stay server-side.
  • Never close unfinished Android/hardware acceptance because an emulator fixture passed.
  • Do not collide with the dedicated voice/model worker except at reviewed Core/Android interfaces.
## Mission Continuously advance Zara Core and Android with **Android usability as the primary product bar**. This worker owns implementation slices where mobile/runtime integration is the limiting factor and must keep the phone app useful under connected, offline, degraded and lifecycle-stressed conditions. ## Stagger slot ```text fleet_cycle = 2h slot = +30m ``` Start after Frontier Research (+00) and Cross-Repo Review (+15). Preserve the relative stagger if cadence changes. ## Primary queue 1. dependency-satisfied Core blockers raised by plugins: composition, cancellation, principal/capability isolation, install/runtime plumbing; 2. Android product usability and current dependency-satisfied slices under #622, #152 and #194; 3. offline-first symbolic mode: composer remains usable with no server/account/network; supported deterministic commands work locally; 4. Compose/application shell quality, assistant-role integration, reconnect/session state, device capabilities and lifecycle hardening; 5. Android voice edge and client-owned mic/playback integration as dependencies permit; 6. cross-platform semantic/Prolog parity and hot-reloadable reviewed configuration; 7. cognitive-kernel features only when existing release/dependency gates permit them. ## Android-first acceptance bar Every Android slice must consider and test, where applicable: - app launch with no server, no credentials and airplane-mode fixture; - composer/chat remains usable offline rather than becoming a disconnected tombstone; - small/minimum supported screen and keyboard/IME interaction; - rotation/configuration change, activity recreation and process-death restore; - background/foreground transition and reconnect storms; - OS permission denial/revocation while active; - stale event/runtime-generation fencing; - accessibility labels/focus/navigation and readable layouts; - bounded memory/thread/native-resource growth; - exact debug/test APK built in CI with source head recorded; - screenshots/Compose UI evidence for important states; - emulator evidence labeled honestly; hardware-only cases stay pending for human gates. ## Deep-testing contract No feature-only PR. Before merge, add the strongest relevant layers: 1. deterministic unit/contract tests; 2. property/fuzz tests for parsers/state machines where useful; 3. integration tests crossing runtime/Prolog/device boundaries; 4. Android JVM/Compose/emulator lifecycle tests; 5. resource/repeat tests for leaks/races; 6. full repo + Nix + Android gates at exact head. Every discovered bug gets a deterministic regression case before repair when practical. No `xfail`, skip, fake-success sentinel or swallowed exception may satisfy acceptance. ## Feature-expansion rule Choose one bounded dependency-satisfied feature slice at a time. Prefer features that materially improve daily phone use: offline commands, reliable chat, activation, voice, local device actions, notifications/tasks/calendar, reconnect and clear capability/degraded state. ## Current architecture Current `master` permits pinned Prolog-RLM use in bounded direct-mode where explicitly designed. Prolog/typed runtime policy remains side-effect authority; model/RLM outputs are proposals until validated. Android must not fork a second unrelated assistant/runtime/memory stack. ## State loop ```text worker = core-android mode = RESEARCH | IMPLEMENT | REVIEW ``` - RESEARCH: reconcile current source/issues/PRs and research output from #645; freeze one dependency-satisfied slice. - IMPLEMENT: worktree, tests first, bounded implementation, focused + full gates, PR. - REVIEW: self-adversarial pass focused on Android lifecycle, runtime ownership, authority, cancellation, stale state and resource behavior; independent final review belongs to #646. ## Output contract ```text WORKER_STATE worker: core-android mode_used: <RESEARCH|IMPLEMENT|REVIEW> result: <one-line outcome> issue_or_pr: <refs or none> head: <sha or none> android_tests: <unit/compose/emulator/apk/resource summary> core_tests: <summary> plugin_handoffs: <refs or none> blockers: <summary or none> next_mode: <RESEARCH|IMPLEMENT|REVIEW> next_target: <specific issue/slice> ``` ## Guardrails - Never commit directly to `master`. - Use current issue state + current master; stale roadmap prose never wins. - No arbitrary remote shell/eval/Intent capability. - SmartThings credentials stay server-side. - Never close unfinished Android/hardware acceptance because an emulator fixture passed. - Do not collide with the dedicated voice/model worker except at reviewed Core/Android interfaces.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: RESEARCH
result: Reconciled current master/roadmap/plugin handoffs and froze Core #400 as the next dependency-satisfied slice: add one Core-owned, authorization-preserving plugin capability composition seam with generation/stale-state fencing; do not start later Android/offline expansion while this higher-priority plugin blocker is open.
issue_or_pr: lost-rob0t/zara#400; related zara-plugins#507; Android context #622/#152/#194
head: 207e3b6893
android_tests: No new tests run in RESEARCH. Exact-head GitHub checks on master are green: android skeleton gate, build/publish Android alpha, shared-mic Ubuntu/Arch, and repository test job all completed successfully at this SHA. Android source already contains the in-repo app, portable Prolog assets, typed open_uri/open_app adapters, assistant-role/voice plumbing, and authenticated session controller; offline-first #622 remains incomplete and is not claimed done.
core_tests: No local/new tests run in RESEARCH. Current PluginRuntime source exposes config/status/RuntimeCommand dispatch/event subscription/managed workers/agent-loop advice but no Core-owned cross-plugin capability lookup/invocation seam, matching #400's blocker. Next IMPLEMENT must add RED tests first for principal/capability preservation, unavailable/disabled target, stale handle after unload/reload, caller runtime shutdown, structured failure, and no raw plugin/tool object escape; then run focused plugin API tests plus full repo/Nix/Android gates at exact head.
plugin_handoffs: zara-plugins#507 confirms zara-coding cross-plugin expansion remains blocked on lost-rob0t/zara#400; its worker explicitly refuses private imports/parallel registries. Core should unblock that consumer without importing plugin internals.
blockers: none for the frozen #400 Core slice. Guardrails retained: no Prolog-RLM runtime dependency in this Core slice; model/Prolog data cannot widen callable authority; SmartThings credentials remain server-side; Android continues to reuse shared semantic/runtime contracts.
next_mode: IMPLEMENT
next_target: lost-rob0t/zara#400 — tests-first canonical PluginRuntime capability composition contract using opaque/generation-bound Core resolution and invocation, preserving target authorization/approval/principal semantics and failing stale/unloaded handles closed.

WORKER_STATE worker: core-android mode_used: RESEARCH result: Reconciled current master/roadmap/plugin handoffs and froze Core #400 as the next dependency-satisfied slice: add one Core-owned, authorization-preserving plugin capability composition seam with generation/stale-state fencing; do not start later Android/offline expansion while this higher-priority plugin blocker is open. issue_or_pr: lost-rob0t/zara#400; related zara-plugins#507; Android context #622/#152/#194 head: 207e3b689399464de413d3faba7c2ed763168ca3 android_tests: No new tests run in RESEARCH. Exact-head GitHub checks on master are green: android skeleton gate, build/publish Android alpha, shared-mic Ubuntu/Arch, and repository test job all completed successfully at this SHA. Android source already contains the in-repo app, portable Prolog assets, typed open_uri/open_app adapters, assistant-role/voice plumbing, and authenticated session controller; offline-first #622 remains incomplete and is not claimed done. core_tests: No local/new tests run in RESEARCH. Current PluginRuntime source exposes config/status/RuntimeCommand dispatch/event subscription/managed workers/agent-loop advice but no Core-owned cross-plugin capability lookup/invocation seam, matching #400's blocker. Next IMPLEMENT must add RED tests first for principal/capability preservation, unavailable/disabled target, stale handle after unload/reload, caller runtime shutdown, structured failure, and no raw plugin/tool object escape; then run focused plugin API tests plus full repo/Nix/Android gates at exact head. plugin_handoffs: zara-plugins#507 confirms zara-coding cross-plugin expansion remains blocked on lost-rob0t/zara#400; its worker explicitly refuses private imports/parallel registries. Core should unblock that consumer without importing plugin internals. blockers: none for the frozen #400 Core slice. Guardrails retained: no Prolog-RLM runtime dependency in this Core slice; model/Prolog data cannot widen callable authority; SmartThings credentials remain server-side; Android continues to reuse shared semantic/runtime contracts. next_mode: IMPLEMENT next_target: lost-rob0t/zara#400 — tests-first canonical PluginRuntime capability composition contract using opaque/generation-bound Core resolution and invocation, preserving target authorization/approval/principal semantics and failing stale/unloaded handles closed.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Opened draft PR #659 for the first tests-first Core #400 slice: opaque generation-bound CapabilityHandle resolution/invocation in PluginRuntime plus PluginManager stale-caller/provider fencing and fail-closed approval-policy recheck. I explicitly did not wire production invocation by reaching through LangGraphRuntimeBackend private state or trusting plugin/model metadata as approval authority.
issue_or_pr: lost-rob0t/zara#400; PR #659
head: eb902a56eb
android_tests: Exact-head CI run 34102832586 started. android skeleton gate (unit/native Trealla/debug APK/secret inspection) is currently in progress; shared-mic Ubuntu/Arch jobs are also in progress. No Android product behavior changed in this slice.
core_tests: RED contract was committed first at 2cc84234e0. New tests cover opaque/no-raw-object handles, caller identity propagation, structured request copying, closed-runtime failure, invalid-handle/request rejection, and explicit unavailable resolution. Exact-head repository test job is currently running Run all tests; whitespace is green and Nix install completed. Flake/package gates remain pending in the same run.
plugin_handoffs: zara-plugins#507 remains blocked for production composition. PR #659 establishes the public/generation-fencing half of the seam but intentionally fails composition unavailable until Core has a canonical backend hook that queries ToolRegistry approval authority and executes through an authorization-preserving principal-bound path. Do not consume private Core/backend internals as a workaround.
blockers: Production backend/host invocation hook is still required before #400 can close. Existing LangGraph tool execution couples approval to turn/tool-run state; direct tool.invoke would bypass that contract. The next slice must expose a narrow Core backend executor that derives approval from canonical ToolRegistry state, preserves the backend principal, rejects approval-required calls unless routed through an explicit approved context, and never exposes raw tool/plugin objects. Current PR stays draft; no false claim that #400 or Android/offline work is complete.
next_mode: IMPLEMENT
next_target: Continue #400 on PR #659: add tests-first canonical RuntimeBackend/LangGraph composition executor + RuntimeHost wiring, including configured-approval recheck, principal ownership, stale-generation policy-change rejection, structured bounded failures, and exact-head repo/Nix/Android gates. Then REVIEW adversarially before merge.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Opened draft PR #659 for the first tests-first Core #400 slice: opaque generation-bound CapabilityHandle resolution/invocation in PluginRuntime plus PluginManager stale-caller/provider fencing and fail-closed approval-policy recheck. I explicitly did not wire production invocation by reaching through LangGraphRuntimeBackend private state or trusting plugin/model metadata as approval authority. issue_or_pr: lost-rob0t/zara#400; PR #659 head: eb902a56ebaad955b021a0bc10c9b2ef8c0e0a78 android_tests: Exact-head CI run 34102832586 started. android skeleton gate (unit/native Trealla/debug APK/secret inspection) is currently in progress; shared-mic Ubuntu/Arch jobs are also in progress. No Android product behavior changed in this slice. core_tests: RED contract was committed first at 2cc84234e04404b65a64a726403cbbfc4c27af47. New tests cover opaque/no-raw-object handles, caller identity propagation, structured request copying, closed-runtime failure, invalid-handle/request rejection, and explicit unavailable resolution. Exact-head repository test job is currently running `Run all tests`; whitespace is green and Nix install completed. Flake/package gates remain pending in the same run. plugin_handoffs: zara-plugins#507 remains blocked for production composition. PR #659 establishes the public/generation-fencing half of the seam but intentionally fails composition unavailable until Core has a canonical backend hook that queries ToolRegistry approval authority and executes through an authorization-preserving principal-bound path. Do not consume private Core/backend internals as a workaround. blockers: Production backend/host invocation hook is still required before #400 can close. Existing LangGraph tool execution couples approval to turn/tool-run state; direct `tool.invoke` would bypass that contract. The next slice must expose a narrow Core backend executor that derives approval from canonical ToolRegistry state, preserves the backend principal, rejects approval-required calls unless routed through an explicit approved context, and never exposes raw tool/plugin objects. Current PR stays draft; no false claim that #400 or Android/offline work is complete. next_mode: IMPLEMENT next_target: Continue #400 on PR #659: add tests-first canonical RuntimeBackend/LangGraph composition executor + RuntimeHost wiring, including configured-approval recheck, principal ownership, stale-generation policy-change rejection, structured bounded failures, and exact-head repo/Nix/Android gates. Then REVIEW adversarially before merge.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Advanced Core #400 on draft PR #659 with the next tests-first bounded slice: ToolRegistry now owns a canonical composed-tool execution method that accepts only structured mappings, resolves through the per-backend canonical registry, fails missing tools explicitly, and re-checks approval policy immediately before invocation so approval-required capabilities cannot be called through the composition seam.
issue_or_pr: lost-rob0t/zara#400; PR #659
head: f6644f1af6
android_tests: Exact-head CI run 34108123445 is in progress. At this checkpoint the Android skeleton gate (unit/native Trealla/debug APK/secret inspection) is running; shared-mic Arch is green and Ubuntu has completed its audio tests/probe and is finishing teardown. No Android behavior changed in this slice.
core_tests: Previous exact-head eb902a56eb CI was fully green. For this slice the RED contract was committed first at 9ed9e9d70c, covering canonical registry invocation, configured approval denial, missing-tool failure, and non-mapping rejection. GREEN is f6644f1af6. Current exact-head run 34108123445 has whitespace and Nix install green; repository Run all tests is in progress, with flake/package/screenshot gates pending behind it.
plugin_handoffs: zara-plugins#507 remains blocked from production cross-plugin calls until RuntimeHost wires PluginManager to the principal-owned RuntimeBackend/ToolRegistry seam. This slice deliberately provides the canonical registry execution primitive instead of letting PluginManager reach into LangGraph private state or call raw tools itself.
blockers: #400 is not complete. RuntimeBackend still lacks narrow public requires_approval / composed invocation hooks and RuntimeHost does not yet inject those hooks into PluginManager. PR #659 also predates current master fe6e8eee30 (the idle TTS CPU fix), so final review/merge must refresh exact-current base and rerun all gates. No Prolog-RLM runtime dependency was added; SmartThings/server-device placement is untouched.
next_mode: IMPLEMENT
next_target: Continue PR #659 with tests-first RuntimeBackend/LangGraph + RuntimeHost wiring: expose only principal-bound ToolRegistry policy/invocation methods, inject them into PluginManager, prove no cross-principal/raw-tool escape and approval-required fail-closed behavior, then refresh onto current master and run exact-head repo/Nix/Android gates before REVIEW.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Advanced Core #400 on draft PR #659 with the next tests-first bounded slice: ToolRegistry now owns a canonical composed-tool execution method that accepts only structured mappings, resolves through the per-backend canonical registry, fails missing tools explicitly, and re-checks approval policy immediately before invocation so approval-required capabilities cannot be called through the composition seam. issue_or_pr: lost-rob0t/zara#400; PR #659 head: f6644f1af600c9e3a802d1b6a0736881694bdd90 android_tests: Exact-head CI run 34108123445 is in progress. At this checkpoint the Android skeleton gate (unit/native Trealla/debug APK/secret inspection) is running; shared-mic Arch is green and Ubuntu has completed its audio tests/probe and is finishing teardown. No Android behavior changed in this slice. core_tests: Previous exact-head eb902a56ebaad955b021a0bc10c9b2ef8c0e0a78 CI was fully green. For this slice the RED contract was committed first at 9ed9e9d70c741db14132b7970a61ebc104367628, covering canonical registry invocation, configured approval denial, missing-tool failure, and non-mapping rejection. GREEN is f6644f1af600c9e3a802d1b6a0736881694bdd90. Current exact-head run 34108123445 has whitespace and Nix install green; repository `Run all tests` is in progress, with flake/package/screenshot gates pending behind it. plugin_handoffs: zara-plugins#507 remains blocked from production cross-plugin calls until RuntimeHost wires PluginManager to the principal-owned RuntimeBackend/ToolRegistry seam. This slice deliberately provides the canonical registry execution primitive instead of letting PluginManager reach into LangGraph private state or call raw tools itself. blockers: #400 is not complete. RuntimeBackend still lacks narrow public `requires_approval` / composed invocation hooks and RuntimeHost does not yet inject those hooks into PluginManager. PR #659 also predates current master fe6e8eee30d6beb153c2a399a79d325e017f2b02 (the idle TTS CPU fix), so final review/merge must refresh exact-current base and rerun all gates. No Prolog-RLM runtime dependency was added; SmartThings/server-device placement is untouched. next_mode: IMPLEMENT next_target: Continue PR #659 with tests-first RuntimeBackend/LangGraph + RuntimeHost wiring: expose only principal-bound ToolRegistry policy/invocation methods, inject them into PluginManager, prove no cross-principal/raw-tool escape and approval-required fail-closed behavior, then refresh onto current master and run exact-head repo/Nix/Android gates before REVIEW.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Advanced Core #400 on draft PR #659 with the tests-first RuntimeBackend/RuntimeHost wiring slice. Added backend-owned composition policy/invocation hooks, bound invocation to the RuntimeHost backend principal, delegated only through the canonical ToolRegistry executor, and kept PluginManager away from raw LangGraph manager/tool internals. Cross-principal calls fail before registry execution; stopped backends fail closed.
issue_or_pr: lost-rob0t/zara#400; PR #659
head: 8bc488533d
android_tests: Previous exact-head f6644f1af6 run 34108123445 completed fully green, including Android skeleton gate and shared-mic Ubuntu/Arch. New exact-head run 34113716282 is active at 8bc488533d; Arch shared-mic is green while Android skeleton, Ubuntu shared-mic, and repository test job are still in progress at this checkpoint. No Android behavior changed in this Core slice.
core_tests: Tests landed before production wiring: 307976c3cb added the backend/host composition contract and 910f02aef0 tightened host principal binding. Production commits are e4d19c916b (RuntimeBackend/LangGraph/Agent facade hooks) and 8bc488533d (RuntimeHost injection). Compare from prior green head f6644f1 shows only one new test file plus +45 backend lines and +7 host lines, with no unrelated deletions.
plugin_handoffs: zara-plugins#507 can consume the public composition seam only after #659 passes exact-head gates and adversarial review. The seam preserves generation fencing and policy re-resolution already in PluginManager, uses canonical ToolRegistry approval state, and does not expose plugin instances, mutable registries, or raw tools.
blockers: Exact-head 8bc4885 gates are still running, and PR #659 still has an older recorded base than current master fe6e8eee30. Do not merge yet. Refresh onto current master and rerun exact-head repo/Nix/Android gates before final review. No Prolog-RLM runtime dependency added; SmartThings/server-device placement untouched.
next_mode: IMPLEMENT
next_target: Finish #400/PR #659 integration gate: refresh fix/400-plugin-capability-composition onto current master fe6e8eee30, resolve only real conflicts, rerun exact-head repository/Nix/Android checks, then set next_mode REVIEW for adversarial principal/capability/cancellation/stale-generation inspection if green.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Advanced Core #400 on draft PR #659 with the tests-first RuntimeBackend/RuntimeHost wiring slice. Added backend-owned composition policy/invocation hooks, bound invocation to the RuntimeHost backend principal, delegated only through the canonical ToolRegistry executor, and kept PluginManager away from raw LangGraph manager/tool internals. Cross-principal calls fail before registry execution; stopped backends fail closed. issue_or_pr: lost-rob0t/zara#400; PR #659 head: 8bc488533d60053a3c672693e006e43ae5e5ed21 android_tests: Previous exact-head f6644f1af600c9e3a802d1b6a0736881694bdd90 run 34108123445 completed fully green, including Android skeleton gate and shared-mic Ubuntu/Arch. New exact-head run 34113716282 is active at 8bc488533d60053a3c672693e006e43ae5e5ed21; Arch shared-mic is green while Android skeleton, Ubuntu shared-mic, and repository test job are still in progress at this checkpoint. No Android behavior changed in this Core slice. core_tests: Tests landed before production wiring: 307976c3cb3417215d729551320c01b5d8654f61 added the backend/host composition contract and 910f02aef0468d666500720d40d99bdae22d30fd tightened host principal binding. Production commits are e4d19c916b0f48dcc0d88a0f748c2475fe9ab63b (RuntimeBackend/LangGraph/Agent facade hooks) and 8bc488533d60053a3c672693e006e43ae5e5ed21 (RuntimeHost injection). Compare from prior green head f6644f1 shows only one new test file plus +45 backend lines and +7 host lines, with no unrelated deletions. plugin_handoffs: zara-plugins#507 can consume the public composition seam only after #659 passes exact-head gates and adversarial review. The seam preserves generation fencing and policy re-resolution already in PluginManager, uses canonical ToolRegistry approval state, and does not expose plugin instances, mutable registries, or raw tools. blockers: Exact-head 8bc4885 gates are still running, and PR #659 still has an older recorded base than current master fe6e8eee30d6beb153c2a399a79d325e017f2b02. Do not merge yet. Refresh onto current master and rerun exact-head repo/Nix/Android gates before final review. No Prolog-RLM runtime dependency added; SmartThings/server-device placement untouched. next_mode: IMPLEMENT next_target: Finish #400/PR #659 integration gate: refresh fix/400-plugin-capability-composition onto current master fe6e8eee30d6beb153c2a399a79d325e017f2b02, resolve only real conflicts, rerun exact-head repository/Nix/Android checks, then set next_mode REVIEW for adversarial principal/capability/cancellation/stale-generation inspection if green.
Author
Owner

WORKER_STATE
mode_used: IMPLEMENT
result: Refreshed Core #400 / PR #659 onto current master without touching master. Reused GitHub's conflict-free merge result tree and created feature-branch merge commit 898188d300831d1cce361d346371a684b1e90d7d with feature head 8bc488533d60053a3c672693e006e43ae5e5ed21 as first parent and master fe6e8eee30d6beb153c2a399a79d325e017f2b02 as second parent, then fast-forwarded only fix/400-plugin-capability-composition. PR #659 is still draft/open and mergeable. Current master was re-read after the write and is unchanged at fe6e8eee30d6beb153c2a399a79d325e017f2b02.
refs: #623, roadmap #1, Core #400, PR #659, plugin handoff #507, Android PR #661, Samsung/Android #206
head: 898188d300831d1cce361d346371a684b1e90d7d
tests: No new behavior was introduced in this refresh-only slice; the branch retains its tests-first composition commits (latest recorded RED 9ed9e9d70c741db14132b7970a61ebc104367628, GREEN f6644f1af600c9e3a802d1b6a0736881694bdd90). Previous exact-head CI run 34113716282 for 8bc4885... was cancelled/incomplete, so it is not treated as green. New exact-head CI run 34119083677 for 898188d... is queued; required repo/Nix/Android gates therefore remain unproven at this head.
plugin_handoffs: #507 remains downstream of #400's canonical composition seam. Composition still stays Core-owned through opaque generation-bound handles, principal-bound RuntimeBackend/RuntimeHost hooks, and canonical ToolRegistry.invoke_composed_tool() approval re-checks; no raw tool/private manager escape was added. SmartThings credentials remain server-side. Core still has no Prolog-RLM runtime dependency. Android was intentionally not modified because roadmap/dependency order still places this Core blocker first; when Android resumes it must reuse the shared semantic/runtime contracts rather than create a duplicate runtime.
blockers: Exact-head run 34119083677 must complete successfully across repository/Nix/Android gates. Adversarial cancellation/stale-turn fencing, principal ownership/capability authorization, duplicate-runtime/insecure-fallback checks remain REVIEW work after the gate is clean. PR #659 must not be merged before that review.
next_mode: IMPLEMENT
next_target: Re-read exact-head 898188d300831d1cce361d346371a684b1e90d7d CI run 34119083677; if any required gate fails, inspect and fix that regression tests-first on the same focused PR. If all required gates are green, record the evidence and switch the following loop to REVIEW of PR #659 before any Android slice.

WORKER_STATE mode_used: IMPLEMENT result: Refreshed Core #400 / PR #659 onto current master without touching master. Reused GitHub's conflict-free merge result tree and created feature-branch merge commit `898188d300831d1cce361d346371a684b1e90d7d` with feature head `8bc488533d60053a3c672693e006e43ae5e5ed21` as first parent and master `fe6e8eee30d6beb153c2a399a79d325e017f2b02` as second parent, then fast-forwarded only `fix/400-plugin-capability-composition`. PR #659 is still draft/open and mergeable. Current master was re-read after the write and is unchanged at `fe6e8eee30d6beb153c2a399a79d325e017f2b02`. refs: #623, roadmap #1, Core #400, PR #659, plugin handoff #507, Android PR #661, Samsung/Android #206 head: `898188d300831d1cce361d346371a684b1e90d7d` tests: No new behavior was introduced in this refresh-only slice; the branch retains its tests-first composition commits (latest recorded RED `9ed9e9d70c741db14132b7970a61ebc104367628`, GREEN `f6644f1af600c9e3a802d1b6a0736881694bdd90`). Previous exact-head CI run `34113716282` for `8bc4885...` was cancelled/incomplete, so it is not treated as green. New exact-head CI run `34119083677` for `898188d...` is queued; required repo/Nix/Android gates therefore remain unproven at this head. plugin_handoffs: #507 remains downstream of #400's canonical composition seam. Composition still stays Core-owned through opaque generation-bound handles, principal-bound RuntimeBackend/RuntimeHost hooks, and canonical `ToolRegistry.invoke_composed_tool()` approval re-checks; no raw tool/private manager escape was added. SmartThings credentials remain server-side. Core still has no Prolog-RLM runtime dependency. Android was intentionally not modified because roadmap/dependency order still places this Core blocker first; when Android resumes it must reuse the shared semantic/runtime contracts rather than create a duplicate runtime. blockers: Exact-head run `34119083677` must complete successfully across repository/Nix/Android gates. Adversarial cancellation/stale-turn fencing, principal ownership/capability authorization, duplicate-runtime/insecure-fallback checks remain REVIEW work after the gate is clean. PR #659 must not be merged before that review. next_mode: IMPLEMENT next_target: Re-read exact-head `898188d300831d1cce361d346371a684b1e90d7d` CI run `34119083677`; if any required gate fails, inspect and fix that regression tests-first on the same focused PR. If all required gates are green, record the evidence and switch the following loop to REVIEW of PR #659 before any Android slice.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read refreshed Core #400 / PR #659 at exact head and found the required repository gate did not fail semantically; CI run 34119083677 hit the workflow's 30-minute job timeout while still inside scripts/test-all.sh. Android skeleton and both shared-mic jobs were green. To distinguish runner/transient slowdown from a deterministic regression without changing production code or weakening the gate, created an empty feature-branch rerun commit 5ef1b8961ec931421cb57fa8368b06f3e59dd292 pointing at the exact same tree as 898188d...; new exact-head CI run 34125242454 is active. No direct master commit and no merge.
issue_or_pr: #623; roadmap #1; Core #400; draft PR #659; plugin handoff zara-plugins#507; Android PR #661; Samsung/hardware #206
head: 5ef1b8961e
android_tests: Prior refreshed-head run 34119083677: android skeleton gate SUCCESS, shared mic Arch SUCCESS, shared mic Ubuntu SUCCESS. New exact-head run 34125242454 is in progress for the identical source tree. No Android behavior changed; #661 remains a separate UI PR and #206 remains hardware-gated by its declared dependencies.
core_tests: Run 34119083677 had whitespace + Nix setup green, then Run all tests was cancelled at the job's configured timeout-minutes: 30; flake/package/screenshot steps were therefore skipped. This is not accepted as a green gate. The same composition tree previously passed full CI before the master refresh; the refresh added only current-master changes (notably #660 TTS idle-yield fix plus Android design docs). Current PR source was re-inspected: composition remains Core-owned through opaque generation handles, PluginManager stale caller/provider fencing, principal-bound RuntimeBackend/RuntimeHost hooks, and canonical ToolRegistry.invoke_composed_tool() approval re-checks; no raw tool/private manager escape was introduced.
plugin_handoffs: zara-plugins#507 still treats lost-rob0t/zara#400 as the blocker for production cross-plugin composition and has not bypassed Core internals. SmartThings credentials remain server-side. Core has no Prolog-RLM runtime dependency in this slice. Android continues to reuse shared semantic/runtime contracts and no duplicate assistant/runtime path was added.
blockers: Exact-head run 34125242454 must finish. If it again reaches the 30-minute timeout in Run all tests, treat that as a reproducible current regression rather than raising the timeout: isolate the hanging/slow phase tests-first, with special attention to the only behavior change pulled from master since the prior green base (TtsOutputBridge._wait_for_tasks() idle sleep from #660), then fix on a focused branch/PR before returning to #659. PR #659 remains draft/unmerged; adversarial principal/capability/cancellation/stale-turn review still follows only after a clean exact-head gate.
next_mode: IMPLEMENT
next_target: Inspect exact-head CI run 34125242454 for 5ef1b896.... If green, record exact-head evidence and switch the following loop to REVIEW of PR #659. If the test job times out again, isolate the deterministic slow/hanging test phase and repair that regression tests-first without weakening CI timeouts.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read refreshed Core #400 / PR #659 at exact head and found the required repository gate did not fail semantically; CI run 34119083677 hit the workflow's 30-minute job timeout while still inside `scripts/test-all.sh`. Android skeleton and both shared-mic jobs were green. To distinguish runner/transient slowdown from a deterministic regression without changing production code or weakening the gate, created an empty feature-branch rerun commit `5ef1b8961ec931421cb57fa8368b06f3e59dd292` pointing at the exact same tree as `898188d...`; new exact-head CI run 34125242454 is active. No direct master commit and no merge. issue_or_pr: #623; roadmap #1; Core #400; draft PR #659; plugin handoff zara-plugins#507; Android PR #661; Samsung/hardware #206 head: 5ef1b8961ec931421cb57fa8368b06f3e59dd292 android_tests: Prior refreshed-head run 34119083677: `android skeleton gate` SUCCESS, shared mic Arch SUCCESS, shared mic Ubuntu SUCCESS. New exact-head run 34125242454 is in progress for the identical source tree. No Android behavior changed; #661 remains a separate UI PR and #206 remains hardware-gated by its declared dependencies. core_tests: Run 34119083677 had whitespace + Nix setup green, then `Run all tests` was cancelled at the job's configured `timeout-minutes: 30`; flake/package/screenshot steps were therefore skipped. This is not accepted as a green gate. The same composition tree previously passed full CI before the master refresh; the refresh added only current-master changes (notably #660 TTS idle-yield fix plus Android design docs). Current PR source was re-inspected: composition remains Core-owned through opaque generation handles, PluginManager stale caller/provider fencing, principal-bound RuntimeBackend/RuntimeHost hooks, and canonical `ToolRegistry.invoke_composed_tool()` approval re-checks; no raw tool/private manager escape was introduced. plugin_handoffs: zara-plugins#507 still treats lost-rob0t/zara#400 as the blocker for production cross-plugin composition and has not bypassed Core internals. SmartThings credentials remain server-side. Core has no Prolog-RLM runtime dependency in this slice. Android continues to reuse shared semantic/runtime contracts and no duplicate assistant/runtime path was added. blockers: Exact-head run 34125242454 must finish. If it again reaches the 30-minute timeout in `Run all tests`, treat that as a reproducible current regression rather than raising the timeout: isolate the hanging/slow phase tests-first, with special attention to the only behavior change pulled from master since the prior green base (`TtsOutputBridge._wait_for_tasks()` idle sleep from #660), then fix on a focused branch/PR before returning to #659. PR #659 remains draft/unmerged; adversarial principal/capability/cancellation/stale-turn review still follows only after a clean exact-head gate. next_mode: IMPLEMENT next_target: Inspect exact-head CI run 34125242454 for `5ef1b896...`. If green, record exact-head evidence and switch the following loop to REVIEW of PR #659. If the test job times out again, isolate the deterministic slow/hanging test phase and repair that regression tests-first without weakening CI timeouts.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: The identical-tree rerun for Core #400 / draft PR #659 reproduced the 30-minute repository-gate timeout, and the uploaded JUnit artifact proved this was not merely a slow runner: pytest completed 2,126 tests in ~255s and recorded 10 failures, mostly service-plugin lifecycle failures. Root cause was the new RuntimeHost composition wiring unconditionally reading backend.principal_id; valid RuntimeBackend implementations that do not support composition raise UnsupportedRuntimeCommand, causing _start_plugins() to abort before PluginManager starts. Added a focused RED regression first at 7b61c0819dbbf1924df783b15af0fa7887bfbafc, then fixed RuntimeHost at 49ed54c433058b55597b7932692d37b563a7b9c6 so composition hooks are injected only when the backend exposes a real principal; otherwise ordinary plugins still start while composition remains unavailable/fail-closed. Also corrected the composition-hook test to assert bound-method behavior/ownership rather than invalid Python bound-method object identity. No master commit and no merge.
refs: #623; roadmap #1 and its 2026-09-07 reconciliation; Core #400; draft PR #659; plugin handoff zara-plugins#507; Android UI PR #661; Samsung/Android #206
head: 49ed54c433058b55597b7932692d37b563a7b9c6
tests: Exact-head run 34125242454 for prior head 5ef1b896... completed CANCELLED at the configured 30-minute test-job timeout. Android skeleton SUCCESS, shared-mic Ubuntu SUCCESS, shared-mic Arch SUCCESS. regression-artifacts JUnit shows pytest itself reached completion in ~254.978s with 2,126 cases and 10 failures; nine failures were consistent with PluginManager never starting, and one was the invalid bound-method identity assertion. Tests-first RED commit 7b61c081... adds the unsupported-composition backend regression and repairs that assertion; GREEN commit 49ed54c4... changes only zara/runtime/host.py relative to RED (+15/-7), preserving the rest of the branch. New exact-head CI run 34130940878 is queued for 49ed54c4...; repo/Nix/package/screenshot gates are therefore not yet proven on this head.
plugin_handoffs: zara-plugins#507 remains downstream of #400. The fix does not create a synthetic principal, expose raw tools/private manager state, or weaken approval policy. Principal-capable LangGraph backends still bind composed invocation to the runtime principal and canonical ToolRegistry; unsupported backends now keep non-composition plugin lifecycle working while capability resolution/invocation stays unavailable. Android remains behind this Core blocker; PR #661 is still separate UI work and no duplicate Android runtime was introduced. SmartThings credentials remain server-side. This slice adds no Prolog-RLM runtime dependency to Core.
blockers: Exact-head run 34130940878 must complete. If the repository job still fails or hangs, inspect its fresh JUnit/artifacts and fix the remaining concrete regression tests-first without raising the CI timeout. PR #659 remains draft/unmerged. Adversarial principal/capability/cancellation/stale-generation review is still required after a clean exact-head gate.
next_mode: IMPLEMENT
next_target: Re-read exact-head CI run 34130940878 for 49ed54c433058b55597b7932692d37b563a7b9c6. If all required repository/Nix/package/Android/shared-mic gates are green, switch the following loop to REVIEW of PR #659. If not, isolate the remaining failing/hanging phase from exact-head artifacts and repair it tests-first on the same focused PR.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: The identical-tree rerun for Core #400 / draft PR #659 reproduced the 30-minute repository-gate timeout, and the uploaded JUnit artifact proved this was not merely a slow runner: pytest completed 2,126 tests in ~255s and recorded 10 failures, mostly service-plugin lifecycle failures. Root cause was the new RuntimeHost composition wiring unconditionally reading `backend.principal_id`; valid RuntimeBackend implementations that do not support composition raise `UnsupportedRuntimeCommand`, causing `_start_plugins()` to abort before PluginManager starts. Added a focused RED regression first at `7b61c0819dbbf1924df783b15af0fa7887bfbafc`, then fixed RuntimeHost at `49ed54c433058b55597b7932692d37b563a7b9c6` so composition hooks are injected only when the backend exposes a real principal; otherwise ordinary plugins still start while composition remains unavailable/fail-closed. Also corrected the composition-hook test to assert bound-method behavior/ownership rather than invalid Python bound-method object identity. No master commit and no merge. refs: #623; roadmap #1 and its 2026-09-07 reconciliation; Core #400; draft PR #659; plugin handoff zara-plugins#507; Android UI PR #661; Samsung/Android #206 head: `49ed54c433058b55597b7932692d37b563a7b9c6` tests: Exact-head run `34125242454` for prior head `5ef1b896...` completed CANCELLED at the configured 30-minute test-job timeout. Android skeleton SUCCESS, shared-mic Ubuntu SUCCESS, shared-mic Arch SUCCESS. `regression-artifacts` JUnit shows pytest itself reached completion in ~254.978s with 2,126 cases and 10 failures; nine failures were consistent with PluginManager never starting, and one was the invalid bound-method identity assertion. Tests-first RED commit `7b61c081...` adds the unsupported-composition backend regression and repairs that assertion; GREEN commit `49ed54c4...` changes only `zara/runtime/host.py` relative to RED (+15/-7), preserving the rest of the branch. New exact-head CI run `34130940878` is queued for `49ed54c4...`; repo/Nix/package/screenshot gates are therefore not yet proven on this head. plugin_handoffs: zara-plugins#507 remains downstream of #400. The fix does not create a synthetic principal, expose raw tools/private manager state, or weaken approval policy. Principal-capable LangGraph backends still bind composed invocation to the runtime principal and canonical ToolRegistry; unsupported backends now keep non-composition plugin lifecycle working while capability resolution/invocation stays unavailable. Android remains behind this Core blocker; PR #661 is still separate UI work and no duplicate Android runtime was introduced. SmartThings credentials remain server-side. This slice adds no Prolog-RLM runtime dependency to Core. blockers: Exact-head run `34130940878` must complete. If the repository job still fails or hangs, inspect its fresh JUnit/artifacts and fix the remaining concrete regression tests-first without raising the CI timeout. PR #659 remains draft/unmerged. Adversarial principal/capability/cancellation/stale-generation review is still required after a clean exact-head gate. next_mode: IMPLEMENT next_target: Re-read exact-head CI run `34130940878` for `49ed54c433058b55597b7932692d37b563a7b9c6`. If all required repository/Nix/package/Android/shared-mic gates are green, switch the following loop to REVIEW of PR #659. If not, isolate the remaining failing/hanging phase from exact-head artifacts and repair it tests-first on the same focused PR.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read the recorded IMPLEMENT target and verified the repaired Core #400 / draft PR #659 exact head is now fully green. No additional source change was justified: the prior tests-first regression fix at 49ed54c433058b55597b7932692d37b563a7b9c6 resolved the PluginManager startup regression, current master is unchanged at fe6e8eee30d6beb153c2a399a79d325e017f2b02, and PR #659 is mergeable but remains draft for the required adversarial review. Updated the PR body so it no longer falsely says RuntimeBackend/RuntimeHost wiring is still missing and now records the exact-head gate evidence and fail-closed approval limitation.
issue_or_pr: Core #400; draft PR #659; roadmap #1; Android UI PR #661; Android/offline context #622/#152/#194/#206
head: 49ed54c433058b55597b7932692d37b563a7b9c6
android_tests: Exact-head CI run 34130940878 SUCCESS. android skeleton gate passed unit tests + native Trealla + debug APK + secret inspection; shared-mic Ubuntu 24.04 SUCCESS; shared-mic Arch Linux SUCCESS. No Android source was changed in this loop; PR #661 remains separate and later Android work stays behind the Core blocker/review in roadmap order.
core_tests: Exact-head test job SUCCESS: whitespace, Run all tests, Nix flake checks, packaged Zara build, deterministic Copilot screenshots, and artifact upload all passed. Prior tests-first regression sequence remains RED 7b61c0819dbbf1924df783b15af0fa7887bfbafc -> GREEN 49ed54c433058b55597b7932692d37b563a7b9c6. Current source keeps principal-bound LangGraphRuntimeBackend composition, canonical ToolRegistry invocation/policy recheck, cross-principal rejection before registry execution, and unsupported-backend lifecycle compatibility without synthesizing a principal.
plugin_handoffs: zara-plugins#507 can treat #659 as the candidate Core unblocker after review/merge. It must still consume only the public PluginRuntime capability seam; no private backend/manager imports or parallel registry/runtime. Approval-required tools remain intentionally non-composable until a canonical approved-context contract exists. SmartThings credentials stay server-side; Core has no Prolog-RLM runtime dependency; Android continues to reuse shared semantic/runtime contracts.
blockers: No failing exact-head gate remains. The only blocker before merge/closing #400 is the mandated adversarial REVIEW of PR #659, specifically principal ownership, capability authorization, cancellation/stale-turn and generation fencing, policy-change behavior, duplicate-runtime/private-state escapes, Prolog authority, server-vs-device placement, and insecure fallbacks. PR #659 stays draft and unmerged until that review.
next_mode: REVIEW
next_target: Adversarially review draft PR #659 at exact head 49ed54c433058b55597b7932692d37b563a7b9c6. If review is clean, make it review-ready/mergeable and hand off #400 to plugins; if a concrete flaw is found, add a deterministic RED regression first and return to IMPLEMENT on the same focused PR.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read the recorded IMPLEMENT target and verified the repaired Core #400 / draft PR #659 exact head is now fully green. No additional source change was justified: the prior tests-first regression fix at `49ed54c433058b55597b7932692d37b563a7b9c6` resolved the PluginManager startup regression, current master is unchanged at `fe6e8eee30d6beb153c2a399a79d325e017f2b02`, and PR #659 is mergeable but remains draft for the required adversarial review. Updated the PR body so it no longer falsely says RuntimeBackend/RuntimeHost wiring is still missing and now records the exact-head gate evidence and fail-closed approval limitation. issue_or_pr: Core #400; draft PR #659; roadmap #1; Android UI PR #661; Android/offline context #622/#152/#194/#206 head: `49ed54c433058b55597b7932692d37b563a7b9c6` android_tests: Exact-head CI run `34130940878` SUCCESS. `android skeleton gate` passed unit tests + native Trealla + debug APK + secret inspection; shared-mic Ubuntu 24.04 SUCCESS; shared-mic Arch Linux SUCCESS. No Android source was changed in this loop; PR #661 remains separate and later Android work stays behind the Core blocker/review in roadmap order. core_tests: Exact-head `test` job SUCCESS: whitespace, `Run all tests`, Nix flake checks, packaged Zara build, deterministic Copilot screenshots, and artifact upload all passed. Prior tests-first regression sequence remains RED `7b61c0819dbbf1924df783b15af0fa7887bfbafc` -> GREEN `49ed54c433058b55597b7932692d37b563a7b9c6`. Current source keeps principal-bound `LangGraphRuntimeBackend` composition, canonical `ToolRegistry` invocation/policy recheck, cross-principal rejection before registry execution, and unsupported-backend lifecycle compatibility without synthesizing a principal. plugin_handoffs: `zara-plugins#507` can treat #659 as the candidate Core unblocker after review/merge. It must still consume only the public `PluginRuntime` capability seam; no private backend/manager imports or parallel registry/runtime. Approval-required tools remain intentionally non-composable until a canonical approved-context contract exists. SmartThings credentials stay server-side; Core has no Prolog-RLM runtime dependency; Android continues to reuse shared semantic/runtime contracts. blockers: No failing exact-head gate remains. The only blocker before merge/closing #400 is the mandated adversarial REVIEW of PR #659, specifically principal ownership, capability authorization, cancellation/stale-turn and generation fencing, policy-change behavior, duplicate-runtime/private-state escapes, Prolog authority, server-vs-device placement, and insecure fallbacks. PR #659 stays draft and unmerged until that review. next_mode: REVIEW next_target: Adversarially review draft PR #659 at exact head `49ed54c433058b55597b7932692d37b563a7b9c6`. If review is clean, make it review-ready/mergeable and hand off #400 to plugins; if a concrete flaw is found, add a deterministic RED regression first and return to IMPLEMENT on the same focused PR.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: REVIEW
result: Exact-head adversarial review found Core #400 / draft PR #659 is not merge-ready despite green CI: composed capability execution preserves principal equality and approval rechecks, but bypasses the canonical turn/cancellation plane and has a generation/lifecycle TOCTOU between caller/provider validation and actual tool execution. Posted blocking review 5133751703; PR remains draft/unmerged.
issue_or_pr: Core #400; draft PR #659; review 5133751703
refs: #623; roadmap #1 + 2026-09-07 reconciliation; Core #400; PR #659; zara-plugins worker #507 and #400 handoff comment; Android UI PR #661; offline Android #622; Android #152/#194/#206; exact-head CI run 34130940878
head: 49ed54c433058b55597b7932692d37b563a7b9c6
tests: No new tests were added in REVIEW. Exact-head CI run 34130940878 remains completed/SUCCESS at this head. Source/diff review found no cancellation context or cancellation regression in the composition path: PluginRuntime.invoke_capability() carries caller/handle/request only; PluginManager._invoke_capability() validates caller/provider generation then releases its lock; LangGraphRuntimeBackend.invoke_composed_tool() delegates to ToolRegistry.invoke_composed_tool(); the registry directly performs synchronous tool.invoke(dict(request)). The PR diff contains no cancellation coverage. Green CI therefore does not prove the required cancellation/stale-in-flight contract.
android_tests: No Android source changed in this REVIEW. Existing exact-head run 34130940878 remains green for Android skeleton unit/native Trealla/debug APK/secret inspection plus Ubuntu/Arch shared-mic jobs. PR #661 remains separate UI work and #622 offline-first work remains later in dependency order.
core_tests: No new Core tests in REVIEW. Existing principal ownership check, approval-policy re-resolution, approval-required fail-closed behavior, malformed/missing request handling, unsupported-backend compatibility, and stale-handle-at-entry generation checks were inspected and remain directionally sound. Blocking gap is cancellation/in-flight lifecycle fencing rather than those already-covered contracts.
plugin_handoffs: zara-plugins#507 remains blocked on #400 for production composition. The #400 handoff explicitly requires zara-shell test.run / build.run composition to preserve cancellation policy; current naked registry invocation cannot carry that contract. Plugins must continue using only the public Core seam and must not import private backends/tools or create a parallel registry/runtime. Approval-required tools remain intentionally non-composable until a canonical approved-context contract exists.
blockers: Add deterministic RED coverage for (1) cancellation/stale-turn fencing of an in-flight composed invocation, (2) caller/provider stop or unload after handle validation but before/during execution, and (3) the intended caller-capability authorization model. Then minimally route composition through a Core-owned cancellable execution context tied to runtime/generation ownership instead of naked ToolRegistry.tool.invoke, while preserving principal equality, approval rechecks and fail-closed behavior. Keep SmartThings credentials server-side; add no Core Prolog-RLM runtime dependency in this slice; Android must continue reusing shared semantic/runtime contracts.
next_mode: IMPLEMENT
next_target: Continue #400 on draft PR #659 tests-first: reproduce cancellation and stop/unload races, add a bounded Core-owned composition execution/cancellation context with generation ownership, explicitly prove or enforce caller-capability authorization, then rerun focused tests plus full exact-head repo/Nix/Android/shared-mic gates before returning to REVIEW.

WORKER_STATE worker: core-android mode_used: REVIEW result: Exact-head adversarial review found Core #400 / draft PR #659 is **not merge-ready** despite green CI: composed capability execution preserves principal equality and approval rechecks, but bypasses the canonical turn/cancellation plane and has a generation/lifecycle TOCTOU between caller/provider validation and actual tool execution. Posted blocking review `5133751703`; PR remains draft/unmerged. issue_or_pr: Core #400; draft PR #659; review 5133751703 refs: #623; roadmap #1 + 2026-09-07 reconciliation; Core #400; PR #659; zara-plugins worker #507 and #400 handoff comment; Android UI PR #661; offline Android #622; Android #152/#194/#206; exact-head CI run 34130940878 head: `49ed54c433058b55597b7932692d37b563a7b9c6` tests: No new tests were added in REVIEW. Exact-head CI run `34130940878` remains completed/SUCCESS at this head. Source/diff review found no cancellation context or cancellation regression in the composition path: `PluginRuntime.invoke_capability()` carries caller/handle/request only; `PluginManager._invoke_capability()` validates caller/provider generation then releases its lock; `LangGraphRuntimeBackend.invoke_composed_tool()` delegates to `ToolRegistry.invoke_composed_tool()`; the registry directly performs synchronous `tool.invoke(dict(request))`. The PR diff contains no cancellation coverage. Green CI therefore does not prove the required cancellation/stale-in-flight contract. android_tests: No Android source changed in this REVIEW. Existing exact-head run `34130940878` remains green for Android skeleton unit/native Trealla/debug APK/secret inspection plus Ubuntu/Arch shared-mic jobs. PR #661 remains separate UI work and #622 offline-first work remains later in dependency order. core_tests: No new Core tests in REVIEW. Existing principal ownership check, approval-policy re-resolution, approval-required fail-closed behavior, malformed/missing request handling, unsupported-backend compatibility, and stale-handle-at-entry generation checks were inspected and remain directionally sound. Blocking gap is cancellation/in-flight lifecycle fencing rather than those already-covered contracts. plugin_handoffs: `zara-plugins#507` remains blocked on #400 for production composition. The #400 handoff explicitly requires `zara-shell` `test.run` / `build.run` composition to preserve cancellation policy; current naked registry invocation cannot carry that contract. Plugins must continue using only the public Core seam and must not import private backends/tools or create a parallel registry/runtime. Approval-required tools remain intentionally non-composable until a canonical approved-context contract exists. blockers: Add deterministic RED coverage for (1) cancellation/stale-turn fencing of an in-flight composed invocation, (2) caller/provider stop or unload after handle validation but before/during execution, and (3) the intended caller-capability authorization model. Then minimally route composition through a Core-owned cancellable execution context tied to runtime/generation ownership instead of naked `ToolRegistry.tool.invoke`, while preserving principal equality, approval rechecks and fail-closed behavior. Keep SmartThings credentials server-side; add no Core Prolog-RLM runtime dependency in this slice; Android must continue reusing shared semantic/runtime contracts. next_mode: IMPLEMENT next_target: Continue #400 on draft PR #659 tests-first: reproduce cancellation and stop/unload races, add a bounded Core-owned composition execution/cancellation context with generation ownership, explicitly prove or enforce caller-capability authorization, then rerun focused tests plus full exact-head repo/Nix/Android/shared-mic gates before returning to REVIEW.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Advanced Core #400 / draft PR #659 with a tests-first fix for the REVIEW-discovered provider-unload TOCTOU. Added deterministic RED coverage proving PluginManager.stop() must not overtake an already-accepted composed invocation, then changed PluginManager._invoke_capability() so caller/provider generation validation, approval-policy re-resolution, and canonical invocation remain under the manager lifecycle lock. This removes the validation->execution gap without exposing raw tools/private runtime state or weakening approval policy. Cancellation/stale-turn propagation is still unresolved, so PR #659 remains draft/unmerged.
issue_or_pr: Core #400; draft PR #659; blocking review 5133751703
refs: #623; roadmap #1 + 2026-09-07 reconciliation; Core #400; PR #659; zara-plugins#507 handoff; Android UI PR #661; offline Android #622; Android #152/#194/#206
head: 210b4088e036c511070aa8d3dea5ad106b1e4601
android_tests: No Android source changed. Previous exact-head 49ed54c4... Android skeleton + Ubuntu/Arch shared-mic gates were green. At this checkpoint GitHub has not yet materialized a workflow/check run for new exact head 210b4088..., so repo/Nix/Android gates are pending and are not claimed green.
core_tests: Tests-first RED commit ade56b105b02e4e143d1eb74557b38032d969096 adds test_inflight_composed_invocation_fences_provider_unload: a blocking canonical invocation starts, manager stop is requested concurrently, and the test requires stop/unload to remain blocked until invocation completes. GREEN commit 210b4088e036c511070aa8d3dea5ad106b1e4601 keeps the manager RLock across accepted invocation validation, approval recheck, and invoker return. This directly closes the reviewed generation/lifecycle TOCTOU. No local shell/Nix execution was available in this connector-only loop; exact-head Actions were queried immediately after push and had not appeared yet.
plugin_handoffs: zara-plugins#507 remains blocked for production composition. The lifecycle race is now fenced, but zara-shell test.run/build.run still cannot inherit a canonical turn/cancellation context through PluginRuntime.invoke_capability(). Plugins must continue using only the public Core seam; no private backend/tool imports or parallel registry/runtime. SmartThings credentials stay server-side. Core gains no Prolog-RLM runtime dependency. Android remains behind this Core blocker and continues to reuse shared semantic/runtime contracts.
blockers: The REVIEW cancellation finding remains: PluginRuntime.invoke_capability() still has no turn/cancellation context, and canonical ToolRegistry.invoke_composed_tool() remains synchronous. Add deterministic RED coverage for cancellation/stale-turn fencing and caller stop during in-flight execution, then introduce the smallest Core-owned cancellable execution context tied to runtime/generation ownership without allowing model/plugin metadata to widen authority. Caller capability authorization also still needs an explicit proven contract. New exact-head repo/Nix/Android/shared-mic gates must run before REVIEW.
next_mode: IMPLEMENT
next_target: Continue #400 on PR #659 tests-first: add a bounded Core-owned composition execution/cancellation context that can be invalidated by caller shutdown/turn cancellation and fences stale results, explicitly prove/enforce caller-capability authorization, then run focused + full exact-head repository/Nix/Android/shared-mic gates before returning to REVIEW.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Advanced Core #400 / draft PR #659 with a tests-first fix for the REVIEW-discovered provider-unload TOCTOU. Added deterministic RED coverage proving `PluginManager.stop()` must not overtake an already-accepted composed invocation, then changed `PluginManager._invoke_capability()` so caller/provider generation validation, approval-policy re-resolution, and canonical invocation remain under the manager lifecycle lock. This removes the validation->execution gap without exposing raw tools/private runtime state or weakening approval policy. Cancellation/stale-turn propagation is still unresolved, so PR #659 remains draft/unmerged. issue_or_pr: Core #400; draft PR #659; blocking review 5133751703 refs: #623; roadmap #1 + 2026-09-07 reconciliation; Core #400; PR #659; zara-plugins#507 handoff; Android UI PR #661; offline Android #622; Android #152/#194/#206 head: `210b4088e036c511070aa8d3dea5ad106b1e4601` android_tests: No Android source changed. Previous exact-head `49ed54c4...` Android skeleton + Ubuntu/Arch shared-mic gates were green. At this checkpoint GitHub has not yet materialized a workflow/check run for new exact head `210b4088...`, so repo/Nix/Android gates are pending and are not claimed green. core_tests: Tests-first RED commit `ade56b105b02e4e143d1eb74557b38032d969096` adds `test_inflight_composed_invocation_fences_provider_unload`: a blocking canonical invocation starts, manager stop is requested concurrently, and the test requires stop/unload to remain blocked until invocation completes. GREEN commit `210b4088e036c511070aa8d3dea5ad106b1e4601` keeps the manager RLock across accepted invocation validation, approval recheck, and invoker return. This directly closes the reviewed generation/lifecycle TOCTOU. No local shell/Nix execution was available in this connector-only loop; exact-head Actions were queried immediately after push and had not appeared yet. plugin_handoffs: zara-plugins#507 remains blocked for production composition. The lifecycle race is now fenced, but `zara-shell` `test.run`/`build.run` still cannot inherit a canonical turn/cancellation context through `PluginRuntime.invoke_capability()`. Plugins must continue using only the public Core seam; no private backend/tool imports or parallel registry/runtime. SmartThings credentials stay server-side. Core gains no Prolog-RLM runtime dependency. Android remains behind this Core blocker and continues to reuse shared semantic/runtime contracts. blockers: The REVIEW cancellation finding remains: `PluginRuntime.invoke_capability()` still has no turn/cancellation context, and canonical `ToolRegistry.invoke_composed_tool()` remains synchronous. Add deterministic RED coverage for cancellation/stale-turn fencing and caller stop during in-flight execution, then introduce the smallest Core-owned cancellable execution context tied to runtime/generation ownership without allowing model/plugin metadata to widen authority. Caller capability authorization also still needs an explicit proven contract. New exact-head repo/Nix/Android/shared-mic gates must run before REVIEW. next_mode: IMPLEMENT next_target: Continue #400 on PR #659 tests-first: add a bounded Core-owned composition execution/cancellation context that can be invalidated by caller shutdown/turn cancellation and fences stale results, explicitly prove/enforce caller-capability authorization, then run focused + full exact-head repository/Nix/Android/shared-mic gates before returning to REVIEW.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read the latest #623 state, roadmap #1, Core #400/draft PR #659, Android #622/PR #661, exact-head CI, and the current composition source. The previous lifecycle-fencing GREEN 210b4088e036c511070aa8d3dea5ad106b1e4601 was not actually green: exact-head run 34144988693 failed its repository test job, and the regression artifact showed the existing tests-first unload race case deadlocked because _invoke_capability() held the manager RLock across the synchronous tool call while manager.stop() blocked the asyncio runtime trying to acquire that lock. Kept the existing deterministic RED (ade56b105b02e4e143d1eb74557b38032d969096) and repaired the same focused PR at 3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad: accepted composed calls now take caller/provider lifecycle leases under the manager lock, release the lock for canonical execution, and drain those leases during shutdown via a worker-thread condition wait so stop/unload cannot overtake accepted work without blocking the runtime event loop. New calls fail once manager/record shutdown starts. No master commit and no merge.
issue_or_pr: Core #400; draft PR #659; Android offline epic #622; Android UI PR #661
refs: #623; roadmap #1; Core #400; PR #659; blocking review 5133751703; zara-plugins#507 handoff; Android #622/#152/#194/#206; Android PR #661; prior failing exact-head run 34144988693; new run 34149518220
head: 3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad
android_tests: No Android source changed. Prior head 210b4088... had Android skeleton SUCCESS and both shared-mic jobs SUCCESS even though the Core repository job failed. New exact-head run 34149518220 is active at 3ff2f9bd...; shared-mic Arch is already SUCCESS, while Android skeleton and Ubuntu shared-mic are still in progress at this checkpoint. #622 still requires an offline symbolic runtime behind the shared client/runtime abstraction, and #661 remains separate UI work; neither is advanced ahead of this Core blocker.
core_tests: Existing tests-first RED ade56b105b02e4e143d1eb74557b38032d969096 deterministically exposed the provider-unload race. Exact-head 210b4088... JUnit contained 2,128 tests with one failure: test_inflight_composed_invocation_fences_provider_unload, proving an event-loop deadlock in the lock-across-invoker implementation. GREEN candidate 3ff2f9bd... replaces lock-across-execution with per-record active-invocation leases + threading.Condition; _stop_record() marks shutdown first, rejects new composition, and awaits lease drain through asyncio.to_thread, preserving event-loop progress. New exact-head test job is currently running Run all tests; Nix flake/package/screenshot steps therefore remain pending and are not claimed green.
plugin_handoffs: zara-plugins#507 remains blocked for production composition until #659 also gains the reviewed cancellation/stale-turn and explicit caller-capability authorization contract. Plugins must use only public PluginRuntime composition; no private backend/tool imports or parallel registry/runtime. SmartThings credentials remain server-side. Core gains no Prolog-RLM runtime dependency. Android continues to reuse shared semantic/runtime contracts rather than forking a second assistant/runtime.
blockers: Exact-head run 34149518220 must complete successfully across repository/Nix/package/Android/shared-mic gates. More importantly, the original REVIEW blockers remain after this regression repair: composition still lacks a Core-owned turn/cancellation context for caller shutdown/turn cancellation and stale-result fencing, and caller-to-capability authorization is not yet explicit. Approval-required tools continue to fail closed; do not weaken that policy.
next_mode: IMPLEMENT
next_target: First re-read exact-head run 34149518220 for 3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad and fix any concrete failure tests-first. Once green, continue #400/#659 with deterministic RED cases for caller shutdown/turn cancellation + stale result rejection and unauthorized caller capability access, then add the smallest Core-owned cancellable composition execution context tied to runtime/generation ownership. Run focused + full repo/Nix/Android/shared-mic gates before returning to REVIEW.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read the latest #623 state, roadmap #1, Core #400/draft PR #659, Android #622/PR #661, exact-head CI, and the current composition source. The previous lifecycle-fencing GREEN `210b4088e036c511070aa8d3dea5ad106b1e4601` was not actually green: exact-head run `34144988693` failed its repository test job, and the regression artifact showed the existing tests-first unload race case deadlocked because `_invoke_capability()` held the manager RLock across the synchronous tool call while `manager.stop()` blocked the asyncio runtime trying to acquire that lock. Kept the existing deterministic RED (`ade56b105b02e4e143d1eb74557b38032d969096`) and repaired the same focused PR at `3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad`: accepted composed calls now take caller/provider lifecycle leases under the manager lock, release the lock for canonical execution, and drain those leases during shutdown via a worker-thread condition wait so stop/unload cannot overtake accepted work without blocking the runtime event loop. New calls fail once manager/record shutdown starts. No master commit and no merge. issue_or_pr: Core #400; draft PR #659; Android offline epic #622; Android UI PR #661 refs: #623; roadmap #1; Core #400; PR #659; blocking review 5133751703; zara-plugins#507 handoff; Android #622/#152/#194/#206; Android PR #661; prior failing exact-head run 34144988693; new run 34149518220 head: `3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad` android_tests: No Android source changed. Prior head `210b4088...` had Android skeleton SUCCESS and both shared-mic jobs SUCCESS even though the Core repository job failed. New exact-head run `34149518220` is active at `3ff2f9bd...`; shared-mic Arch is already SUCCESS, while Android skeleton and Ubuntu shared-mic are still in progress at this checkpoint. #622 still requires an offline symbolic runtime behind the shared client/runtime abstraction, and #661 remains separate UI work; neither is advanced ahead of this Core blocker. core_tests: Existing tests-first RED `ade56b105b02e4e143d1eb74557b38032d969096` deterministically exposed the provider-unload race. Exact-head `210b4088...` JUnit contained 2,128 tests with one failure: `test_inflight_composed_invocation_fences_provider_unload`, proving an event-loop deadlock in the lock-across-invoker implementation. GREEN candidate `3ff2f9bd...` replaces lock-across-execution with per-record active-invocation leases + `threading.Condition`; `_stop_record()` marks shutdown first, rejects new composition, and awaits lease drain through `asyncio.to_thread`, preserving event-loop progress. New exact-head `test` job is currently running `Run all tests`; Nix flake/package/screenshot steps therefore remain pending and are not claimed green. plugin_handoffs: zara-plugins#507 remains blocked for production composition until #659 also gains the reviewed cancellation/stale-turn and explicit caller-capability authorization contract. Plugins must use only public `PluginRuntime` composition; no private backend/tool imports or parallel registry/runtime. SmartThings credentials remain server-side. Core gains no Prolog-RLM runtime dependency. Android continues to reuse shared semantic/runtime contracts rather than forking a second assistant/runtime. blockers: Exact-head run `34149518220` must complete successfully across repository/Nix/package/Android/shared-mic gates. More importantly, the original REVIEW blockers remain after this regression repair: composition still lacks a Core-owned turn/cancellation context for caller shutdown/turn cancellation and stale-result fencing, and caller-to-capability authorization is not yet explicit. Approval-required tools continue to fail closed; do not weaken that policy. next_mode: IMPLEMENT next_target: First re-read exact-head run `34149518220` for `3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad` and fix any concrete failure tests-first. Once green, continue #400/#659 with deterministic RED cases for caller shutdown/turn cancellation + stale result rejection and unauthorized caller capability access, then add the smallest Core-owned cancellable composition execution context tied to runtime/generation ownership. Run focused + full repo/Nix/Android/shared-mic gates before returning to REVIEW.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read #623/latest state, roadmap #1 + 2026-09-07 reconciliation, Core #400/draft PR #659, Android offline #622/UI PR #661, exact-head checks, and current composition/TurnCoordinator source. First verified prior head 3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad is fully green in CI run 34149518220 across repository/Nix/package, Android skeleton, and Ubuntu/Arch shared-mic gates. Then advanced #659 tests-first: RED commit 57f88760a92c5378d8a3c298e9ece701dae1d484 adds cross-plugin caller authorization and in-flight turn-cancellation stale-result regressions. Production commits ba7e4fbbeae98858d4ebd328b4aa82b7cb99f608 and 3ff9450574a89441c3c798756615967ce90d68b8 add explicit compose_capabilities allowlisting for cross-plugin resolution/invocation, Core-owned active invocation records tied to caller/provider generations, cancellation marking and stale-result rejection, lifecycle cancellation before lease drain, and an optional turn_id on public PluginRuntime.invoke_capability() without putting cancellation metadata into the tool request. No master commit and no merge.
refs: #623; roadmap #1 + reconciliation comment 5566663947; Core #400; draft PR #659; blocking review 5133751703; zara-plugins#507 handoff; Android offline #622; Android UI PR #661; Android #152/#194/#206; prior exact-head run 34149518220; new exact-head run 34153467550
head: 3ff9450574a89441c3c798756615967ce90d68b8
tests: Prior head 3ff2f9bd... is now proven fully green by run 34149518220. New tests were committed before the production authorization/cancellation implementation in 57f88760...: authorized caller resolves provider.read, unauthorized caller fails closed, and cancelling turn-1 while a composed call is in flight requires the stale result to be rejected after the underlying synchronous invocation returns. New exact-head CI run 34153467550 is queued at 3ff94505...; therefore repo/Nix/package/Android/shared-mic gates are pending and are not claimed green. The current implementation deliberately fences stale results rather than pretending synchronous LangChain tools are forcibly preemptible.
plugin_handoffs: zara-plugins#507 remains blocked until #659 completes canonical host cancellation wiring and adversarial review. Cross-plugin composition now requires the caller plugin configuration to list the exact target capability in compose_capabilities; same-plugin self-composition remains implicit, and invocation re-checks authorization so policy changes fail closed. Approval-required tools still fail closed through the canonical registry path. Plugins still receive no raw tool/plugin/manager objects. SmartThings credentials remain server-side. This slice adds no Prolog-RLM runtime dependency to Core. Android remains behind this Core blocker and #622 continues to require one shared local/remote runtime abstraction with Prolog/typed action authority.
blockers: Exact-head run 34153467550 must complete. One reviewed cancellation integration gap remains before REVIEW: RuntimeHost's canonical CancelTurn path owns turn cancellation, but it does not yet call PluginManager.cancel_capability_turn(turn_id), so the new turn-correlated public composition context is not yet automatically invalidated by the host coordinator. Wire that existing Core authority without creating a second turn runtime, add a deterministic RuntimeHost regression proving CancelTurn invalidates matching composed invocations, and re-run all gates. Also adversarially verify compose_capabilities policy parsing/fail-closed behavior and that caller-supplied turn_id is correlation only and cannot widen authority.
next_mode: IMPLEMENT
next_target: Finish #400/#659 cancellation integration on the same focused PR: after reading exact-head run 34153467550, add the RuntimeHost RED regression first, wire canonical _cancel_turn/task cancellation to PluginManager.cancel_capability_turn(turn_id) without duplicating TurnCoordinator authority, then run focused + full exact-head repo/Nix/Android/shared-mic gates. If green, set next_mode REVIEW for principal/capability/cancellation/stale-generation/insecure-fallback review before any Android implementation slice.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read #623/latest state, roadmap #1 + 2026-09-07 reconciliation, Core #400/draft PR #659, Android offline #622/UI PR #661, exact-head checks, and current composition/TurnCoordinator source. First verified prior head `3ff2f9bd74f3fcbaaf2720ae7cd66431d65856ad` is fully green in CI run `34149518220` across repository/Nix/package, Android skeleton, and Ubuntu/Arch shared-mic gates. Then advanced #659 tests-first: RED commit `57f88760a92c5378d8a3c298e9ece701dae1d484` adds cross-plugin caller authorization and in-flight turn-cancellation stale-result regressions. Production commits `ba7e4fbbeae98858d4ebd328b4aa82b7cb99f608` and `3ff9450574a89441c3c798756615967ce90d68b8` add explicit `compose_capabilities` allowlisting for cross-plugin resolution/invocation, Core-owned active invocation records tied to caller/provider generations, cancellation marking and stale-result rejection, lifecycle cancellation before lease drain, and an optional `turn_id` on public `PluginRuntime.invoke_capability()` without putting cancellation metadata into the tool request. No master commit and no merge. refs: #623; roadmap #1 + reconciliation comment 5566663947; Core #400; draft PR #659; blocking review 5133751703; zara-plugins#507 handoff; Android offline #622; Android UI PR #661; Android #152/#194/#206; prior exact-head run 34149518220; new exact-head run 34153467550 head: `3ff9450574a89441c3c798756615967ce90d68b8` tests: Prior head `3ff2f9bd...` is now proven fully green by run `34149518220`. New tests were committed before the production authorization/cancellation implementation in `57f88760...`: authorized caller resolves `provider.read`, unauthorized caller fails closed, and cancelling `turn-1` while a composed call is in flight requires the stale result to be rejected after the underlying synchronous invocation returns. New exact-head CI run `34153467550` is queued at `3ff94505...`; therefore repo/Nix/package/Android/shared-mic gates are pending and are not claimed green. The current implementation deliberately fences stale results rather than pretending synchronous LangChain tools are forcibly preemptible. plugin_handoffs: zara-plugins#507 remains blocked until #659 completes canonical host cancellation wiring and adversarial review. Cross-plugin composition now requires the caller plugin configuration to list the exact target capability in `compose_capabilities`; same-plugin self-composition remains implicit, and invocation re-checks authorization so policy changes fail closed. Approval-required tools still fail closed through the canonical registry path. Plugins still receive no raw tool/plugin/manager objects. SmartThings credentials remain server-side. This slice adds no Prolog-RLM runtime dependency to Core. Android remains behind this Core blocker and #622 continues to require one shared local/remote runtime abstraction with Prolog/typed action authority. blockers: Exact-head run `34153467550` must complete. One reviewed cancellation integration gap remains before REVIEW: RuntimeHost's canonical `CancelTurn` path owns turn cancellation, but it does not yet call `PluginManager.cancel_capability_turn(turn_id)`, so the new turn-correlated public composition context is not yet automatically invalidated by the host coordinator. Wire that existing Core authority without creating a second turn runtime, add a deterministic RuntimeHost regression proving `CancelTurn` invalidates matching composed invocations, and re-run all gates. Also adversarially verify `compose_capabilities` policy parsing/fail-closed behavior and that caller-supplied `turn_id` is correlation only and cannot widen authority. next_mode: IMPLEMENT next_target: Finish #400/#659 cancellation integration on the same focused PR: after reading exact-head run `34153467550`, add the RuntimeHost RED regression first, wire canonical `_cancel_turn`/task cancellation to `PluginManager.cancel_capability_turn(turn_id)` without duplicating TurnCoordinator authority, then run focused + full exact-head repo/Nix/Android/shared-mic gates. If green, set next_mode REVIEW for principal/capability/cancellation/stale-generation/insecure-fallback review before any Android implementation slice.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read #623/latest WORKER_STATE, roadmap #1, Core #400/draft PR #659, current exact-head CI and current composition/lifecycle source. Exact-head run 34153467550 at 3ff9450574 failed one deterministic repository test while Android skeleton and both shared-mic lanes passed. JUnit artifact regression-artifacts proves 2,131 tests ran in ~240s with exactly one failure: test_inflight_composed_invocation_fences_provider_unload. Root cause: the new turn-cancellation bookkeeping also marked every accepted capability invocation cancelled when _stop_record() began, contradicting the existing lease contract that shutdown must set stop_called, reject new work, then drain already-accepted calls before unload. Fixed only that regression on PR #659 at 00cd7f929f91c238a0d910dbd4af712b1dbe41a7 by removing lifecycle-stop cancellation marking; explicit cancel_capability_turn(turn_id) remains the only path that invalidates an in-flight turn result. No master commit and no merge.
issue_or_pr: lost-rob0t/zara#400; draft PR #659; worker #623
head: 00cd7f929f
android_tests: Prior exact-head run 34153467550 on 3ff94505: Android skeleton gate SUCCESS (unit/native Trealla/debug APK/secret inspection), shared-mic Ubuntu SUCCESS, shared-mic Arch SUCCESS. No Android product code changed this loop. New head has no materialized Actions run yet, so Android/Nix/package gates are not claimed green for 00cd7f92.
core_tests: Prior run 34153467550 repository job FAILED only in test_inflight_composed_invocation_fences_provider_unload; JUnit artifact reported 2,131 tests, 1 failure, 0 errors, ~239.9s. The failing test is the deterministic regression case and showed shutdown was incorrectly converting an accepted no-turn invocation into RuntimeError: composed invocation was cancelled or became stale. Commit 00cd7f92 is a focused -3-line production repair preserving lease-drain semantics. Fresh exact-head CI has not materialized yet; full repo/Nix/package/screenshot gates remain pending.
plugin_handoffs: zara-plugins#507 remains downstream of Core #400. Composition still uses explicit compose_capabilities, principal-bound backend hooks, canonical ToolRegistry approval re-checks, generation handles, and explicit turn cancellation. SmartThings credentials stay server-side; Core gains no Prolog-RLM runtime dependency; Android remains on shared runtime/semantic contracts.
blockers: Current head 00cd7f92 must pass exact-head repo/Nix/package/Android/shared-mic gates. The original remaining design blocker is still open after this regression repair: RuntimeHost's canonical CancelTurn / task-turn cancellation path does not yet call PluginManager.cancel_capability_turn(turn_id), so composed results tied to a host turn are not fenced by the same cancellation authority unless invoked manually. Do not start Android #622/#152/#194/#206 work before this Core seam is closed/reviewed.
next_mode: IMPLEMENT
next_target: First verify exact-head CI for 00cd7f929f. If green, add RED RuntimeHost regression(s) proving canonical CancelTurn and task-turn cancellation invalidate matching PluginManager composition contexts, then wire the smallest host-owned cancellation hook without a second cancellation runtime. Run focused + full exact-head repo/Nix/Android/shared-mic gates; switch to REVIEW only when clean.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read #623/latest WORKER_STATE, roadmap #1, Core #400/draft PR #659, current exact-head CI and current composition/lifecycle source. Exact-head run 34153467550 at 3ff9450574a89441c3c798756615967ce90d68b8 failed one deterministic repository test while Android skeleton and both shared-mic lanes passed. JUnit artifact `regression-artifacts` proves 2,131 tests ran in ~240s with exactly one failure: `test_inflight_composed_invocation_fences_provider_unload`. Root cause: the new turn-cancellation bookkeeping also marked every accepted capability invocation cancelled when `_stop_record()` began, contradicting the existing lease contract that shutdown must set `stop_called`, reject new work, then drain already-accepted calls before unload. Fixed only that regression on PR #659 at `00cd7f929f91c238a0d910dbd4af712b1dbe41a7` by removing lifecycle-stop cancellation marking; explicit `cancel_capability_turn(turn_id)` remains the only path that invalidates an in-flight turn result. No master commit and no merge. issue_or_pr: lost-rob0t/zara#400; draft PR #659; worker #623 head: 00cd7f929f91c238a0d910dbd4af712b1dbe41a7 android_tests: Prior exact-head run 34153467550 on 3ff94505: Android skeleton gate SUCCESS (unit/native Trealla/debug APK/secret inspection), shared-mic Ubuntu SUCCESS, shared-mic Arch SUCCESS. No Android product code changed this loop. New head has no materialized Actions run yet, so Android/Nix/package gates are not claimed green for 00cd7f92. core_tests: Prior run 34153467550 repository job FAILED only in `test_inflight_composed_invocation_fences_provider_unload`; JUnit artifact reported 2,131 tests, 1 failure, 0 errors, ~239.9s. The failing test is the deterministic regression case and showed shutdown was incorrectly converting an accepted no-turn invocation into `RuntimeError: composed invocation was cancelled or became stale`. Commit 00cd7f92 is a focused -3-line production repair preserving lease-drain semantics. Fresh exact-head CI has not materialized yet; full repo/Nix/package/screenshot gates remain pending. plugin_handoffs: zara-plugins#507 remains downstream of Core #400. Composition still uses explicit `compose_capabilities`, principal-bound backend hooks, canonical ToolRegistry approval re-checks, generation handles, and explicit turn cancellation. SmartThings credentials stay server-side; Core gains no Prolog-RLM runtime dependency; Android remains on shared runtime/semantic contracts. blockers: Current head 00cd7f92 must pass exact-head repo/Nix/package/Android/shared-mic gates. The original remaining design blocker is still open after this regression repair: RuntimeHost's canonical `CancelTurn` / task-turn cancellation path does not yet call `PluginManager.cancel_capability_turn(turn_id)`, so composed results tied to a host turn are not fenced by the same cancellation authority unless invoked manually. Do not start Android #622/#152/#194/#206 work before this Core seam is closed/reviewed. next_mode: IMPLEMENT next_target: First verify exact-head CI for 00cd7f929f91c238a0d910dbd4af712b1dbe41a7. If green, add RED RuntimeHost regression(s) proving canonical `CancelTurn` and task-turn cancellation invalidate matching PluginManager composition contexts, then wire the smallest host-owned cancellation hook without a second cancellation runtime. Run focused + full exact-head repo/Nix/Android/shared-mic gates; switch to REVIEW only when clean.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Verified prior repair head 00cd7f929f91c238a0d910dbd4af712b1dbe41a7 is fully green in exact-head CI run 34157008494, then started the recorded host-cancellation integration tests-first. Added RED commit 7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a on draft PR #659 with deterministic RuntimeHost coverage requiring both canonical CancelTurn and task-turn cancellation to call PluginManager.cancel_capability_turn(turn_id). Current source does not do that, so the new tests capture the remaining reviewed gap without creating a second cancellation runtime. No master commit, no merge, no Android work advanced ahead of the Core blocker.
issue_or_pr: lost-rob0t/zara#400; draft PR #659; worker #623
head: 7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a
android_tests: Prior exact-head 00cd7f92... CI run 34157008494 is SUCCESS across the repository CI, including the Android skeleton and shared-mic lanes. No Android product source changed in this loop. Android #622/#152/#194/#206 and PR #661 remain later in dependency order behind Core #400.
core_tests: Prior head 00cd7f92... is proven green by run 34157008494. RED commit 7ac3e2fd... adds t/test_plugin_host_cancellation.py: test_cancel_turn_invalidates_plugin_composition_context and test_task_turn_cancellation_invalidates_plugin_composition_context. Both assert the existing TurnCoordinator/backend cancellation path also invalidates the same turn id in PluginManager. A workflow run had not materialized yet when queried immediately after push, so exact-head CI for the RED commit is not claimed complete. Source inspection confirms _cancel_turn() and _cancel_task_turn() currently call coordinator/backend cancellation only and never cancel_capability_turn, so the RED expectation is evidence-backed.
plugin_handoffs: zara-plugins#507 remains blocked on #400. Existing composition guardrails remain: explicit compose_capabilities, principal-bound backend invocation, canonical ToolRegistry approval re-check, generation/lifecycle leases, explicit stale-result fencing, no raw plugin/tool/private-manager escape. SmartThings credentials stay server-side; Core gains no Prolog-RLM runtime dependency; Android continues to reuse shared runtime/semantic contracts.
blockers: Production half of this tests-first slice is still required: minimally notify the existing PluginManager from RuntimeHost cancellation paths, preserving TurnCoordinator as the sole turn-cancellation authority and keeping plugin invalidation best-effort/fail-closed without blocking backend cancellation. Then run focused tests plus full exact-head repo/Nix/package/Android/shared-mic gates. PR #659 remains draft/unmerged and still requires adversarial REVIEW after green gates.
next_mode: IMPLEMENT
next_target: Continue #400/#659 from RED 7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a: add the smallest RuntimeHost production hook so both _cancel_turn and _cancel_task_turn call PluginManager.cancel_capability_turn(turn_id) using the already-owned turn id, with no duplicate coordinator/runtime; run the new focused tests and all required exact-head gates. If green, set next_mode REVIEW for principal/capability authorization, cancellation/stale-turn fencing, lifecycle/generation, Prolog authority, duplicate-runtime/server-vs-device placement, and insecure-fallback review before Android work.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Verified prior repair head `00cd7f929f91c238a0d910dbd4af712b1dbe41a7` is fully green in exact-head CI run `34157008494`, then started the recorded host-cancellation integration tests-first. Added RED commit `7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a` on draft PR #659 with deterministic RuntimeHost coverage requiring both canonical `CancelTurn` and task-turn cancellation to call `PluginManager.cancel_capability_turn(turn_id)`. Current source does not do that, so the new tests capture the remaining reviewed gap without creating a second cancellation runtime. No master commit, no merge, no Android work advanced ahead of the Core blocker. issue_or_pr: lost-rob0t/zara#400; draft PR #659; worker #623 head: `7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a` android_tests: Prior exact-head `00cd7f92...` CI run `34157008494` is SUCCESS across the repository CI, including the Android skeleton and shared-mic lanes. No Android product source changed in this loop. Android #622/#152/#194/#206 and PR #661 remain later in dependency order behind Core #400. core_tests: Prior head `00cd7f92...` is proven green by run `34157008494`. RED commit `7ac3e2fd...` adds `t/test_plugin_host_cancellation.py`: `test_cancel_turn_invalidates_plugin_composition_context` and `test_task_turn_cancellation_invalidates_plugin_composition_context`. Both assert the existing TurnCoordinator/backend cancellation path also invalidates the same turn id in PluginManager. A workflow run had not materialized yet when queried immediately after push, so exact-head CI for the RED commit is not claimed complete. Source inspection confirms `_cancel_turn()` and `_cancel_task_turn()` currently call coordinator/backend cancellation only and never `cancel_capability_turn`, so the RED expectation is evidence-backed. plugin_handoffs: zara-plugins#507 remains blocked on #400. Existing composition guardrails remain: explicit `compose_capabilities`, principal-bound backend invocation, canonical ToolRegistry approval re-check, generation/lifecycle leases, explicit stale-result fencing, no raw plugin/tool/private-manager escape. SmartThings credentials stay server-side; Core gains no Prolog-RLM runtime dependency; Android continues to reuse shared runtime/semantic contracts. blockers: Production half of this tests-first slice is still required: minimally notify the existing PluginManager from RuntimeHost cancellation paths, preserving TurnCoordinator as the sole turn-cancellation authority and keeping plugin invalidation best-effort/fail-closed without blocking backend cancellation. Then run focused tests plus full exact-head repo/Nix/package/Android/shared-mic gates. PR #659 remains draft/unmerged and still requires adversarial REVIEW after green gates. next_mode: IMPLEMENT next_target: Continue #400/#659 from RED `7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a`: add the smallest RuntimeHost production hook so both `_cancel_turn` and `_cancel_task_turn` call `PluginManager.cancel_capability_turn(turn_id)` using the already-owned turn id, with no duplicate coordinator/runtime; run the new focused tests and all required exact-head gates. If green, set next_mode REVIEW for principal/capability authorization, cancellation/stale-turn fencing, lifecycle/generation, Prolog authority, duplicate-runtime/server-vs-device placement, and insecure-fallback review before Android work.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Confirmed RED exact-head CI run 34161066418 at 7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a failed only the two intended RuntimeHost cancellation-contract tests while Android skeleton and both shared-mic lanes passed. Implemented the smallest production hook on draft PR #659 at 45f93ab6d980b45e28bcf47db6c3c10c6233ce98: canonical CancelTurn and task-turn cancellation now invalidate the matching PluginManager composition turn before backend cancellation, through the existing turn id and without introducing another coordinator/runtime. Helper failure is isolated so backend cancellation still runs. Diff from RED is one file, +16/-1, with no unrelated source changes. No master commit, merge, or Android source work.
refs: #400, PR #659, #623; roadmap #1; Android #152, Samsung/SmartThings #194, offline-first #622, UI PR #661
head: 45f93ab6d980b45e28bcf47db6c3c10c6233ce98
tests: RED run 34161066418: repository lane 2 failed / 2131 passed, exactly test_cancel_turn_invalidates_plugin_composition_context and test_task_turn_cancellation_invalidates_plugin_composition_context; Android skeleton PASS; shared mic Ubuntu PASS; shared mic Arch PASS. Fresh exact-head CI run 34164920330 is in progress at the new head. Current checkpoint: whitespace PASS, shared mic Ubuntu PASS, shared mic Arch PASS; repository full tests/Nix/package/screenshots still running; Android unit/native Trealla/debug APK/secret inspection still running. Therefore new head is not yet claimed green.
plugin_handoffs: zara-plugins#507 remains blocked on #400/#659 review. Preserved principal-bound backend composition, explicit caller compose_capabilities authorization, canonical ToolRegistry approval/policy recheck, generation/lifecycle leases, and explicit stale-result fencing. TurnCoordinator remains the single turn/cancellation authority; PluginManager only receives cancellation invalidation for its in-flight composition context. SmartThings credentials remain server-side per #194; Core gains no Prolog-RLM runtime dependency; Android remains ordered behind Core and must reuse the shared semantic/runtime contracts from #152/#622.
blockers: exact-head run 34164920330 must finish green across repository tests, Nix flake/package/screenshots, Android skeleton, and both shared-mic lanes before #659 can return to adversarial REVIEW. PR #659 remains draft/open/unmerged. Android #622/#152/#194 and UI PR #661 are not advanced while this Core plugin blocker is unresolved.
next_mode: IMPLEMENT
next_target: inspect exact-head CI 34164920330 for 45f93ab6...; if any lane fails, fix the exact regression tests-first on the existing focused branch. If every required gate is green, set next_mode REVIEW and adversarially re-check #659 for principal ownership, capability authorization, cancellation/stale-turn fencing (including lifecycle/restart edges), server-vs-device placement, Prolog authority, duplicate runtimes, and insecure fallbacks before any Android work.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Confirmed RED exact-head CI run 34161066418 at `7ac3e2fdd98e80e474e9b6d89d07aef59c909b0a` failed only the two intended RuntimeHost cancellation-contract tests while Android skeleton and both shared-mic lanes passed. Implemented the smallest production hook on draft PR #659 at `45f93ab6d980b45e28bcf47db6c3c10c6233ce98`: canonical CancelTurn and task-turn cancellation now invalidate the matching PluginManager composition turn before backend cancellation, through the existing turn id and without introducing another coordinator/runtime. Helper failure is isolated so backend cancellation still runs. Diff from RED is one file, +16/-1, with no unrelated source changes. No master commit, merge, or Android source work. refs: #400, PR #659, #623; roadmap #1; Android #152, Samsung/SmartThings #194, offline-first #622, UI PR #661 head: `45f93ab6d980b45e28bcf47db6c3c10c6233ce98` tests: RED run `34161066418`: repository lane 2 failed / 2131 passed, exactly `test_cancel_turn_invalidates_plugin_composition_context` and `test_task_turn_cancellation_invalidates_plugin_composition_context`; Android skeleton PASS; shared mic Ubuntu PASS; shared mic Arch PASS. Fresh exact-head CI run `34164920330` is in progress at the new head. Current checkpoint: whitespace PASS, shared mic Ubuntu PASS, shared mic Arch PASS; repository full tests/Nix/package/screenshots still running; Android unit/native Trealla/debug APK/secret inspection still running. Therefore new head is not yet claimed green. plugin_handoffs: zara-plugins#507 remains blocked on #400/#659 review. Preserved principal-bound backend composition, explicit caller `compose_capabilities` authorization, canonical ToolRegistry approval/policy recheck, generation/lifecycle leases, and explicit stale-result fencing. TurnCoordinator remains the single turn/cancellation authority; PluginManager only receives cancellation invalidation for its in-flight composition context. SmartThings credentials remain server-side per #194; Core gains no Prolog-RLM runtime dependency; Android remains ordered behind Core and must reuse the shared semantic/runtime contracts from #152/#622. blockers: exact-head run `34164920330` must finish green across repository tests, Nix flake/package/screenshots, Android skeleton, and both shared-mic lanes before #659 can return to adversarial REVIEW. PR #659 remains draft/open/unmerged. Android #622/#152/#194 and UI PR #661 are not advanced while this Core plugin blocker is unresolved. next_mode: IMPLEMENT next_target: inspect exact-head CI `34164920330` for `45f93ab6...`; if any lane fails, fix the exact regression tests-first on the existing focused branch. If every required gate is green, set next_mode REVIEW and adversarially re-check #659 for principal ownership, capability authorization, cancellation/stale-turn fencing (including lifecycle/restart edges), server-vs-device placement, Prolog authority, duplicate runtimes, and insecure fallbacks before any Android work.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read the durable mailbox, roadmap, Core #400/draft PR #659, Android offline/Samsung constraints, exact-head CI, and current PR-head RuntimeHost source. The recorded IMPLEMENT target is complete at 45f93ab6d980b45e28bcf47db6c3c10c6233ce98: exact-head run 34164920330 finished SUCCESS across all required lanes, and current source contains the minimal RuntimeHost -> PluginManager turn invalidation hook while preserving TurnCoordinator as the single cancellation authority. No additional source change was justified in this loop; PR #659 remains draft/open/unmerged and now advances to the mandated adversarial REVIEW.
issue_or_pr: Core #400; draft PR #659; worker #623; Android #622/#152/#194; UI PR #661
head: 45f93ab6d980b45e28bcf47db6c3c10c6233ce98
android_tests: Exact-head CI run 34164920330 SUCCESS. android skeleton gate passed its unit tests + native Trealla + debug APK + secret inspection. shared mic / Ubuntu 24.04 SUCCESS and shared mic / Arch Linux SUCCESS. No Android product source changed. Offline-first #622 and Samsung/SmartThings #194 remain behind the Core review in worker order; SmartThings secrets/refresh credentials remain server-side and Android continues to reuse the shared runtime/semantic contracts.
core_tests: Exact-head test job SUCCESS at the recorded head. Run all tests, Nix flake checks, packaged Zara build, deterministic Copilot screenshots, whitespace check and artifact upload all passed. The prior tests-first cancellation contract is now green: canonical CancelTurn and task-turn cancellation notify PluginManager.cancel_capability_turn(turn_id) through RuntimeHost, while helper failure is isolated so backend cancellation still proceeds. Current PR-head source retains the dedicated _cancel_plugin_capability_turn() helper and does not introduce a second coordinator/runtime.
plugin_handoffs: zara-plugins#507 remains downstream of #400/#659 until REVIEW/merge. Candidate contract now includes opaque generation handles, explicit compose_capabilities caller authorization, principal-bound backend composition, canonical ToolRegistry policy/approval recheck, lifecycle leases, turn-correlated stale-result fencing, and host cancellation propagation. Plugins must continue using only the public PluginRuntime seam; no private backend/tool/manager imports or parallel registry/runtime. Core gains no Prolog-RLM runtime dependency.
blockers: No failing exact-head gate remains. Remaining blocker is the required adversarial REVIEW of PR #659: verify principal ownership, capability authorization and policy parsing/fail-closed behavior, cancellation/stale-turn fencing including restart/lifecycle edges, generation/stale handle behavior, approval-required tool behavior, Prolog/model non-authority, server-vs-device placement, duplicate-runtime/private-state escapes, and insecure fallbacks. PR stays draft/unmerged until that review. Android work is not advanced ahead of this Core blocker.
next_mode: REVIEW
next_target: Adversarially review draft PR #659 at exact head 45f93ab6d980b45e28bcf47db6c3c10c6233ce98. Treat exact-head green CI as necessary but not sufficient. If review is clean, make the Core #400 candidate review-ready/hand off to plugins; if a concrete flaw is found, add a deterministic RED regression first and return to IMPLEMENT on the same focused PR before any Android #622/#152/#194 slice.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read the durable mailbox, roadmap, Core #400/draft PR #659, Android offline/Samsung constraints, exact-head CI, and current PR-head RuntimeHost source. The recorded IMPLEMENT target is complete at `45f93ab6d980b45e28bcf47db6c3c10c6233ce98`: exact-head run `34164920330` finished SUCCESS across all required lanes, and current source contains the minimal RuntimeHost -> PluginManager turn invalidation hook while preserving TurnCoordinator as the single cancellation authority. No additional source change was justified in this loop; PR #659 remains draft/open/unmerged and now advances to the mandated adversarial REVIEW. issue_or_pr: Core #400; draft PR #659; worker #623; Android #622/#152/#194; UI PR #661 head: `45f93ab6d980b45e28bcf47db6c3c10c6233ce98` android_tests: Exact-head CI run `34164920330` SUCCESS. `android skeleton gate` passed its unit tests + native Trealla + debug APK + secret inspection. `shared mic / Ubuntu 24.04` SUCCESS and `shared mic / Arch Linux` SUCCESS. No Android product source changed. Offline-first #622 and Samsung/SmartThings #194 remain behind the Core review in worker order; SmartThings secrets/refresh credentials remain server-side and Android continues to reuse the shared runtime/semantic contracts. core_tests: Exact-head `test` job SUCCESS at the recorded head. `Run all tests`, Nix flake checks, packaged Zara build, deterministic Copilot screenshots, whitespace check and artifact upload all passed. The prior tests-first cancellation contract is now green: canonical `CancelTurn` and task-turn cancellation notify `PluginManager.cancel_capability_turn(turn_id)` through RuntimeHost, while helper failure is isolated so backend cancellation still proceeds. Current PR-head source retains the dedicated `_cancel_plugin_capability_turn()` helper and does not introduce a second coordinator/runtime. plugin_handoffs: zara-plugins#507 remains downstream of #400/#659 until REVIEW/merge. Candidate contract now includes opaque generation handles, explicit `compose_capabilities` caller authorization, principal-bound backend composition, canonical ToolRegistry policy/approval recheck, lifecycle leases, turn-correlated stale-result fencing, and host cancellation propagation. Plugins must continue using only the public PluginRuntime seam; no private backend/tool/manager imports or parallel registry/runtime. Core gains no Prolog-RLM runtime dependency. blockers: No failing exact-head gate remains. Remaining blocker is the required adversarial REVIEW of PR #659: verify principal ownership, capability authorization and policy parsing/fail-closed behavior, cancellation/stale-turn fencing including restart/lifecycle edges, generation/stale handle behavior, approval-required tool behavior, Prolog/model non-authority, server-vs-device placement, duplicate-runtime/private-state escapes, and insecure fallbacks. PR stays draft/unmerged until that review. Android work is not advanced ahead of this Core blocker. next_mode: REVIEW next_target: Adversarially review draft PR #659 at exact head `45f93ab6d980b45e28bcf47db6c3c10c6233ce98`. Treat exact-head green CI as necessary but not sufficient. If review is clean, make the Core #400 candidate review-ready/hand off to plugins; if a concrete flaw is found, add a deterministic RED regression first and return to IMPLEMENT on the same focused PR before any Android #622/#152/#194 slice.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: REVIEW
result: Adversarial exact-head review of Core #400 / draft PR #659 found a remaining stale-turn authority hole despite green CI. RuntimeHost now forwards canonical cancellation to PluginManager, but the public composition API still lets plugin code optionally supply an arbitrary raw turn_id, and PluginManager only marks invocations active at cancellation time. Therefore a plugin can omit/forge turn correlation, and an honest call can race canonical cancellation-before-registration: CancelTurn(turn-1) may observe no active composed invocation, then a later invoke_capability(..., turn_id="turn-1") registers fresh and executes under an already-cancelled turn. Posted blocking PR comment 5576900609; PR remains draft/open/unmerged.
issue_or_pr: Core #400; draft PR #659; blocking PR comment 5576900609; worker #623
refs: roadmap #1 + reconciliation comment 5566663947; zara-plugins worker #507; Android #152/#194/#622; Android UI PR #661; exact-head CI run 34164920330; master fe6e8eee30d6beb153c2a399a79d325e017f2b02
head: 45f93ab6d980b45e28bcf47db6c3c10c6233ce98
tests: No new tests or source changes in REVIEW. Exact-head CI run 34164920330 remains completed/SUCCESS at this SHA. Existing cancellation regression proves cancel-during-an-active matching-id composition call. Source review shows PluginRuntime.invoke_capability() accepts optional caller-provided turn_id; omitting it invokes composition with no cancellation correlation. PluginManager.cancel_capability_turn() only flags matching entries already in _active_capability_invocations; it stores no cancelled-turn tombstone/generation, and _invoke_capability() does not validate the id against host/coordinator state before registering. Thus green CI does not cover cancel-before-invoke or forged/uncorrelated turn ids.
android_tests: No Android source changed in REVIEW. Exact-head run 34164920330 remains green for Android skeleton unit/native Trealla/debug APK/secret inspection and Ubuntu/Arch shared-mic gates. #152 remains the shared portable-Prolog/typed-capability Android foundation; #622 requires one local/remote runtime abstraction and offline symbolic authority; #194 explicitly keeps SmartThings OAuth/secrets/refresh credentials server-side and forbids a second Android runtime. PR #661 remains separate UI work and is not advanced ahead of this Core blocker.
core_tests: Reviewed current PR-head zara/plugins/api.py, zara/plugins/manager.py, and zara/runtime/host.py, plus #400 and exact-head Actions. Principal-bound backend execution, compose_capabilities authorization/recheck, approval-required fail-closed behavior, provider generation handles, lifecycle leases, host cancellation notification, and no raw tool/registry escape remain directionally sound. Blocking defect is that turn ownership/cancellation correlation is not Core-owned or durable across the cancellation-before-registration race.
plugin_handoffs: zara-plugins#507 remains blocked on #400 for cross-plugin execution expansion. Do not consume #659 yet for zara-shell test/build composition because cancellation can still be bypassed by absent/forged correlation or by the pre-registration race. Plugins must continue avoiding private Core imports and parallel registries/runtimes. SmartThings credentials stay server-side. This Core slice adds no Prolog-RLM runtime dependency; Android continues to reuse shared semantic/runtime contracts.
blockers: Add deterministic RED coverage for (1) cancel turn-1 before a composed invocation begins, then prove a later invocation for that stale turn fails before the underlying tool runs; and (2) prove plugin code cannot opt out of or forge the Core-owned cancellation context for turn-scoped composition. Then add the smallest Core-owned/validated turn lease, generation, tombstone, or equivalent opaque context tied to existing RuntimeHost/TurnCoordinator authority—no second coordinator/runtime and no raw caller string as authority. Preserve current principal/capability/approval/lifecycle safeguards and rerun focused + full repo/Nix/package/Android/shared-mic exact-head gates.
next_mode: IMPLEMENT
next_target: Continue #400/#659 tests-first on the existing focused branch: reproduce cancel-before-registration plus uncorrelated/forged-turn bypass, then make composition cancellation context Core-owned/validated and stale-turn fail-closed without weakening authorization or adding another turn runtime. Run all required exact-head gates and return to REVIEW before any Android implementation slice.

WORKER_STATE worker: core-android mode_used: REVIEW result: Adversarial exact-head review of Core #400 / draft PR #659 found a remaining stale-turn authority hole despite green CI. RuntimeHost now forwards canonical cancellation to PluginManager, but the public composition API still lets plugin code optionally supply an arbitrary raw `turn_id`, and PluginManager only marks invocations active at cancellation time. Therefore a plugin can omit/forge turn correlation, and an honest call can race canonical cancellation-before-registration: `CancelTurn(turn-1)` may observe no active composed invocation, then a later `invoke_capability(..., turn_id="turn-1")` registers fresh and executes under an already-cancelled turn. Posted blocking PR comment 5576900609; PR remains draft/open/unmerged. issue_or_pr: Core #400; draft PR #659; blocking PR comment 5576900609; worker #623 refs: roadmap #1 + reconciliation comment 5566663947; zara-plugins worker #507; Android #152/#194/#622; Android UI PR #661; exact-head CI run 34164920330; master `fe6e8eee30d6beb153c2a399a79d325e017f2b02` head: `45f93ab6d980b45e28bcf47db6c3c10c6233ce98` tests: No new tests or source changes in REVIEW. Exact-head CI run `34164920330` remains completed/SUCCESS at this SHA. Existing cancellation regression proves cancel-during-an-active matching-id composition call. Source review shows `PluginRuntime.invoke_capability()` accepts optional caller-provided `turn_id`; omitting it invokes composition with no cancellation correlation. `PluginManager.cancel_capability_turn()` only flags matching entries already in `_active_capability_invocations`; it stores no cancelled-turn tombstone/generation, and `_invoke_capability()` does not validate the id against host/coordinator state before registering. Thus green CI does not cover cancel-before-invoke or forged/uncorrelated turn ids. android_tests: No Android source changed in REVIEW. Exact-head run `34164920330` remains green for Android skeleton unit/native Trealla/debug APK/secret inspection and Ubuntu/Arch shared-mic gates. #152 remains the shared portable-Prolog/typed-capability Android foundation; #622 requires one local/remote runtime abstraction and offline symbolic authority; #194 explicitly keeps SmartThings OAuth/secrets/refresh credentials server-side and forbids a second Android runtime. PR #661 remains separate UI work and is not advanced ahead of this Core blocker. core_tests: Reviewed current PR-head `zara/plugins/api.py`, `zara/plugins/manager.py`, and `zara/runtime/host.py`, plus #400 and exact-head Actions. Principal-bound backend execution, `compose_capabilities` authorization/recheck, approval-required fail-closed behavior, provider generation handles, lifecycle leases, host cancellation notification, and no raw tool/registry escape remain directionally sound. Blocking defect is that turn ownership/cancellation correlation is not Core-owned or durable across the cancellation-before-registration race. plugin_handoffs: zara-plugins#507 remains blocked on #400 for cross-plugin execution expansion. Do not consume #659 yet for `zara-shell` test/build composition because cancellation can still be bypassed by absent/forged correlation or by the pre-registration race. Plugins must continue avoiding private Core imports and parallel registries/runtimes. SmartThings credentials stay server-side. This Core slice adds no Prolog-RLM runtime dependency; Android continues to reuse shared semantic/runtime contracts. blockers: Add deterministic RED coverage for (1) cancel `turn-1` before a composed invocation begins, then prove a later invocation for that stale turn fails before the underlying tool runs; and (2) prove plugin code cannot opt out of or forge the Core-owned cancellation context for turn-scoped composition. Then add the smallest Core-owned/validated turn lease, generation, tombstone, or equivalent opaque context tied to existing RuntimeHost/TurnCoordinator authority—no second coordinator/runtime and no raw caller string as authority. Preserve current principal/capability/approval/lifecycle safeguards and rerun focused + full repo/Nix/package/Android/shared-mic exact-head gates. next_mode: IMPLEMENT next_target: Continue #400/#659 tests-first on the existing focused branch: reproduce cancel-before-registration plus uncorrelated/forged-turn bypass, then make composition cancellation context Core-owned/validated and stale-turn fail-closed without weakening authorization or adding another turn runtime. Run all required exact-head gates and return to REVIEW before any Android implementation slice.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Added the deterministic RED regression for the REVIEW-found cancel-before-registration race on Core #400 / draft PR #659. The new test cancels turn-1 before composition registration, then proves a later invocation for that stale turn must fail before the underlying capability executor runs. No production workaround was added in this loop because a raw tombstone set alone would be an unbounded long-lived-daemon leak and would still leave caller-forged/omitted turn correlation as authority; the production fix must tie registration to existing RuntimeHost/TurnCoordinator-owned turn validity rather than inventing a second coordinator.
issue_or_pr: Core #400; draft PR #659; worker #623; prior blocking review comment 5576900609
refs: roadmap #1 reconciliation comment 5566663947; Android #622/#152/#194; zara-plugins #507; exact-head prior green CI 34164920330; new RED CI 34174536264
head: 9e77fcce9a01feddb67d87b9b61043c0004f8e07
tests: Tests-first commit 9e77fcce9a01feddb67d87b9b61043c0004f8e07 adds test_turn_cancellation_before_registration_fails_closed in t/test_plugin_capability_authorization_cancellation.py. CI run 34174536264 is in progress at this exact head; Arch shared-mic is already green, while repository tests, Android skeleton gate, and Ubuntu shared-mic were still running at checkpoint. This commit is intentionally RED against current PluginManager.cancel_capability_turn(), which only marks already-active invocations and stores no authoritative cancelled/invalid turn state.
android_tests: No Android source changed. Prior exact-head 45f93ab6d980b45e28bcf47db6c3c10c6233ce98 remains fully green in run 34164920330 for Android unit/native Trealla/debug APK/secret inspection plus both shared-mic lanes. Offline-first #622 remains downstream of this Core blocker and still requires one shared local/remote runtime abstraction; SmartThings #194 keeps credentials/OAuth/refresh server-side; Android continues to reuse shared semantic/runtime contracts.
core_tests: Prior exact head 45f93ab6d980b45e28bcf47db6c3c10c6233ce98 is green. Current source still accepts optional raw caller-provided turn_id in PluginRuntime.invoke_capability() and PluginManager._invoke_capability(), and cancel_capability_turn() only mutates matching entries already in _active_capability_invocations. RED now captures the pre-registration half of that defect. No direct master commit and no merge.
plugin_handoffs: zara-plugins#507 remains blocked on #400. Do not consume #659 for zara-shell test/build composition yet; cancellation authority is still incomplete. Plugins must not import private Core/backend/tool state or create parallel registries/runtimes.
blockers: Production still needs a bounded Core-owned turn-validity/lease contract tied to existing RuntimeHost/TurnCoordinator authority so cancellation-before-registration fails atomically and plugin code cannot forge or omit turn correlation for turn-scoped composition. Do not solve this with an unbounded cancelled-turn string set, plugin/model metadata, a second runtime/coordinator, or Prolog-RLM side-effect authority.
next_mode: IMPLEMENT
next_target: Continue #400 on draft PR #659 from RED head 9e77fcce9a01feddb67d87b9b61043c0004f8e07: wire the smallest RuntimeHost/TurnCoordinator-owned turn validation/lease seam into PluginManager registration, remove raw caller turn strings as cancellation authority for turn-scoped composition, make the new RED pass without regressing active-call cancellation/lifecycle leases/principal-capability authorization, then run focused + full repo/Nix/package/Android/shared-mic exact-head gates before REVIEW.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Added the deterministic RED regression for the REVIEW-found cancel-before-registration race on Core #400 / draft PR #659. The new test cancels `turn-1` before composition registration, then proves a later invocation for that stale turn must fail before the underlying capability executor runs. No production workaround was added in this loop because a raw tombstone set alone would be an unbounded long-lived-daemon leak and would still leave caller-forged/omitted turn correlation as authority; the production fix must tie registration to existing RuntimeHost/TurnCoordinator-owned turn validity rather than inventing a second coordinator. issue_or_pr: Core #400; draft PR #659; worker #623; prior blocking review comment 5576900609 refs: roadmap #1 reconciliation comment 5566663947; Android #622/#152/#194; zara-plugins #507; exact-head prior green CI 34164920330; new RED CI 34174536264 head: `9e77fcce9a01feddb67d87b9b61043c0004f8e07` tests: Tests-first commit `9e77fcce9a01feddb67d87b9b61043c0004f8e07` adds `test_turn_cancellation_before_registration_fails_closed` in `t/test_plugin_capability_authorization_cancellation.py`. CI run `34174536264` is in progress at this exact head; Arch shared-mic is already green, while repository tests, Android skeleton gate, and Ubuntu shared-mic were still running at checkpoint. This commit is intentionally RED against current `PluginManager.cancel_capability_turn()`, which only marks already-active invocations and stores no authoritative cancelled/invalid turn state. android_tests: No Android source changed. Prior exact-head `45f93ab6d980b45e28bcf47db6c3c10c6233ce98` remains fully green in run `34164920330` for Android unit/native Trealla/debug APK/secret inspection plus both shared-mic lanes. Offline-first #622 remains downstream of this Core blocker and still requires one shared local/remote runtime abstraction; SmartThings #194 keeps credentials/OAuth/refresh server-side; Android continues to reuse shared semantic/runtime contracts. core_tests: Prior exact head `45f93ab6d980b45e28bcf47db6c3c10c6233ce98` is green. Current source still accepts optional raw caller-provided `turn_id` in `PluginRuntime.invoke_capability()` and `PluginManager._invoke_capability()`, and `cancel_capability_turn()` only mutates matching entries already in `_active_capability_invocations`. RED now captures the pre-registration half of that defect. No direct master commit and no merge. plugin_handoffs: zara-plugins#507 remains blocked on #400. Do not consume #659 for `zara-shell` test/build composition yet; cancellation authority is still incomplete. Plugins must not import private Core/backend/tool state or create parallel registries/runtimes. blockers: Production still needs a bounded Core-owned turn-validity/lease contract tied to existing RuntimeHost/TurnCoordinator authority so cancellation-before-registration fails atomically and plugin code cannot forge or omit turn correlation for turn-scoped composition. Do not solve this with an unbounded cancelled-turn string set, plugin/model metadata, a second runtime/coordinator, or Prolog-RLM side-effect authority. next_mode: IMPLEMENT next_target: Continue #400 on draft PR #659 from RED head `9e77fcce9a01feddb67d87b9b61043c0004f8e07`: wire the smallest RuntimeHost/TurnCoordinator-owned turn validation/lease seam into PluginManager registration, remove raw caller turn strings as cancellation authority for turn-scoped composition, make the new RED pass without regressing active-call cancellation/lifecycle leases/principal-capability authorization, then run focused + full repo/Nix/package/Android/shared-mic exact-head gates before REVIEW.
Author
Owner

WORKER_STATE
worker: core-android
mode_used: IMPLEMENT
result: Re-read mailbox/roadmap/current Core #400 + draft PR #659 source and completed the tests-first RED verification for the cancel-before-registration slice. Exact-head CI run 34174536264 at 9e77fcce9a01feddb67d87b9b61043c0004f8e07 failed exactly one repository test: t.test_plugin_capability_authorization_cancellation::test_turn_cancellation_before_registration_fails_closed (DID NOT RAISE RuntimeError). JUnit reports 2,134 tests, 1 failure, 0 errors, 0 skipped. Android skeleton and both shared-mic lanes are green. No production workaround was committed in this loop because current source confirms a bounded tombstone alone would only close the already-RED race while leaving plugin-facing raw/optional turn_id as forgeable/omittable authority; the next production slice must be tied to the existing RuntimeHost/TurnCoordinator authority, not a second coordinator or an unbounded string set.
issue_or_pr: Core #400; draft PR #659; worker #623; roadmap #1
head: 9e77fcce9a01feddb67d87b9b61043c0004f8e07
android_tests: Exact-head CI 34174536264: android skeleton gate SUCCESS (unit tests + native Trealla + debug APK + secret inspection); shared mic Ubuntu 24.04 SUCCESS; shared mic Arch Linux SUCCESS. No Android source changed; #622/#152/#194 remain behind Core #400 in this worker queue.
core_tests: Exact-head repository test job failed only at the intended RED regression. JUnit artifact: 2,134 tests, 1 failure, 0 errors, 0 skipped. Failure is exactly cancel-before-registration: after manager.cancel_capability_turn("turn-1"), a later _invoke_capability(..., turn_id="turn-1") reaches execution instead of failing stale. Current PluginManager.cancel_capability_turn() only marks entries already present in _active_capability_invocations; PluginRuntime.invoke_capability() still accepts optional caller-provided raw turn_id. Existing RuntimeHost cancellation does forward canonical CancelTurn/task cancellation into PluginManager, and TurnCoordinator remains sole owner of turn lifecycle.
plugin_handoffs: zara-plugins#507 remains blocked on #400. The future seam must preserve zara-shell test/build cancellation through Core while keeping caller capability allowlists, principal equality, approval rechecks, generation/lifecycle leases, and no private backend/tool imports or parallel runtime. SmartThings credentials stay server-side; Core gets no Prolog-RLM runtime dependency; Android continues to reuse shared semantic/runtime contracts.
blockers: Production fix still required. Smallest evidence-supported design: add a bounded cancel-before-registration fence plus a Core/RuntimeHost-supplied validator/lease against the existing TurnCoordinator so production turn-scoped composition rejects omitted, unknown/forged, and cancelled correlation before tool execution. Do not treat raw plugin-supplied strings as authority and do not create a second turn registry/coordinator. Then add explicit RED coverage for omitted/unknown correlation, wire the validator/lease, and run focused + full repo/Nix/package/Android/shared-mic gates.
evidence: CI run 34174536264; regression artifact 10036884989; JUnit exact failure test_turn_cancellation_before_registration_fails_closed; current branch source zara/plugins/manager.py, zara/plugins/api.py, zara/runtime/host.py; roadmap #1; Core #400.
next_mode: IMPLEMENT
next_target: Continue #400 / PR #659 on the existing focused branch: add RED tests for omitted and unknown/forged turn correlation, then implement the bounded cancel fence + RuntimeHost/TurnCoordinator-owned turn-validity seam, preserving existing principal/capability/approval/lifecycle contracts. Run exact-head full gates before returning to REVIEW.

WORKER_STATE worker: core-android mode_used: IMPLEMENT result: Re-read mailbox/roadmap/current Core #400 + draft PR #659 source and completed the tests-first RED verification for the cancel-before-registration slice. Exact-head CI run `34174536264` at `9e77fcce9a01feddb67d87b9b61043c0004f8e07` failed exactly one repository test: `t.test_plugin_capability_authorization_cancellation::test_turn_cancellation_before_registration_fails_closed` (`DID NOT RAISE RuntimeError`). JUnit reports 2,134 tests, 1 failure, 0 errors, 0 skipped. Android skeleton and both shared-mic lanes are green. No production workaround was committed in this loop because current source confirms a bounded tombstone alone would only close the already-RED race while leaving plugin-facing raw/optional `turn_id` as forgeable/omittable authority; the next production slice must be tied to the existing RuntimeHost/TurnCoordinator authority, not a second coordinator or an unbounded string set. issue_or_pr: Core #400; draft PR #659; worker #623; roadmap #1 head: `9e77fcce9a01feddb67d87b9b61043c0004f8e07` android_tests: Exact-head CI `34174536264`: `android skeleton gate` SUCCESS (unit tests + native Trealla + debug APK + secret inspection); shared mic Ubuntu 24.04 SUCCESS; shared mic Arch Linux SUCCESS. No Android source changed; #622/#152/#194 remain behind Core #400 in this worker queue. core_tests: Exact-head repository `test` job failed only at the intended RED regression. JUnit artifact: 2,134 tests, 1 failure, 0 errors, 0 skipped. Failure is exactly cancel-before-registration: after `manager.cancel_capability_turn("turn-1")`, a later `_invoke_capability(..., turn_id="turn-1")` reaches execution instead of failing stale. Current `PluginManager.cancel_capability_turn()` only marks entries already present in `_active_capability_invocations`; `PluginRuntime.invoke_capability()` still accepts optional caller-provided raw `turn_id`. Existing RuntimeHost cancellation does forward canonical CancelTurn/task cancellation into PluginManager, and TurnCoordinator remains sole owner of turn lifecycle. plugin_handoffs: zara-plugins#507 remains blocked on #400. The future seam must preserve zara-shell test/build cancellation through Core while keeping caller capability allowlists, principal equality, approval rechecks, generation/lifecycle leases, and no private backend/tool imports or parallel runtime. SmartThings credentials stay server-side; Core gets no Prolog-RLM runtime dependency; Android continues to reuse shared semantic/runtime contracts. blockers: Production fix still required. Smallest evidence-supported design: add a bounded cancel-before-registration fence plus a Core/RuntimeHost-supplied validator/lease against the existing TurnCoordinator so production turn-scoped composition rejects omitted, unknown/forged, and cancelled correlation before tool execution. Do not treat raw plugin-supplied strings as authority and do not create a second turn registry/coordinator. Then add explicit RED coverage for omitted/unknown correlation, wire the validator/lease, and run focused + full repo/Nix/package/Android/shared-mic gates. evidence: CI run `34174536264`; regression artifact `10036884989`; JUnit exact failure `test_turn_cancellation_before_registration_fails_closed`; current branch source `zara/plugins/manager.py`, `zara/plugins/api.py`, `zara/runtime/host.py`; roadmap #1; Core #400. next_mode: IMPLEMENT next_target: Continue #400 / PR #659 on the existing focused branch: add RED tests for omitted and unknown/forged turn correlation, then implement the bounded cancel fence + RuntimeHost/TurnCoordinator-owned turn-validity seam, preserving existing principal/capability/approval/lifecycle contracts. Run exact-head full gates before returning to REVIEW.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
nsaspy/zara#346
No description provided.