Skip to content

feat(ecosystem): continuous sprint 1-4 (dot lattice, comms feed, tasker autonomy) - #38

Merged
fredporter merged 1 commit into
mainfrom
feat/sprint-1-2-3-dot-lattice-comms-tasker
Sep 15, 2026
Merged

fredporter merged 1 commit into
mainfrom
feat/sprint-1-2-3-dot-lattice-comms-tasker

Conversation

@fredporter

Copy link
Copy Markdown
Owner

Continuous Sprint: Track 1, Track 2, Tasker Autonomy & Ecosystem Standards

Summary of Implementations

  1. Phase 1: GridCore Dot Lattice & Vector-to-Bitmap (V2B) Quantizer

    • 1 dot = 4x4 px device coordinate invariant.
    • Standardized cell registers: Square (\times 8$), Tall (\times 20$), Super Cell (\times 40$).
    • Endpoints: /api/vector/lattice/spec, /api/vector/quantize/lattice, /api/vector/quantize/teletext-g1, /api/vector/quantize/bob.
    • Unit tests: backend/tests/test_vector_lattice.py (4 passed).
  2. Phase 2: Unified Communications Feed & Inbound/Outbound Loop

    • Non-invasive Apple Mail intake (POST /api/host/mail/intake) and iMessage intake (POST /api/host/imessage/intake).
    • Outbound Reminders sync (POST /api/host/reminders/sync-outbound).
    • Aggregated system sync status endpoint (GET /api/host/sync/status) tracking Apple PIM, Google Drive mirror, and BitChat mesh LAN health.
    • Unit tests: backend/tests/test_host_communications.py (5 passed).
  3. Phase 3: Sovereign Tasker System (Action-to-Task & Task-to-Action Autonomy)

    • Automatic conversion of feed activities into sovereign .tasker markdown tasks with due dates and suggested actions.
    • Explicit human approval gates (pending_approval -> approved -> executed).
    • Endpoints: /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.
    • Vue frontend: Reminders sync button, action execution & approval button in TasksPanel.vue and ApiBridge.ts.
    • Unit tests: backend/tests/test_tasker_autonomy.py (5 passed).
  4. Phase 4: Ecosystem Cleanup, Standards & Release Hardening

    • Canonical standards published to ~/Public/global-knowledge/standards/: GRIDCORE-LATTICE-SPEC.md and COMMUNICATIONS-LOOP-SPEC.md.
    • Verified Home Path Policy (python3 scripts/check_home_path_policy.py).
    • Full test suite passed: 29 pytest tests, 108 vitest tests, 26 cargo tests.

Copilot AI lite review requested due to automatic review settings September 15, 2026 22:40
@fredporter
fredporter merged commit a275356 into main Sep 15, 2026
4 checks passed
@fredporter
fredporter deleted the feat/sprint-1-2-3-dot-lattice-comms-tasker branch September 15, 2026 22:41

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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/FeedServer ingestion 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 calls TaskActionBridge.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

  • super is a supported cell_mode, but its register lives under DOT_LATTICE_SPEC["super_cell"], not cell_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_peers includes 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 with is_local from 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: true makes 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 rejected after its side effect has occurred. Check the current approval state and allow rejection only from pending_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, and list_name, but handle_sync_task_reminders passes it to execute_action, which reads body, due, and binder. 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-2 token. 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.

Comment on lines +325 to +327
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)
Comment on lines +607 to +610
try:
body = await request.json() if request.body_exists else {}
except Exception:
body = {}
Comment on lines +692 to 694
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)
Comment on lines +690 to 694
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)
Comment on lines +883 to +887
# 2. Python fallback generator
lines = []
for r in range(25):
if r in (0, 24):
line = "█" * 40
Comment on lines +1066 to +1069
gap: var(--space-1, 0.25rem);
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
border-radius: var(--usx-radius-sm, 4px);
Comment on lines +1084 to +1088
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);
Comment on lines +1089 to +1091
background: color-mix(in srgb, #10b981 12%, transparent);
color: #10b981;
border: 1px solid color-mix(in srgb, #10b981 30%, transparent);
Comment on lines +1103 to +1107
gap: 0.25rem;
padding: 0.25rem 0.6rem;
font-size: 0.75rem;
font-weight: 500;
border-radius: var(--usx-radius-sm, 4px);
Comment on lines +1108 to +1110
border: 1px solid #10b981;
background: #10b981;
color: #ffffff;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants