All docs · North OS2026-09-10

External task tools — scheduler removal cutover

Implemented under the documented waivers; not merged or deployed. Feature code is complete; the latest authorized integration of origin/main (e9f6e9b7) into 8e6addd8 is pending CI. North supplies composable tools; Claude, ChatGPT, or another MCP host owns scheduling. This removes North's scheduler, rather than hiding it behind a flag. Existing jobs stop at the separately authorized deployment. No external schedule is configured.

Qualified successor, approved 2026-09-10: Organization-managed Outlook mailboxes and its plan restore real delegated read/send capability through separate managed identities, credentials and member grants. The dead scheduler grants, account-kind controls, /delegation and list_manageable_mailboxes remain removed; personal-mail defaults remain. This qualifies the historical “no replacement” boundary below, not the scheduler retirement. User-reported PR #415 cutover head 2a20299b11 has green Actions; earlier pending-CI checkpoints below are historical. The new capability is uncommitted/unverified and in progress, not covered by that CI. The existing lane plan/dual-review waiver remains; the user now explicitly authorizes the Devin/Fable worker route over the earlier Astra-only preference. No merge/deploy authorization.

Decision and provenance

This supersedes the scheduler/profile architecture in the 2026-08-25 modular intake design (especially §3.4 and §8) and its implementation plan. Their implementation and review evidence remain historical facts, not instructions to rebuild that runtime. The successor execution record is the cutover plan.

The 2026-09-09 decision was “no profiles, only the agent's choices”; the 2026-09-10 approval resolves the earlier remove-versus-disable question in favor of removal. The existing lane authorization recorded in .claude/handoff/automation-tools-lane.md still waives plan review and dual review for this lane only. Visible Astra workers are an explicit user request. Neither waiver authorizes merge or deployment.

Historical product cutover b83538ba atop f238fb72 covers 310 files (+2,440/−54,769). PR #415 targets main and includes #412's ancestor work; #412 is closed unmerged, with its branch retained. Earlier commits 977d1338 (#412) and 1d7b4659 (#415) remain provenance, not current CI proof. The first user-authorized main integration completed at 6e7aae6a, without rebase or force push. After all nine Actions passed on 8e6addd8, main advanced to e9f6e9b7; the user authorized another main-into-feature integration without rewriting history. No PR merge or deployment is authorized here.

Generic task catalogue

The task-facing MCP catalogue is fourteen tools, not fourteen tools in the entire server. No closed intake profile, scheduled-run context, or scheduler registration is required. Existing authentication and capability checks still apply.

CapabilityRegistered MCP namesContract
Personal Outlooknorth__mail_list_recent, north__mail_read_attachment, north__mail_sendRead the caller's mailbox and attachments; send explicit mail immediately. No confirmation step for sending.
Saved recordsnorth__record_save, north__record_list, north__record_readPersist and retrieve task content, including Markdown and metadata, without scheduling a run.
Wikinorth__wiki_list, north__wiki_search, north__wiki_read, north__wiki_create, north__wiki_update, north__wiki_publishCompose organization-scoped articles: search/read before create/update; publish to the knowledge corpus.
Personal filesnorth__drive_write_fileWrite text, bytes, or an attachment into nested folders under the caller's North Drafts only.
Newsletternorth__send_newsletterExplicit immediate send of a composed Markdown newsletter; never create a campaign or scheduled job.

Native record tools are save_record, list_records, and read_record. Native send_newsletter and MCP north__send_newsletter share the immediate-send contract. The generic record implementation lives in packages/agent-runtime/src/records.ts; the tool adapters do not depend on the retired scheduler package.

Records and immediate delivery

Removal and retained boundaries

Remove apps/worker-automations, packages/automations, the scheduled-newsletter runtime/package, due dispatch, execution/resume/retry machinery, intake profiles and dedicated intake/digest agents, automation board/navigation, scheduling and newsletter-management APIs/tools, and obsolete build/deploy/runtime references. No disabled-but-runnable scheduler remains. Ordinary chat and unrelated notification loops remain.

Keep stored schedules, runs, deliveries, records, and chat history; removal is not a data purge. Retained history reads must enforce both owner and organization authorization. Historical automation IDs and schema provenance are not permission to execute or resume old jobs.

Whole-code consumer tracing found no non-scheduler mailbox-grant authority consumer: the remaining lifecycle, settings display, and list_manageable_mailboxes only produced or displayed unusable consent. Account classification likewise had no login/auth or other operational consumer. Remove the entire /delegation page and navigation, account-kind toggle/API, exclusive transport/query/view helpers and tests, grant lifecycle/exports/catalogue/concurrency entries, and issue/revoke APIs and controls. No replacement page or shim. Preserve normal organization membership/admin/auth management, shared role helpers with live consumers, Outlook connections elsewhere, and personal mail tools. Historical member classification columns/rows, grant rows, schema/migrations, analytics historical types, and thread ownership/sharing stay untouched. This removes inert scheduler-origin settings, not a live capability.

Keep personal Microsoft file authorization while organization OneDrive ingestion is off. The existing personal connection is the authorization path: no new connect flow, no arbitrary drive folder outside North Drafts. Disconnecting the organization feeder continues to hide knowledge-reading tools on both native and MCP surfaces; personal file access is not corpus ingestion.

Operational retirement and acceptance

At the authorized rollout, disable, mask, and stop the old scheduler unit; synchronously stop the old newsletter sender in worker-notifications before switching code/traffic. Refuse cutover if either process remains active or deactivating. Restart notifications only from the new release, retaining unrelated notification functions. Never restart an old sender as recovery.

Refuse rollback to any pre-decommission release containing the scheduler or old firm-newsletter loop; roll forward instead. See the operational retirement contract. No live stop, mask, deployment, mailbox send, or OneDrive write was performed. Database verification used isolated fixtures. Exception: the initial broad test run used inherited R2 credentials for two real storage fixtures; their cleanup passed. The final broad rerun was sanitized. Do not describe the entire lane as having made no live-provider writes.

Acceptance covers removal of executable scheduler entry points, preserved data and read authorization, generic tools and explicit immediate newsletter send, and retirement/rollback refusal proof. The plan evidence records implementation closure under the documented review/eval waivers and baseline/environment exceptions. Implemented means feature code-complete, not merged or deployed. The current integration is pending CI; these evidence updates belong to it, with no subsequent status-only commit.

Earlier local proof — b83538ba

Orchestrator-supplied final evidence: root lint and typecheck passed 61 tasks each, including script typechecks; Next generated 57/57 pages. Orphan mailbox-grant and account-classification UI/API removal passed 117 focused web and 48 native tests. Stored history, database ownership, and owner/organization authorization remain preserved.

Coverage checks passed 11 tests; deterministic tool, protocol, and ownership smokes supply local evidence. The orchestrator waives live cheap eval for this decommission because no new retrieval/model quality behavior is claimed; live quality remains unverified. The documented 2 agent and 5 MCP baseline failures and environment-blocked eval remain, so neither full suites nor live eval are green. The original user waiver of plan and dual reviews still applies.

Latest main integration — current local proof, pending CI

Source e9f6e9b7766945042028410a3dbb58885dc580dc / PR #416 retires proactive screenshots. Preserve its retired-agent rejection before database/model work and retained agent catalogue, without restoring the removed scheduler/declaration engine. Auto-merged runtime, chat, and MCP behavior required no manual product fix. Conflict resolutions remain unstaged; no merge completion was performed.

Current isolated checks PASS: root lint and typecheck 61/61 tasks each, zero cached, plus script checks; sanitized Next build 57/57 pages; runtime/catalogue/newsletter 63 passed and 2 live tests skipped; chat 159; MCP 7 selected protocol fixtures and 10 discovery tests; changelog parser 3; docs preservation 3. The protocol suite was filtered, not fully passed. Chat used its in-process fallback after dummy Redis refusals, not real Redis proof. Lint, partial-graph mock, middleware-deprecation, and pdfjs-dist warnings remain. Exact commands and isolation limits are in the plan evidence.

Merge smoke PASS: 107 unique complete changelog entries preserve both parents' 106 entries; conflict markers are absent; generated status retains implemented semantics; the real Next manifest preserves remaining settings pages without Delegation/Automations. Protected Outlook recovery HTML checksums are unchanged. Historical all-nine Actions success on 8e6addd8, including retained-history CI, does not prove this latest integration. Devin remains a separate failure with no new published findings; all eight old threads remain resolved (two fixed, six rejected/superseded/waived), and the user waiver is unchanged. No later status-only commit is required.

Historical first main integration checkpoint — 2026-09-10

User-authorized origin/main (db803be4) into feature fc5ebb01 completed at 6e7aae6a, not a PR merge or deployment. Post-main local proof: root lint/typecheck passed 61/61 tasks each plus script typechecks; sanitized Next build generated 57/57 pages; focused web passed 123, native catalogue/concurrency/mail 57, personal-drive 54, changelog parser 3, and docs-status preservation 3. Changelog entries and incoming env-example values survive except the retired scheduler port.

Code CI on 6e7aae6a passed all nine GitHub Actions checks: build, lint-migrations, provenance-guard, quality, quality-code, quality-deploy, test, whisperx, worker-image-safety. Separately, Devin Review remains FAILURE (description: completed analysis in 4s), so gh pr checks still exits 1. No new review or inline findings since the earlier 16:01 checkpoint. All eight available threads were adjudicated/resolved: two actual drive issues fixed in fc5ebb01 (7 pre-fix failing reproductions, then 54 passing tests); six superseded/rejected/waived, evidenced by PR comments 5624056218 and 5624144267. The explicit 2026-09-09 user review waiver remains; the orchestrator treats this nonrequired external status as nonblocking under that waiver, not review convergence.

Deployment-env checks remain 5 passed, 1 failed: inherited DCC keys are appended without scrubbing; both parents have the omission at deploy/preprod/install.sh:46. This out-of-scope failure remains unfixed, not a passing gate. Dummy renderer smoke passed. Tests/build used fresh env -i dummy environments without live provider or shared DB/Redis operations. Dependency installation restored a workspace link without lockfile changes, but Bun 1.4 emitted a .env.local load notice despite --no-env-file; no secret values were printed. Baseline 2 agent/5 MCP failures, unverified live eval, and the earlier R2 exception remain documented. See the plan for historical proof and limits.