Repository navigation
feat(ecosystem): continuous sprint 1-4 (dot lattice, comms feed, tasker autonomy) - #38
Conversation
…comms loop, sovereign tasker autonomy
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved critical security, startup, side-effect, and data-integrity issues block approval.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
Extends uCore with vector lattice quantization, host communications sync, and approval-gated Tasker autonomy.
Changes:
- Adds lattice, Teletext, and BOB quantization APIs.
- Adds Mail, iMessage, Reminders, and sync-status integrations.
- Adds Tasker workflow controls, API clients, and backend tests.
File summaries
| File | Description |
|---|---|
frontend-vue/src/surfaces/workflow/panels/TasksPanel.vue |
Adds sync and action-approval controls. |
frontend-vue/src/surfaces/browserui/ApiBridge.ts |
Adds autonomy and Reminders API clients. |
frontend-vue/src/stores/workflow.ts |
Extends task metadata. |
backend/tests/test_vector_lattice.py |
Tests vector quantization APIs. |
backend/tests/test_tasker_autonomy.py |
Tests Tasker workflows. |
backend/tests/test_host_communications.py |
Tests host integrations. |
backend/app/services/task_action_bridge.py |
Implements task/action lifecycle and syncing. |
backend/app/services/host_pim.py |
Implements communications and PIM sync. |
backend/app/api/vector_api.py |
Provides quantization endpoints. |
backend/app/api/tasker_api.py |
Registers Tasker endpoints. |
backend/app/api/host_api.py |
Registers host communications endpoints. |
.gitignore |
Ignores uv.lock. |
Review details
Suppressed comments (10)
backend/app/api/host_api.py:267
- The new intake handler only returns the raw Apple Mail rows; it does not pass them through the existing
AppleFeedSync/FeedServeringestion path. Consequently, calling this endpoint does not add Mail activity to the unified feed described by the PR, and the same gap exists for the adjacent iMessage intake handler.
svc = get_host_pim_service()
res = svc.intake_apple_mail(limit=limit, unread_only=unread_only)
return web.json_response(res, status=200 if res.get("ok") else 500)
backend/app/api/tasker_api.py:690
- The PR description says feed activities are automatically converted into tasks, but this only adds a manually callable endpoint. The existing feed ingestion path invokes
FeedConsumer, whose trigger currently writes spool entries; it never callsTaskActionBridge.action_to_task, so normal feed events will not create these tasks.
app.router.add_post("/api/workflow/tasks/action-to-task", handle_action_to_task)
backend/app/api/vector_api.py:837
superis a supportedcell_mode, but its register lives underDOT_LATTICE_SPEC["super_cell"], notcell_registers. This expression therefore returns the fallback{dots_w: 1, dots_h: 1}for a valid super-cell request instead of the advertised 6x10 register.
"spec": DOT_LATTICE_SPEC["cell_registers"].get(cell_mode, {"dots_w": 1, "dots_h": 1}),
backend/app/services/host_pim.py:861
online_peersincludes the registry's local node, which is always registered as online. This makes the health endpoint report at least one peer even when no other LAN peer exists; exclude entries withis_localfrom the peer count.
peers = reg.get_peers()
peer_count = len([p for p in peers if p.get("status") == "online"])
backend/app/services/host_pim.py:881
- Mail is only implemented as an intake path in this change; archive/flag actions are not bidirectional mail synchronization. Reporting
bidirectional: truemakes the new status endpoint advertise an outbound capability that does not exist.
"mail": {
"available": host_native.get("mail", {}).get("available", False),
"bidirectional": True,
},
backend/app/services/task_action_bridge.py:177
- Reject is also unconditional: an already executed or approved action can be changed to
rejectedafter its side effect has occurred. Check the current approval state and allow rejection only frompending_approval(or define and enforce an explicit transition table).
_update_task_file(
base=base,
task_id=task_id,
patch={"approval_status": "rejected", "rejection_reason": reason},
frontend-vue/src/surfaces/workflow/panels/TasksPanel.vue:423
- The single-task payload uses
notes,due_date, andlist_name, buthandle_sync_task_reminderspasses it toexecute_action, which readsbody,due, andbinder. The UI therefore drops the supplied notes/list/due values whenever the task file is unavailable or stale; send the action payload keys that the backend consumes.
await syncTaskReminders(task.id, {
title: task.title,
notes: task.description || "",
due_date: task.due,
list_name: task.binder || "uDos",
frontend-vue/src/surfaces/workflow/panels/TasksPanel.vue:1126
- The executed badge also hardcodes the success color in both its mix and text. Use the USX success token so the new status indicator remains readable and theme-consistent.
background: color-mix(in srgb, #10b981 15%, transparent);
color: #10b981;
frontend-vue/src/surfaces/workflow/panels/TasksPanel.vue:1097
- This new action group repeats the non-USX
--space-2token. Use a USX spacing token so the editor action layout remains consistent with the rest of the workflow surface.
gap: var(--space-2, 0.5rem);
frontend-vue/src/surfaces/workflow/panels/TasksPanel.vue:1124
- The executed badge hardcodes its gap, font size, padding, and radius instead of using USX tokens. This produces a second theme-inconsistent status style alongside the raw colors below; use the shared USX spacing, typography, and radius tokens.
gap: 0.25rem;
font-size: 0.7rem;
padding: 0.15rem 0.4rem;
border-radius: var(--usx-radius-sm, 4px);
- Files reviewed: 11/12 changed files
- Comments generated: 25
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| app.router.add_post("/api/host/mail/intake", handle_mail_intake) | ||
| app.router.add_post("/api/host/imessage/intake", handle_imessage_intake) | ||
| app.router.add_get("/api/host/sync/status", handle_sync_status) |
| try: | ||
| body = await request.json() if request.body_exists else {} | ||
| except Exception: | ||
| body = {} |
| app.router.add_post("/api/workflow/tasks/{task_id}/approve", handle_approve_task_action) | ||
| app.router.add_post("/api/workflow/tasks/{task_id}/reject", handle_reject_task_action) | ||
| app.router.add_post("/api/workflow/tasks/{task_id}/execute-action", handle_execute_task_action) |
| app.router.add_post("/api/workflow/tasks/action-to-task", handle_action_to_task) | ||
| app.router.add_post("/api/workflow/tasks/{task_id}/actions", handle_link_task_action) | ||
| app.router.add_post("/api/workflow/tasks/{task_id}/approve", handle_approve_task_action) | ||
| app.router.add_post("/api/workflow/tasks/{task_id}/reject", handle_reject_task_action) | ||
| app.router.add_post("/api/workflow/tasks/{task_id}/execute-action", handle_execute_task_action) |
| # 2. Python fallback generator | ||
| lines = [] | ||
| for r in range(25): | ||
| if r in (0, 24): | ||
| line = "█" * 40 |
| gap: var(--space-1, 0.25rem); | ||
| padding: 0.25rem 0.5rem; | ||
| font-size: 0.75rem; | ||
| border-radius: var(--usx-radius-sm, 4px); |
| gap: var(--space-2, 0.5rem); | ||
| padding: 0.35rem 0.75rem; | ||
| margin-bottom: var(--space-2, 0.5rem); | ||
| font-size: 0.75rem; | ||
| border-radius: var(--usx-radius-sm, 4px); |
| background: color-mix(in srgb, #10b981 12%, transparent); | ||
| color: #10b981; | ||
| border: 1px solid color-mix(in srgb, #10b981 30%, transparent); |
| gap: 0.25rem; | ||
| padding: 0.25rem 0.6rem; | ||
| font-size: 0.75rem; | ||
| font-weight: 500; | ||
| border-radius: var(--usx-radius-sm, 4px); |
| border: 1px solid #10b981; | ||
| background: #10b981; | ||
| color: #ffffff; |
Continuous Sprint: Track 1, Track 2, Tasker Autonomy & Ecosystem Standards
Summary of Implementations
Phase 1: GridCore Dot Lattice & Vector-to-Bitmap (V2B) Quantizer
/api/vector/lattice/spec,/api/vector/quantize/lattice,/api/vector/quantize/teletext-g1,/api/vector/quantize/bob.backend/tests/test_vector_lattice.py(4 passed).Phase 2: Unified Communications Feed & Inbound/Outbound Loop
POST /api/host/mail/intake) and iMessage intake (POST /api/host/imessage/intake).POST /api/host/reminders/sync-outbound).GET /api/host/sync/status) tracking Apple PIM, Google Drive mirror, and BitChat mesh LAN health.backend/tests/test_host_communications.py(5 passed).Phase 3: Sovereign Tasker System (Action-to-Task & Task-to-Action Autonomy)
.taskermarkdown tasks with due dates and suggested actions.pending_approval->approved->executed)./api/workflow/tasks/action-to-task,/api/workflow/tasks/{id}/actions,/api/workflow/tasks/{id}/approve,/api/workflow/tasks/{id}/reject,/api/workflow/sync/apple-reminders/inbound,/api/workflow/sync/apple-reminders/outbound.TasksPanel.vueandApiBridge.ts.backend/tests/test_tasker_autonomy.py(5 passed).Phase 4: Ecosystem Cleanup, Standards & Release Hardening
~/Public/global-knowledge/standards/:GRIDCORE-LATTICE-SPEC.mdandCOMMUNICATIONS-LOOP-SPEC.md.python3 scripts/check_home_path_policy.py).