LiveCEO / Product Report
August 20, 2026 · branch chief/686fbed43c
Product vision · The Tasks tab

The tracker that drafts itself — and never moves without your yes.

Tasks is a Linear/Jira-class tracker built as a new LiveCEO tab — except it isn't a database waiting for humans to type into it. It reads the meetings, the Slack threads, and the merged PRs the company brain already ingests, and proposes the tasks, closes, and unblocks a good project manager would — every one a cited diff a human approves, edits, or dismisses.

Product: LiveCEO · liveceo.ai Anchor customer: Vortex Games Replaces: Linear · Jira Status: Proposal — grounded in verified code
18
features across 5 pillars
ranked impact-over-effort; every weak brainstorm idea was merged or cut
0
new infra services
every proactive loop rides an existing clock or webhook already live in production
T−30m
pre-meeting brief
posted to Slack before attendees sit down: open tasks, changes since last sync, agenda
T+10m
post-meeting proposals
task & decision drafts land minutes after the transcript finalizes, cited to the exact page
5
new Postgres tables
evidence, access control, delivery, and analytics all reuse tables that already exist
3
modes: overlay → mirror → master
Jira/Linear stay authoritative on day one; a project flips per-toggle once trust is earned
01Executive summary

Linear and Jira start every task from a blank box. We don't have to.

A human has to notice something happened — in Slack, in a meeting, in a merged PR — and manually transcribe it into a ticket, or it evaporates. LiveCEO already reads that content: Slack, email, meeting transcripts, Drive, code, and calendar flow into a per-org wiki the answer agent reads on every chat turn.

Tasks isn't a new database bolted next to that wiki — it's the same wiki, the same agent, and the same access-control graph, expressed as a tracker. Every task a producer sees was either typed by a human (still fully supported) or proposed by the agent with a citation back to the exact Slack message, transcript segment, or PR page that justified it — rendered as the same clickable wiki pill a chat answer already uses.

The go-to-market wedge is migration, not feature parity. Jira is already a read-only wiki source today (raw/jira/<project>/<issue>.md), ingested before a single tracker line of code exists. Tasks starts in overlay mode: every open issue in a pilot project appears instantly because the content was already there; edits sync back so Jira stays authoritative; a reconcile tick proves zero drift before anyone is asked to trust more. Weeks of zero-conflict adoption later, a project flips to master with one toggle. No forklift migration, no flag day, no re-typed backlog.

Everything that makes this a project manager rather than a database is structurally unavailable to Linear or Jira: no wiki to draft proposals from, no bot already in the meeting, no calendar fused to a knowledge graph, no headless agent running proactive turns on a clock. LiveCEO runs that exact loop twice in production today — the alerts engine's post-reindex sweep and the scheduled-jobs claim-and-run clock. Most of "AI project manager" is therefore integration work on proven infrastructure: the headline number is zero new backend services.

02Based on what we have

The rails are already laid — ten production subsystems, verified in code.

This vision was built bottom-up from a codebase audit, not top-down from a wishlist. Every proactive behavior below rides one of these shipping subsystems; the audit verified each at the file level.

Agent tool pattern, already shipped twice
Alerts and scheduled jobs register agent tools as zod-validated MCP handlers with the real DB write intercepted app-side. Task tools follow the identical three-part recipe.
src/lib/agentCore.ts · alertTool.ts · createSdkMcpServer
Proactive sweep engine
After every wiki reindex, the alerts engine dispatches scoped headless agent turns per item, with per-item error isolation and an append-only audit log. This is a proactive-nudge loop, live today.
src/lib/alertEval.ts · alert_events · runAgentTurnDispatched
Recurring clock with claim-and-run
Scheduled jobs claim due work (FOR UPDATE SKIP LOCKED) off an every-minute host tick, run an agent turn, persist the full output, and push to Slack/Telegram. The T−30 brief is one more tick.
src/lib/scheduledJobRun.ts · scheduled_job_runs
Meeting recording pipeline
A Recall.ai bot and native Google Meet webhooks already record, transcribe, and write every meeting into the wiki with speaker attribution. Live capture costs $0 of new build.
api/webhooks/recall · meetingMaterialization.ts
Calendar ingestion + identity graph
Google Calendar events are ingested per-org, and attendees resolve to wiki people entities — the same identity matching that powers assignee guessing for free.
src/lib/calendarSource.ts · matchWikiIdentity · calendarDataset.ts
Per-person access policy
One selector-based allow/deny graph governs wiki pages and alerts via a verified subset rule. Tasks stamp the same selectors — zero new permission code.
accessPolicy.ts · alertVisibility.ts · access_rules
Analytical lane
A dataset catalog plus a query_dataset SQL tool lets agent turns compose aggregate numbers with wiki evidence — the template for a privacy-safe tasks dataset.
datasetStore.ts · datasetQuery.ts · calendarDatasetSpec.ts
Slack bot with subscriber fan-out
Alerts and job runs already deliver to Slack channels via Block Kit. Adding buttons makes Slack a full action surface through one new webhook case.
src/lib/slackBot.ts · slack_alert_subscribers
Citations as first-class UI
Wiki paths render as clickable pills that open a reader panel — the exact experience a task's evidence trail reuses, down to the component.
Markdown.tsx · ReaderPanel.tsx · wikiPath.ts
Jira already flows into the wiki
Issues are ingested nightly as raw/jira/<project>/<issue>.md with issue-key parsing, and Composio holds Jira/Linear OAuth connectors — the overlay importer's foundation predates the tracker.
wikiPath.ts ISSUE_KEY_RE · integrations.ts · composio.ts

The app shell makes the new tab a one-line change: the icon rail hardcodes a TabId union (Chats, Dashboards, Alerts, Scheduled jobs, Graph, Integrations, Meeting recording) in src/components/TabRail.tsx, and src/app/tasks/page.tsx copies the alerts page's session/indexing guard template verbatim.

03Go-to-market

The wedge: Jira stays the boss — until it doesn't.

Nobody rips out their tracker for promises. So Tasks never asks: it starts as an AI overlay on data the wiki already ingests, earns trust one reconciled edit at a time, and becomes the master only when a team flips the switch per project.

1 · Overlay
Every open Jira/Linear issue appears in LiveCEO instantly — the wiki ingested it last night, so there is nothing to import. Edits push back; the source system stays authoritative. Zero configuration beyond "pick a project."
2 · Mirror
Bidirectional sync. A nightly reconcile diffs the freshly-pulled Jira page against the shadow row — the same durable-comparison pattern that guards meeting transcripts — and surfaces any drift instead of hiding it.
3 · Master
Weeks of zero-conflict adoption later, one toggle flips the project: new issues originate in LiveCEO, source write access is retired. No flag day, no re-typed backlog, no 40-field mapping exercise.
04The core mechanism

One loop powers every proactive feature: AI drafts, humans decide.

Meeting extraction, signal triage, stale-task nudges, status inference, dependency-slip flags — every producer feeds a single consumer, the Proposal Inbox. The loop is identical whether the signal is a Slack thread or a merged PR, which is what makes trust compound instead of resetting per feature.

1
Signal
A sweep notices something actionable — post-reindex for wiki content, post-transcript-finalize for meetings, post-webhook for PR merges. Always an event the platform already fires; never a blind poll.
2
Draft
A scoped headless agent turn — the same dispatch alerts and scheduled jobs use — drafts the concrete change: new task, status flip, unblock, reassignment. It never writes to the tasks table directly.
3
Evidence
Every draft carries the exact wiki paths it was read from — a Slack message, a transcript segment, a PR page — stored as evidence_paths and rendered as clickable citation pills.
4
Human decision
The draft lands as a diff (current → proposed) with three actions: approve, edit-then-approve, or dismiss-with-reason. Nothing touches the tasks table until a human acts.
5
Learn
Every decision is written to the append-only task_events log, so dismissal patterns tune future sweeps — and nothing is ever silently auto-applied.

↺ The loop closes on itself: what humans approve, edit, and dismiss becomes the evidence that sharpens the next round of drafts.

05Calendar-aware by design

Before and after every call, the tracker acts on its own.

The tracker doesn't wait for someone to open it around a meeting — it already reads the calendar and already has a bot in the room. Four beats, identical for every scheduled or ad-hoc recorded call. The meeting lifecycle is the tracker's primary intake, not an integration bolted onto one.

T−30 MIN
Brief
A cron tick scans calendar events starting in ~30 minutes, resolves attendees to wiki people, pulls each attendee's open tasks and what changed since the series' last occurrence, and posts a brief with a suggested agenda to the meeting's Slack channel.
T+0 · DURING
Live capture
The existing Recall.ai bot or Google Meet webhook records and transcribes exactly as it does today. No new bot, no new OAuth scope, no new infrastructure — this beat is already shipping. $0 new build.
T+10 MIN
Extraction
The instant the transcript lands in the wiki, a scoped agent turn reads just that page and proposes tasks (speaker-attributed, assignee-guessed, due-dated) and decisions — each citing the transcript path, with a line range where possible.
ONGOING
Follow-through
Proposals await confirm/edit/dismiss; approved decisions are written to entities/decisions/ — which the next occurrence's T−30 brief reads as "what changed since last sync," closing the loop from one meeting into the next.
06The feature set

18 features across 5 pillars.

Four brainstorm lenses — proactivity, meeting lifecycle, one-ecosystem superpowers, and Linear/Jira parity — were synthesized, deduplicated, and ranked by impact over effort. Here is everything that survived, with the phase it ships in.

FeaturePillarPhaseEffortImpact
T−30 Pre-Meeting BriefMeeting LifecycleP1M●●●●● 5/5
Post-Meeting Task Extraction (T+10m)Meeting LifecycleP1L●●●●● 5/5
Unified Proposal InboxProposal EngineP1M●●●●● 5/5
Tasks/Projects Schema + Agent ToolsCore TrackerP1M●●●●● 5/5
Keyboard-First List + BoardCore TrackerP1M●●●● 4/5
Evidence-Linked Tasks (Provenance)One EcosystemP1M●●●●● 5/5
Overlay-First Importer + Sync BridgeMigration & ReachP1L●●●●● 5/5
Signal-to-Task Proposal SweepProposal EngineP2M●●●●● 5/5
Evidence-Based Stale Task NudgeProposal EngineP2M●●●● 4/5
Duplicate & Already-Done DetectionCore TrackerP2S●●●● 4/5
Access-Scoped Task VisibilityCore TrackerP2S●●●●● 3/5
Ask-the-Tracker + Velocity DatasetOne EcosystemP2M●●●●● 5/5
Status Truth EngineMigration & ReachP2L●●●●● 5/5
Slack Action SurfaceMigration & ReachP2S●●●●● 3/5
Dependency-Slip RadarProposal EngineP3L●●●●● 5/5
Decision Log Auto-ExtractionMeeting LifecycleP3M●●●● 4/5
Recurring-Meeting Health ScoreMeeting LifecycleP3M●●●● 4/5
Leadership Risk DashboardsOne EcosystemP3M●●●● 4/5
PILLAR A

Meeting Lifecycle

The tracker that's already in the room — before the call starts and after it ends.

T-Minus-30 Pre-Meeting Brief

Phase 1Effort M●●●●● 5/5

30 minutes before any recorded meeting, Slack gets a brief of attendees' open work and a suggested agenda — nobody asked for it.

A cron tick modeled on the scheduled-jobs claim-and-run clock scans calendar events starting in the next ~25–35 minutes, resolves attendees to wiki people via the calendar's identity matching, pulls each attendee's open tasks, runs a scoped agent turn to summarize what changed since the series' last occurrence, and posts the result to the meeting's Slack channel through the existing bot.

At Vortex Games

The weekly Art Pipeline Sync is Tuesday 10am, Recall-recorded. At 9:30, #art-pipeline gets: "Art Pipeline Sync in 30 min. Maria — finalize creature shader budget (overdue 2 days). Dae-Ho — fix texture streaming crash on PS5 (in progress). Since last sync: decision logged to switch to Nanite for hero assets. Suggested agenda: 1) shader budget 2) Nanite rollout blockers 3) streaming crash root cause." Maria walks in already knowing what's overdue instead of reconstructing it from memory.

Why Linear/Jira can't

They have no calendar awareness and no company-wide knowledge base to pull "what changed since last sync" from — this requires the calendar-plus-wiki fusion only LiveCEO already has.

Builds oncalendarSource.ts matchWikiIdentitycalendarDataset.tsalertEval.ts dispatch patternslackBot.tsrefresh-tick.mjs (new meeting-briefs-due tick)

Post-Meeting Task Extraction (T+10m)

Phase 1Effort L●●●●● 5/5

The instant a transcript finalizes, the agent reads it and proposes tasks — with a speaker, a due date, and a citation to the exact transcript page.

Hooks into the Recall webhook right after it writes raw/meetings/<month>/<date>-<botId>.md and kicks the incremental index. A scoped agent turn reads just that page, extracts explicit commitments using speaker-segment attribution, resolves names to people entities via the same identity matching calendar sync uses, and writes proposal rows — never live tasks. The identical trigger fires on the Google Meet webhook path and on ad-hoc "Record Now" calls with no calendar event behind them.

At Vortex Games

During the weekly Milestone Review, producer Maria says "Priya, can you get the updated character rig to the build by Thursday" and Priya replies "yep, Thursday." Minutes after the transcript finalizes, a proposal appears: "Deliver updated character rig for Alpha build — Priya — due Thu 08-22," citing the exact page. Priya gets a Slack DM to confirm before anyone would normally type up meeting notes.

Why Linear/Jira can't

They need a human to type tickets after a call, or a bolted-on transcript app with no idea who "Priya" is in the org — here the same identity resolution used for calendar sync powers assignee guessing for free.

Builds onwebhooks/recall transcript.donerecallIngest.ts speaker segmentswebhooks/google-meetmeeting-recording/record-nowmatchWikiIdentity

Decision Log Auto-Extraction

Phase 3Effort M●●●● 4/5

Decisions made out loud get written to a durable wiki page — the exact source the next T−30 brief reads from.

The same T+10m extraction turn, run for decisions instead of action items: outputs entities/decisions/<slug>.md (title, decided-by, date, rationale, transcript citation, linked task) via the existing wiki-write path, closing the loop the pre-meeting brief consumes as "what changed since last sync."

At Vortex Games

Someone says "let's cut co-op mode for launch and ship it as a post-launch patch." The extraction writes entities/decisions/cut-coop-for-launch.md, linked to the auto-proposed "ship co-op patch" task and cited to the transcript moment. Three weeks later the CEO asks chat "why did we cut co-op?" and gets a cited, dated answer instead of someone's fuzzy memory.

Why Linear/Jira can't

Decisions-as-wiki-entities, bidirectionally linked to tasks, are structurally impossible in a tracker with no company knowledge base to write into — a decision log there is at best a doc nobody updates.

Builds onshared extraction turnwikiBuild.ts write pathwikiPath.ts (new entities/decisions taxonomy)

Recurring-Meeting Health Score

Phase 3Effort M●●●● 4/5

Every standing meeting gets a rolling scorecard — held, proposed, completed — plus a one-time flag the moment one produces literally nothing.

Groups meetings by the calendar's recurring-event ID into a series, joins against tasks and decisions sourced from each occurrence's transcript, and computes a 4-week rolling completion rate exposed as a queryable meeting_health dataset. A cheaper per-occurrence check flags "transcript finalized, extraction ran, zero outcomes" the same day with a once-only nudge to the organizer.

At Vortex Games

The CEO asks chat "which standing meetings are wasting time?" and gets: "Weekly Live Ops Sync has held 6/6 occurrences but closed only 1 of 14 proposed tasks (7%) — Art Pipeline Sync is at 64%." Separately, a biweekly sync that was 40 minutes of pure status updates gets a same-day "No outcomes" tag, and the organizer gets one nudge instead of the meeting silently vanishing into the transcript archive.

Why Linear/Jira can't

Calendar cadence × transcript-derived outcomes literally cannot exist in a tool that never sees the calendar or the meeting audio — "this meeting produced nothing" isn't even a concept a ticket database can represent.

Builds oncalendarDatasetSpec.tsmeetingMaterialization.ts reconcile patterndatasetQuery.tstask_events
PILLAR B

Proposal Engine

Every AI-drafted change — new task, unblock, close, reassign — is one diff in one inbox, and nothing moves until a human taps approve.

Unified Proposal Inbox

Phase 1Effort M●●●●● 5/5

One inbox for every AI-drafted task action, rendered as a diff with a citation — the structural piece Linear/Jira have no concept of at all.

A /tasks/proposals view lists every pending proposal across every producing feature — meeting extraction, signal triage, stale nudges, status inference, dependency-slip flags — each rendered as current-state → proposed-state with its evidence as a clickable wiki pill, and three actions: approve, edit-then-approve, dismiss-with-reason. Approving calls the same write path a typed chat command uses. A daily digest of the same data pushes to Slack every weekday morning via the existing delivery path.

At Vortex Games

Maria opens Monday's inbox: 6 pending — 2 auto-triaged bugs, 1 meeting action-item for Priya, 1 stale-task unblock for Dan, 1 auto-close for a merged PR, 1 dependency-slip flag on Alpha 0.9. She approves the bugs, edits the action-item's due date (Priya mentioned a dentist appointment in the same meeting), approves the unblock and the close, dismisses the slip flag with a note — under two minutes, every decision auditable forever because each proposal keeps its citation.

Why Linear/Jira can't

No agent reads their data to generate proposals in the first place, so an AI-authored, evidence-cited, diffable action queue has nothing to feed it — this is what makes "AI drafts, human decides" an audit trail instead of a chat message nobody acts on.

Builds onAlertsView.tsx UX templateMarkdown.tsx wiki pillstask_proposals tablealert_events audit pattern

Signal-to-Task Proposal Sweep

Phase 2Effort M●●●●● 5/5

Every Slack thread, email, and doc gets scanned for an implied task before anyone files one.

A recurring per-org sweep, structurally identical to the alerts evaluation, runs right after each reindex, filters to newly-changed raw/slack, raw/gmail, and raw/googledrive pages via the wiki's change tracking (not a full rescan), and asks a scoped agent turn per active project whether the content implies an actionable task. If yes: title, description, suggested assignee, priority — citing the source page, written as a proposal.

At Vortex Games

QA lead Jono posts in #bug-triage: "Repro'd the crash on Steam Deck when alt-tabbing during the loading screen — happens 100% of the time on build 0.91." The nightly reindex ingests it; the sweep reads the new page, recognizes an actionable bug report, drafts "Fix Steam Deck alt-tab crash during loading screen" with assignee inferred from who owns the loading-screen code and priority=high from the "100% repro" language. It lands in Maria's inbox the next morning instead of scrolling off Slack unnoticed.

Why Linear/Jira can't

They only create tasks from what a human explicitly files; with no read access to Slack, email, or Drive, a bug report buried in a thread simply evaporates.

Builds onalertEval.ts sweep patternwiki_change_items diffsagentDispatch.tsraw/slack · raw/gmail · raw/googledrive

Evidence-Based Stale Task Nudge

Phase 2Effort M●●●● 4/5

A task stuck "blocked" gets nudged only when the wiki proves the blocker actually cleared — with the message that proves it.

A per-task condition evaluated on every reindex, the same way alert conditions run: "task X is blocked on Y; is there wiki evidence Y is resolved?" A blocked_on_ref column (ticket key or wiki path, captured when a task is marked blocked) scopes the turn to Grep only matching pages, proposing an unblock with the citation on a match. No generic time-based nag, ever.

At Vortex Games

Dan's "Integrate new save-file compression" has sat blocked six days on "waiting on Priya's asset pipeline update (VG-482)." The nightly Jira sync writes VG-482's page with status Done and "fixed in pipeline v2.3, deployed today." The evaluator matches it against Dan's blocked_on_ref and proposes "Unblock: VG-482 resolved — evidence attached" — instead of a "hasn't moved in 6 days" nag he'd ignore.

Why Linear/Jira can't

Jira's stale-issue reminders are time-based cron nags with zero awareness of whether the blocker resolved elsewhere — a different ticket, a Slack thread, a merged PR. Sitting on the same wiki as everything else means proving the blocker cleared before bothering anyone.

Builds onalertEval.ts condition patternISSUE_KEY_RE ticket matchingtask_events

Dependency-Slip Radar

Phase 3Effort L●●●●● 5/5

Sees three tasks upstream that a milestone is going to slip, and says so with the full chain of evidence — not a manually-toggled red flag.

A daily scoped agent turn walks a task's declared dependency edges plus calendar proximity to a milestone date, cross-referencing wiki evidence of at-risk upstream work — a task in-progress with no recent Drive activity, a ticket that slipped estimate twice — and produces one proposal naming the root cause with every claim cited.

At Vortex Games

"Alpha Build 0.9" (due 08-28) has three dependent tasks: Priya's rig delivery, Dan's integration (blocked on Priya), Jono's QA pass (blocked on Dan). The sweep sees Priya is 2 days late against her own Thursday commitment — captured by meeting extraction — and Drive shows no new rig upload since Tuesday. It proposes: "Alpha 0.9 at risk — rig delivery 2 days late, no Drive activity since Tue, will cascade into Dan's integration and Jono's QA window," citing the meeting page, the Drive freshness signal, and the calendar milestone.

Why Linear/Jira can't

Linear's "at risk" health is a manually-toggled status field, not a computed prediction with evidence — it can't see that the source asset hasn't been touched in Drive, because it has no visibility outside its own issue graph.

Builds oncalendar_events datasettasks dataset (query_dataset)raw/googledrive freshnessscheduled_jobs tick machinery
PILLAR C

Core Tracker

Everything Linear does — projects, statuses, assignees, priorities, a fast board — minus the blank page you have to fill in yourself.

Tasks/Projects Schema + Agent Tools

Phase 1Effort M●●●●● 5/5

First-class task tools on the same agent that already reads the whole company brain — "create a task," "what's blocking the milestone," and "mark this done" just work, from chat or Slack.

New tasks/projects/task_events tables. Three agent tools registered exactly like the verified alerts pattern — create_task, update_task, query_tasks — each a zod-validated, DB-free confirmation handler (production agents run in an egress-fenced container), with the real DB write intercepted in the messages route via a new taskTool.ts matching alertTool.ts line-for-line.

At Vortex Games

Art director Priya types: "Create a task for the concept team to finalize the boss creature silhouette before Friday's review, assign to Devon." The agent resolves "Devon" against entities/people/devon-lark.md — the same identity resolution the calendar uses — calls create_task, and the confirmation streams back like a create_alert does today. Later, Elena asks "what's still open for the Milestone 3 review" and gets an inline, cited answer.

Why Linear/Jira can't

Their "AI features" are chat sidebars bolted onto a rigid CRUD backend; here task creation is a first-class capability of the agent that reads the whole company brain, so "assign to Devon" resolves through the same person-identity graph used for calendar and access control.

Builds onagentCore.ts MCP patternalertTool.ts parse+handlemessages route interception loopinit-db.sql idempotent migrations

Keyboard-First List + Board, Wiki-Grounded Detail

Phase 1Effort M●●●● 4/5

The actual Linear-parity UI — but every task's citations open the same reader panel chat answers already use, scrolled to the exact cited line.

src/app/tasks/page.tsx copies the verified alerts full-canvas template; a new tasks TabId joins the rail. The view renders a keyboard-navigable list (j/k, x to select, e to edit status) and a drag-between-columns board. A task's citations render through the existing wiki-pill system; the ReaderPanel gains a #L<n> fragment handler so a transcript citation opens scrolled and highlighted to the exact segment.

At Vortex Games

QA lead Marcus filters the board to "Blocked" and opens "Investigate frame drops on Series S," whose description cites the milestone-review transcript. He clicks the pill and the panel slides open already scrolled to Dae-Ho's exact sentence: "yeah the crash happens when we stream in the cave biome textures mid-fight" — the same reading experience he uses for chat answers, now on a task card.

Why Linear/Jira can't

Their task descriptions are plain text or manually pasted links; here citations are load-bearing, machine-resolved wiki paths, so "why is this task here" always resolves to a live document, not a stale paste.

Builds onalerts/dashboards page templateTabRail.tsx TabId unionReaderPanel.tsx + ReaderContext.tsxAlertsView.tsx fetch pattern

Duplicate & Already-Done Detection

Phase 2Effort S●●●● 4/5

Before a task is created, the agent checks whether it — or its outcome — already exists, and says so instead of filing a duplicate.

The create_task flow runs a pre-check — Grep/Glob over entities/ and raw/ plus a query_tasks call — for near-duplicate titles and topics before confirming; on a match, it surfaces the existing task or the wiki page proving it's already resolved.

At Vortex Games

A new QA hire asks the bot to "create a task to fix the save-corruption bug on the Steam Deck build." The agent greps first, finds entities/bug/save-corruption-steamdeck.md marked resolved with a linked commit, and replies "This looks already fixed — resolved Aug 15, patch 1.4.2. Want me to create the task anyway, or check with QA that it regressed?"

Why Linear/Jira can't

"Search before you file" is a human courtesy nobody follows. Here duplicate-checking is structurally free — the agent turn creating the task already has full-text grep over the whole company brain.

Builds onagentCore.ts Read/Grep/Globconfirm-then-call patternquery_tasks

Access-Scoped Task Visibility

Phase 2Effort S●●●●● 3/5

Tasks inherit the same allow/deny rules as wiki pages and alerts — a contractor sees only their own work, an HR-sensitive task never leaks, zero new access-control code.

Every task gets selector labels stamped at creation. Both the API and query_tasks call the same verified subset check alerts use: every selector on the task must be within the viewer's allowed set from the org's one access policy, else owner+admin-only.

At Vortex Games

The external QA vendor has membership_type='external'. A "Console Cert Blockers" project is scoped to employees via an access rule. When the contractor's board loads, the same policy resolution that governs their wiki access excludes those selectors — their board simply never shows those tasks. No contractor-vs-employee permission system was built.

Why Linear/Jira can't

Their permissions are a separate, manually-configured ACL bolted on after the fact; task visibility here is definitionally the same policy graph that governs chat access — one place admins ever configure.

Builds onaccessPolicy.ts resolveEffectivePolicyalertVisibility.ts subset ruleorg_people + access_rules
PILLAR D

One Ecosystem

A task is just another cited node in the same brain that answers your chat questions — not an island with its own database.

Evidence-Linked Tasks (Provenance Trail)

Phase 1Effort M●●●●● 5/5

Every task is born with a citation trail — the Slack thread, doc, or meeting that created it — permanently attached. No "why does this exist" archaeology.

When the agent creates a task, it captures the wiki paths it was reading that turn (the same touched-selectors mechanism alerts already derive from Read-tool activity) as evidence_paths, rendered as clickable pills. The same field seeds an on-demand Context Pack — a one-page synthesized brief generated by the existing artifact pipeline the moment someone opens a task cold.

At Vortex Games

In #art-pipeline, art director Mara posts "the boss silhouette reads wrong against snow biome, need a repaint pass before Friday review." Someone tags the bot; mid-answer it creates the task with the Slack page and the asset entity as evidence. Three weeks later a producer picking it up cold generates a Context Pack instead of re-reading three weeks of Slack.

Why Linear/Jira can't

Their tasks link to whatever URL a human pastes in, if anyone bothers. Here provenance is a byproduct of how every turn already works — and it doubles as the seed for an instant research brief they can't generate, having nothing outside their own database to pull from.

Builds ontouchedSelectors mechanismMarkdown.tsx + wikiPath.ts pillsartifactGen.ts Context Packs

Ask-the-Tracker + Task Velocity Dataset

Phase 2Effort M●●●●● 5/5

Any chat question — in the Tasks tab or the main chat — can answer from live task state composed with the wiki, cited the same way.

Registers a tasks dataset in the analytical lane, following the calendar dataset's verified privacy template: status, priority, project, cycle timing, assignee department — deliberately omitting titles, free text, and named individuals, mirroring the calendar's confirmed stance (no title, no organizer, no attendee list). The agent may query it before answering blocking/status/velocity questions, then compose the aggregate with a qualitative wiki pass for the "why."

At Vortex Games

A producer asks "what's blocking the August 29 milestone build?" The agent queries blocked tasks for that milestone, cross-references the milestone entity, and answers: "Two blockers: audio mixdown (missing VO files, see the #audio thread) and a crash on level load, still open in QA." Elena asks "why did average cycle time nearly double?" and gets a dataset-computed number (11.2h → 21.4h) explained by a wiki-grounded cause (a 3-day broken build pipeline) in one composed answer.

Why Linear/Jira can't

They're islands you open and filter yourself; here the window that answers "what did the playtest feedback say" also answers "what's blocking the build" in one grounded turn, because the number and the cause live behind one tool surface.

Builds oncalendarDatasetSpec.ts privacy templatedatasetStore.ts + datasetQuery.tstask_events cycle times

Leadership Risk Dashboards

Phase 3Effort M●●●● 4/5

One glance at who's overloaded and which roadmap items have gone quiet — composed from tasks, calendar, and the strategy docs already in the wiki.

A pre-built artifact visualizes per-person task load against real calendar availability and milestone dates, plus a priority-alignment view bucketing work into "tied to a live milestone," "orphaned," and "milestone with zero open tasks" by cross-referencing evidence paths against milestone/OKR/roadmap wiki pages. Auto-refreshed weekly and pinned to Dashboards, or generated on demand from a chat question.

At Vortex Games

Before the leads sync, Maria opens "Team Load — Alpha 0.9," sees Priya's row red against her meeting-heavy calendar, and reassigns two lower-priority tasks to Jono, whose row is green. The studio lead's "Priority Alignment — August" flags that Steam Deck certification has zero open tasks despite a hard deadline in three weeks — a gap invisible in Jira, which has no concept of the roadmap doc at all.

Why Linear/Jira can't

Jira's workload widgets only count Jira issues and don't know a person's day is eaten by meetings; its roadmap view only knows manually-kept custom fields. This reads real calendar availability and the actual strategy docs living in Drive/Confluence.

Builds onartifactGen.ts + Dashboardscalendar_events datasettasks datasetentities/milestone|okr pages
PILLAR E

Migration & Reach

Land where the work already lives — inside Jira on day one, inside Slack every day after.

Overlay-First Jira/Linear Importer + Sync Bridge

Phase 1Effort L●●●●● 5/5

Turns the already-existing read-only Jira wiki ingestion into a live overlay — every open issue appears instantly, and Jira stays the boss until a team asks it to stop.

Imports every open issue (already ingested as raw/jira/<project>/<issue>.md) into tasks as a shadow row keyed by external_id. On every LiveCEO edit, pushes the delta back via the Composio connector. On every reindex, diffs the freshly-pulled page against the shadow row and reconciles drift using the durable-comparison pattern that already guards meeting transcripts. A per-project toggle moves overlay → mirror → master.

At Vortex Games

The engine team lives in Jira project WWC. Elena enables overlay mode for WWC only — every issue shows up instantly because the wiki ingested it last night. Marcus closes a ticket from LiveCEO's board; the bridge pushes it to Jira within the next tick; the next day's reindex confirms no drift. Three weeks and zero conflicts later, Elena flips WWC to master; new issues now originate in LiveCEO.

Why Linear/Jira can't

The migration is cheap specifically because the Jira data was already flowing into the wiki as markdown before a single tracker line of code existed — a competitor needs a from-scratch importer with no ingestion to build on.

Builds onraw/jira ingestion (ISSUE_KEY_RE)Composio Jira/Linear connectorsmeetingMaterialization.ts reconcilesource_sync_state

Status Truth Engine

Phase 2Effort L●●●●● 5/5

When the PR merges, when the build ships, or when Jira and the meeting transcript disagree — the task proposes fixing itself instead of quietly going stale.

One evaluator, three triggers: (1) watches raw/github pages for merge-state changes and correlates them to in-progress tasks, proposing done the moment a reindex captures the merge; (2) for overlay tasks, this is the sync bridge's drift check; (3) for any task linked to an entity, compares status against the freshest mention in recent Slack or transcripts and flags a conflict on divergence — rather than trusting the system-of-record blindly.

At Vortex Games

Dan merges PR #341 on Friday; the next reindex captures it and the evaluator proposes "Mark done: PR #341 merged," citing the page — Dan taps approve instead of remembering to close the ticket. Separately, Jira's WWC-241 still shows In Progress, but the Aug 19 standup transcript has the tech lead saying "particle optimization shipped in 1.4.3, closing that out" — the linked task gets a "status may be stale" banner citing the transcript.

Why Linear/Jira can't

Smart-commit linking needs the exact "Fixes VG-118" syntax in every commit; Jira only knows what's typed into Jira. Reading PRs and transcripts semantically catches the very common "ticket status lied" problem no standalone tracker can see.

Builds onraw/github taxonomywiki_change_itemsmeetingMaterialization.ts reconcileraw/jira taxonomy

Slack Action Surface

Phase 2Effort S●●●●● 3/5

Approve a proposal, close a task, or reassign it with a button click inside the Slack channel where the work actually happened — never opening the app.

Extends the bot's existing Block Kit posting to interactive messages for proposals and task mentions. The Slack events webhook gains a block_actions case calling the exact same write path the chat agent tool uses — a Slack click and a chat command are two entry points into one handler.

At Vortex Games

The sweep posts into #vortex-engine: "Proposed task: Add regression coverage for inventory desync — cited to yesterday's thread. [Approve] [Reject] [View]." Lead engineer Sam, who never opens the LiveCEO tab, taps Approve from his phone. The task is created per the proposal, with a confirming reply deep-linking back to /tasks.

Why Linear/Jira can't

Jira's Slack integration is read-only notifications plus a slash command; here the same write path the agent uses in chat is exposed as a Slack button — no separate Slack-specific business logic to drift.

Builds onslackBot.ts slackPostBlockswebhooks/slack (new block_actions case)slack_alert_subscriberstaskTool.ts shared write path
07End-to-end walkthroughs

Four days at Vortex Games.

The features above compose into loops no standalone tracker can run. Four end-to-end scenarios, each traceable through the systems described in this report.

S1

The meeting that files its own tasks

Trigger: the weekly Alpha milestone review is Recall-recorded and sits on the calendar like any other Tuesday sync.

  • T−30m: #milestone-review gets a Slack brief — attendees' open tasks, what changed since last sync, a suggested agenda.
  • The call happens; the existing Recall bot records and transcribes with zero new infrastructure.
  • T+10m: the transcript finalizes in the wiki and an extraction turn reads it.
  • Three task proposals and one decision land in the Proposal Inbox, each cited to the exact transcript page.
  • Priya gets a Slack DM to confirm her proposed task and taps approve from her phone.
Payoff: nobody opened a tracker or typed a ticket. The entire loop — brief, capture, extraction, confirmation — closed itself between the calendar invite and the next morning's inbox.
S2

A Slack bug report becomes a filed, assigned task before anyone notices

Trigger: QA lead Jono posts in #bug-triage: "Repro'd the crash on Steam Deck when alt-tabbing during the loading screen — happens 100% of the time on build 0.91."

  • The nightly reindex ingests the message into the wiki's Slack pages.
  • The signal-to-task sweep reads only the newly-changed page and recognizes an actionable bug report.
  • It drafts a title, infers an assignee from who owns the loading-screen code in the GitHub pages, and sets priority high from the "100% repro" language.
  • The proposal lands in producer Maria's inbox the next morning, citing the exact Slack message.
Payoff: a bug report that would have scrolled off Slack unnoticed becomes a triaged, assigned, cited task with zero manual filing — Maria approves it in one tap.
S3

Jira stays the boss — until it doesn't

Trigger: producer Elena enables Tasks in overlay mode for exactly one Jira project, WWC, where the engine team already lives.

  • Every open WWC issue appears in LiveCEO instantly — the wiki already ingested them the night before, so there's nothing to import.
  • QA lead Marcus closes WWC-142 from LiveCEO's board instead of switching to Jira.
  • The sync bridge pushes the status change back to Jira within the next refresh tick.
  • The next day's reindex re-pulls the Jira page and confirms it matches the shadow row — no drift alert fires.
  • Three weeks and zero conflicts later, Elena flips WWC from overlay to master; new issues now originate in LiveCEO.
Payoff: full team adoption with zero forklift migration, zero flag day, and zero re-typed backlog — trust was earned one reconciled edit at a time.
S4

The blocker clears itself, and leadership sees the slip three weeks early

Trigger: Alpha Build 0.9 is due 2026-08-28, with three dependent tasks: Priya's rig delivery, Dan's integration (blocked on Priya), Jono's QA pass (blocked on Dan).

  • The daily Dependency-Slip Radar checks Priya's task against her own Thursday commitment, captured earlier by meeting extraction.
  • It finds she's 2 days late — and that Drive shows no new rig upload since Tuesday.
  • It computes the downstream cascade into Dan's and Jono's blocked work.
  • One proposal posts, naming the root cause and citing the meeting page, the Drive freshness signal, and the calendar milestone entry.
Payoff: leadership sees the risk three weeks before it would have shown up as a red status in the old tool — with the full evidence chain, not a manually-toggled flag.
08How we'd build it

Five tables, four tools, zero new services.

Tasks is three core Postgres tables plus two support tables — not a new app beside the wiki. Every write, sweep, notification, citation, visibility check, and aggregate query rides a subsystem that already ships. The diagram shows the full composition.

EXISTING RAILS — VERIFIED IN CODE NEW — THE TASKS CORE SURFACES — ALL EXISTING Reindex sweep engine alertEval.ts — headless turns after every wiki rebuild Claim-and-run clock scheduledJobRun.ts — every-minute host tick Meeting pipeline Recall bot + Meet webhooks → transcripts in wiki Calendar + identity graph calendarSource.ts — events, attendees → people Company-brain wiki raw/slack · jira · github · gmail · drive · meetings Access policy graph resolveEffectivePolicy — one allow/deny for everything Analytical lane datasets catalog + query_dataset SQL tool Agent core (claude-agent-sdk) MCP tool pattern shipped for alerts & jobs 5 TABLES tasks · projects · task_events task_proposals · meeting_briefs idempotent init-db.sql migration 4 AGENT TOOLS create_task · update_task query_tasks · propose_task zod handler + app-side write interception Proposal Inbox every AI draft: diff + citation + approve / edit / dismiss PROACTIVE SWEEPS signal triage · T−30 brief · T+10 extraction · stale nudge · radar SYNC BRIDGE Jira/Linear overlay → mirror → master Tasks tab new TabId — list · board · proposals Chat — main + tab cited answers over live task state Slack briefs, digests, approve buttons Dashboards risk & load artifacts, auto-refreshed

The five tables

tasks
The single task record: title, status, assignee, priority, parent task, due date, evidence_paths, nullable external_source/external_id for overlay mode, an overlay/mirror/master mode enum, and access selectors. Every other table hangs off this one.
projects
Groups tasks the way Jira projects or Linear teams do; carries the per-project sync-mode toggle and a default access selector.
task_events
Append-only activity log (actor, event type, payload, timestamp) — mirrors alert_events/scheduled_job_runs exactly; the audit trail for every status change, reassignment, and proposal decision.
task_proposals
Every AI-drafted change, from every producing sweep, in one queue — the Proposal Inbox's backing table: source kind, action, diff, evidence paths, and pending/approved/edited/dismissed status.
meeting_briefs
Dedup key (org + calendar occurrence + sent-at) so the T−30 tick never double-posts a brief for the same event.
— agent tools —
create_task and update_task for live chat writes, query_tasks for cited read answers and duplicate pre-checks, and propose_task used by every headless sweep — one tool, one code path, regardless of which sweep produced the draft.

Integration points — existing code → what Tasks reuses it for

Existing, verifiedReused for
agentCore.ts — create_alert / create_scheduled_job MCP patternAll four task tools registered the identical three-part way: zod schema + confirmation-text handler + system-prompt instruction block.
alertEval.ts — per-org post-reindex sweepSignal triage, stale nudges, status inference, and the dependency radar all run as the same headless-turn-per-item sweep.
scheduledJobRun.ts — claim-and-run clockThe T−30 brief runs as a new meeting-briefs-due tick on the same host cadence.
webhooks/recall — transcript.done → finalizePost-meeting extraction fires right after the transcript dump is written and indexing kicks.
slackBot.ts — Block Kit + subscriber fan-outBriefs, digests, proposal notifications, and approve/reject buttons — one new block_actions webhook case.
accessPolicy.ts + alertVisibility.ts — selector subset ruleTask visibility ports the exact verified rule — simpler than the alert case, since selectors are declared at creation.
calendarDatasetSpec.ts — privacy-safe column allowlistThe tasks dataset copies the confirmed posture: no titles, no free text, no named individuals in the SQL lane.
Markdown.tsx + ReaderPanel.tsx — wiki citation pillsEvery task and proposal citation renders with zero new renderer code; the panel gains jump-to-transcript-line.
artifactGen.ts — sandboxed artifact pipelineContext Packs and Leadership Risk Dashboards are additional payloads into the same generator and renderer.
TabRail.tsx + alerts/page.tsx — tab + route templateOne new TabId; the tasks page copies the session/indexing guard verbatim.
09Sequencing

Three phases, each with a hard exit gate.

Phase 1 ships the complete meeting loop and the overlay wedge together, so the pitch is provable — not promised — from the first pilot.

PHASE 1 · 7 FEATURES
Prove the wedge
A credible tracker for one pilot team, fully overlaid on their existing Jira project, with the complete meeting before/after loop live from day one.
  • Tasks/Projects schema + agent tools
  • Keyboard-first list + board
  • Evidence-linked tasks
  • Unified Proposal Inbox
  • T−30 pre-meeting brief
  • Post-meeting extraction (T+10m)
  • Overlay importer + sync bridge
Exit criteriaOne pilot project in overlay mode 2+ weeks with zero unresolved drift; ≥80% of recorded meetings produce an accepted proposal; every task carries at least one evidence citation.
PHASE 2 · 7 FEATURES
Broaden trust
Extend proposals beyond meetings to Slack/email/code signal, harden access control for org-wide rollout, and let people act from Slack.
  • Signal-to-task sweep
  • Evidence-based stale nudge
  • Duplicate & already-done detection
  • Access-scoped visibility
  • Ask-the-tracker + velocity dataset
  • Status Truth Engine
  • Slack action surface
Exit criteriaProposal acceptance ≥60% across all sweep types; scoped visibility verified with zero leaks on a restricted project; one org flips a project to mirror; a real chat question answered from the tasks dataset in production.
PHASE 3 · 4 FEATURES
Become the master
Ship the predictive and strategic layer, and let fully-trusted projects flip from Jira/Linear to LiveCEO as master.
  • Dependency-Slip Radar
  • Decision log auto-extraction
  • Recurring-meeting health score
  • Leadership risk dashboards
Exit criteriaOne project flips to master with zero data loss; the radar flags a real at-risk milestone before the old tool would; a risk dashboard is used in the pilot's leadership sync 4+ consecutive weeks.
10Discipline

What we deliberately won't build.

Replacing Linear/Jira does not mean rebuilding them. Each cut protects the wedge or avoids duplicating something the ecosystem already does better.

No autonomous writes. Outside the strictly-defined overlay import from an already-authoritative source, proposals are never silently auto-applied. Trust is earned proposal by proposal.

No no-code automation-rule builder. The agent's evidence-grounded judgment replaces hand-authored if-this-then-that rules; we don't build a rules UI on top of something the model infers from the wiki.

No native mobile app. Slack — already the delivery surface for alerts and jobs, now an action surface via buttons — plus the responsive web tab cover "away from my desk" in every phase.

No Gantt/portfolio-planning product. Milestones live as wiki entities with calendar-adjacent dates; risk is composed from real evidence instead of a drag-to-plan UI nobody keeps current.

No flag-day migration or 40-field mapping importer. Overlay mode must work with zero configuration beyond "pick a project," or the wedge doesn't hold.

No bespoke task-permission system. Visibility is always the one policy graph the wiki and alerts already enforce — even where that's coarser than a hand-built Jira scheme. One graph, not two to keep in sync.

No second recording pipeline. Tasks never spins up its own meeting bot; it is strictly a downstream consumer of the existing Recall/Meet webhook output.

No live-collaboration layer. No in-card comment threads or live cursors. Task discussion happens where it already happens — Slack, chat, the meeting itself.

11Appendix

The four lenses behind the synthesis.

Lens 1 — Proactive AI project manager

The tracker is not a place humans type tasks into — it is a standing AI PM that watches everything the company brain ingests and continuously proposes the task-state changes a good PM would make between standups. Its core deliverable is not a task list; it's a Proposal Inbox where every action arrives as a diff with a citation, so the system earns trust by being provably right rather than by being autonomous.

Lens 2 — Meeting lifecycle automation

The task tracker is the exhaust of the company's actual meeting cadence, captured before, during, and after every call. LiveCEO already owns the calendar, the recording bot, and the identity graph a standalone tracker never sees; the winning move is closing the loop those three already form. Linear and Jira are ticket databases bolted onto a calendar via a thin integration at best; this is a tracker that is the meeting lifecycle.

Lens 3 — One-ecosystem superpowers

A task is one more addressable node in the same wiki/graph/dataset fabric that already holds Slack, Drive, Jira, Figma, and transcripts — born with provenance back to the evidence that spawned it, answerable from chat with the same citations, kept honest by background reconciliation against what the rest of the brain actually says. Structurally impossible for a tool that only knows what a human typed into it.

Lens 4 — Parity, migration & architecture

To replace Linear/Jira the tracker must first be credible as a tracker — but built as the same architecture already proven by alerts and scheduled jobs, not as a bolt-on CRUD app. The wedge is migration, not feature parity: Jira is already a read-only wiki source, so LiveCEO becomes a live overlay first and master later, with every task grounded in the same wiki that answers chat questions.

How this report was produced. A multi-agent workflow ran over the LiveCEO codebase on this branch: three mapper agents read the app shell, chat agent, calendar/meeting pipeline, and knowledge/data layer file-by-file; four brainstorm agents generated 30+ candidate features through the four lenses above, each grounded in the verified map; a synthesis agent deduplicated, ranked by impact-over-effort, and structured the result — 8 agents, 78 tool calls, ~558k tokens. Every file path cited in this report was read by a mapper, and claims the mappers could not verify are recorded as open probes in the audit output, not asserted here. Where a subsystem is described as "verified," a mapper confirmed the referenced behavior at the cited file.