Novansa Pilot Build Plan¶
Status: approved 2026-10-05. Implements part of Work Model & IA (proposal) (§13 step 2–3) for a narrower first audience. Decisions D1–D6 are recorded in §3.
1. Goal¶
Andrew and Antonette stop using Notion, and each project's lists (roadmaps, tech debt, backlog, releases) are visible and kept current in Thinklio.
- Social content is not migrated: the social boards are retired and that work moves to Ripplebase (decided 2026-10-05).
- Ripplebase stays separate. External Ripplebase reviewers keep working in Ripplebase; deeper Thinklio–Ripplebase integration comes after this pilot.
- Linear is cancelled (2026-10-05): planning and progress live in each project, and a separate tracker was another app to look at. So the repos keep owning their lists. Thinklio reads them, shows them read-only and keeps their history (D1); nobody changes how they work.
Done means: Notion is cancelled; the two of us open Thinklio first for tasks, meetings, docs and project lists; and every active repo's lists appear in Thinklio within a minute of a push.
2. What moves where¶
From a read-only inventory of the Notion workspace on 2026-10-05. Users: Andrew and Antonette are active; two older accounts have no edits since November 2025.
| Notion | Size, last activity | Destination |
|---|---|---|
| Tasks Tracker (Novansa) | 80 rows, 22 open; to 5 Oct | Tasks, in the matching space (its brand tags map to spaces) |
| Personal Tasks (Andrew, private) | 27 rows, 18 open; to Mar | Tasks, Andrew's personal space |
| Internal Calendar | 33 meetings with AI notes and Fathom links; to 5 Oct | List: Meetings (calendar view), notes in each record |
| Document Hub | 20 docs; to 5 Oct | Wiki pages in the matching space |
| SOPs (+ nested Resources) | 7 docs; to Sep | Wiki pages, Novansa space |
| FALL Marketing tree | 6 section pages, 2 technical pages, Pilbara OH page; Sep | Wiki pages, FALL space |
| FALL Marketing Decision Log | database | List: Decisions, FALL space |
| Couple Tools Newsletters | 33 rows; to Sep | List: Newsletter, Couple Tools space (its relations to Twikka databases are dropped) |
| FALL Image Options (nested in a task) | 65 rows with files; Jun–Jul | List: Blog images, FALL space |
| Thinklio Home, Foot Scan App | link hubs, brand PDF, icons | Wiki pages + files |
| Brand assets (Couple Tools logos, PDFs) | files | Files on wiki pages |
| Home dashboard | linked views, synced block | Not migrated; replaced by My work and space pages |
| Projects, Goals Tracker, Couple Tools Plan | 10 / 3 / 20 rows; Jan 2026 | Archive (stale; see D4) |
| All social boards, Social Ideas, Reel Gallery, Ripplebase Prompts | 255 rows across boards | Ripplebase (not migrated) |
| Twikka teamspace, Clindice pages, 2021–23 second brain, stale private pages | mostly 2025 or older | Archive |
Archive means a full Notion export (Markdown & CSV with files), stored in Drive with a note in the Operations space wiki saying where. Nothing archived is imported.
Before cutover, check in the Notion app (the connection cannot see them): database automations and buttons (FALL Social Projects creates "New post" rows on a schedule; the "Alignment" tasks look recurring), and whether the LeadConnector (GHL), Make or Framer integrations write into Notion. The task "Log in for socials Antonette" probably holds credentials: move them to 1Password, not Thinklio.
Lists from the repos (read-only in Thinklio)¶
| Repo source | Becomes |
|---|---|
Ripplebase apps/web/docs/tech-debt.md (bugs, dead code, refactors, done) |
Tech debt, Ripplebase space |
Couple Tools TECHNICAL_DEBT.md (TD-1–12), BACKLOG.md (BL-1–9) |
Tech debt and Backlog, Couple Tools space |
Couple Tools ROADMAP.md release train (R0–R6) |
Roadmap, Couple Tools space |
Twikka 04-build-plan.md "Open to-dos" |
Open to-dos, Twikka space |
| FALL handover open items, Clindice migration phases | Open to-dos in those spaces |
Thinklio 13-implementation-plan-and-status.md, decision-log.md |
Roadmap and Decisions, Thinklio space |
Operations items (credentials, DNS, Coolify, Sentry) are not in any one repo's list today. They become an editable Renewals list and Tasks in the Operations space, with secrets linked from 1Password (D5).
3. Decisions needed¶
- D1. The repos own their lists; Thinklio reads them and shows them read-only. Decided 2026-10-05. Claude sessions keep updating the Markdown in the same commit as the work, which already works. Thinklio refreshes on every push, keeps each list's history from the commits, and shows lists side by side across projects. Details in §5.3. Writing back from Thinklio (for example by opening a pull request) is not planned.
-
D2. Membership stays on Clerk organisations. Decided 2026-10-05. Moving membership into
account_members/account_invitations(copying Ripplebase's tables) waits until more users join, and ideally lands together with the move to Convex Auth v2. D3–D6 were accepted with the plan on 2026-10-05. -
D3. The MCP server is Go in
thinklio-services, copied from the Notion service and calling Convex/v1routes, matching every other MCP service and its deployment. - D4. Notion's Projects, Goals and Couple Tools Plan databases are archived, not imported. All three stopped in January; spaces now do the job Projects did.
- D5. Secrets stay in 1Password. Thinklio records link to 1Password items (an
externalfield,onepassword.item), and Renewals tracks expiry and owner. Values never enter Thinklio. A Thinklio vault (docs/secrets-vault-specification.md) is revisited only if a customer needs one. - D6. Spaces: Novansa, Operations, Thinklio, Ripplebase, Twikka, Couple Tools, Clindice, FALL (client work, no patient data), plus a personal space for each person. These match the Notion teamspaces.
4. Scope¶
4.1 In¶
- Spaces with members; a personal space for each person.
- Tasks in spaces, with a parent record, person assignees,
in_reviewstatus and recurrence; My work. - Lists: collections, records, table / board / calendar views, group counts, CSV and Notion import.
- Wiki: pages in a tree per space, Markdown editing, files, search, history.
- The change log: one write path for tasks, records and pages, with history and undo on each.
- Per-user API keys,
/v1routes and the Thinklio MCP server. - Navigation: My work, Spaces, Search, Settings (Briefing, Activity and agent-owned views are hidden, not deleted).
4.2 Out (comes after)¶
The Inbox and attention model, agent proposals and routines, Ripplebase integration, links beyond task-to-record parents, rollups, formulas, list rules, templates with task blueprints, per-space task fields, space policies, the Flutter app, leaving Clerk organisations, Cliniko patient names, regional deployments.
4.3 Small calls made here¶
- Totals: group counts and column sums computed at read time; lists in this pilot hold hundreds of records at most. The Aggregate component is added when a list outgrows that.
- Field types for the pilot:
text,longtext,number,currency,select,multiselect,status,date(with optional end),checkbox,person,url,email,file,external(1Password item, GitHub link), and the system fields.relationandrollupfollow withlinks. - Cross-project views: each repo list lives in its own space. "Changed this week" is the one cross-space view in the pilot; views such as "all open tech debt by size" come with portfolio views.
5. Phases¶
Each phase ends with something we use the next day.
5.0 Groundwork (about 2–3 days)¶
The code survey on 2026-10-05 found the foundations below need fixing first.
- One task write path. Tasks are written from three places (
tasksCrud.ts,tasksCrud.ingestTask,agentCrud.ts), andagentCrud.completeTaskskips recurrence. Route all of them through one internal helper, which is where the change log attaches in 5.1. - Add the Migrations component (
@convex-dev/migrations) for the widen–backfill–narrow changes totasks. - Typecheck baseline. 76 tsc errors already exist, mostly
createToolsignature changes intools/*.tsafter an@convex-dev/agentupgrade. Fix them, so new work is checked cleanly and the agent tools match what the MCP server exposes. - Generic view layer. The task views are hard-coded to
tasks. Build table (on@tanstack/react-table, already installed), board (add@dnd-kit) and calendar views driven by field definitions, used by both tasks and lists.
5.1 Spaces and tasks (about 1 week)¶
- Schema:
spaces,space_members(proposal §14);changes(proposal §14, used here with statusapplied/undoneonly);taskswidened withspaceId,parentType/parentId,assigneeType/assigneeId, statusin_review;task_listskept as sections within a space. - Write path: the helper from 5.0 writes the task and a
changesrow in the same transaction. Task history tab with undo for the last change. - Access: space membership checked in every task query and mutation (today nothing checks team-scoped access).
- Web: Spaces in the sidebar; a space page with Tasks (table, board, calendar) and an Overview (pinned wiki page, open counts); My work grouped as overdue, today, this week, later, no date; quick add with space picker.
listTasksgets pagination and a space filter (it is capped at 50 today). - Import: Notion Tasks Tracker and Personal Tasks (brand tag → space; Notion people → Clerk users; descriptions and page bodies → task description). Recurring tasks are re-created by hand with Thinklio recurrence.
- Seed: the spaces in D6.
- Use from here: Antonette and Andrew move daily tasks to Thinklio.
5.2 Lists, read-only first (about 1 week)¶
- Schema:
collections,collection_records,collection_views(proposal §14). Field IDs are stable; renaming never touches records. A collection has asource:manual, orrepo(with repository, path, section and the last commit read). Records in arepocollection are read-only in the UI. - Record page: fields in schema order; notes (Markdown); history from
changes; for repo records, a link to the file on GitHub at the row's line. - Views: table, board (group by select or status), calendar (by a date field); filters, sorts, visible fields, group counts and sums; saved per list, shared by default. Each space shows its lists; Changed this week shows recent changes across every list a person can see.
5.3 Project lists from the repos (about 1 week)¶
The first visible win: every project's tech debt, backlog, roadmap and open to-dos in one place, current within a minute of a push.
- Each repo declares what Thinklio reads in a
thinklio.ymlat its root, so the repo stays in charge and a Claude session can add a list by editing it:
space: ripplebase
lists:
- name: Tech debt
file: apps/web/docs/tech-debt.md
key: ID # the column that identifies a row (B53, D10, R12)
done_sections: [Done] # rows under these headings count as done
- Parser (no LLM). Markdown tables become records: the header row becomes fields, cells stay Markdown, the nearest heading becomes a Section field, and columns named Status, Priority or Size become select fields. Numbered or bulleted lists also work: a bold lead becomes the title and the number or an explicit ID becomes the key. A row under a done section, or wrapped in
~~strikethrough~~, is marked done. - Refresh. A GitHub push webhook (
POST /github/pushon Convex, HMAC-verified) re-reads only the declared files that the push changed, at that commit. An hourly sweep compares each file's blob SHA and re-reads only what moved, in case a webhook was missed. Each list has Refresh now. - History. Each read is compared with the records by key: new rows are created, changed rows updated, missing rows archived. Every difference is a
changesrow with actorintegration:githuband the commit (SHA, message, author) as its source, so a record's history reads like "Moved to Done inabc123: fix FALL push guards". - GitHub access for the pilot: a fine-grained token with read-only Contents on the chosen repos (Convex env
GITHUB_TOKEN) and one webhook per repo (secret inGITHUB_WEBHOOK_SECRET). A GitHub App replaces both when other accounts need it. - First repos: Ripplebase, Couple Tools, Twikka, Thinklio, FALL, Clindice. Twikka's numbered to-dos parse as they are; converting them to a table later is one commit.
5.4 Editable lists and Notion import (about 1 week)¶
- Editing: inline cell editing, record create and archive, all through the write path with undo; field management (add, rename, change compatible type, archive).
- Import: CSV, and Notion databases through the Notion API (the
thinklio-servicesNotion service already reads data sources and page Markdown; the importer either calls it or ports the calls into a Convex action). Files are downloaded during the run, because Notion's file links expire after five minutes. - Lists: Meetings, Decisions, Newsletter, Blog images (from Notion); Renewals (new, Operations space, with 1Password links).
5.4 Wiki (about 1 week)¶
- Schema:
pageswith account, space, parent, title, slug, Markdown content, position, archived; a search index on content filtered by space, and one on title. Revisions aschangesrows, coalesced so continuous typing by one person within ten minutes makes one revision. - Editor: the Lexical editor with Markdown round-trip already in
packages/ui(lexical-editor.tsx);apps/webtakes@novansa/uias a dependency. Paste and drop images and files to R2. - Pages: tree in the space sidebar, breadcrumbs, links between pages and to tasks and records (
[[picker), "linked from" at the foot of each page. - Search: ⌘K across tasks, records and pages in the spaces a person can see.
- Import: Document Hub, SOPs, the FALL Marketing tree, Thinklio Home, Foot Scan App, brand files. Notion's
/pages/{id}/markdownkeeps headings, lists, tables and links; Notion AI meeting-note blocks may come through as plain text.
5.6 API keys and the Thinklio MCP server (about 1 week)¶
Less urgent now that the repos own their lists (D1). It lets Claude sessions read across projects and work with tasks and the wiki.
api_keystable: per user and account; stored as a SHA-256 hash with a visible prefix; name, last used, revoked. Created and revoked in Settings → API keys. This replaces the sharedINGEST_API_KEYfor new routes (the existingPOST /v1/taskskeeps working until n8n is switched)./v1routes (Convex HTTP, ADR-029 envelope): spaces; tasks list, get, create, update, complete, comment; lists and records read; pages search, get, create, update. Writes go through the same helper, with the change's source{ kind: "mcp", ref: "<client>" }and the actor as the key's user.thinklioMCP service inthinklio-services, copied fromservices/notion: streamable HTTP at/mcp, the key passed asX-Thinklio-Api-Key, deployed atthinklio.api.thinklio.ai, added toregistry.yaml.
5.7 Notion cutover (about 2 days)¶
- Re-run the imports for anything changed since the first run.
- Check the Notion automations, buttons and integrations listed in §2; move anything still needed.
- Take the full Notion export into Drive; add the archive page to the Operations wiki.
- One working week on Thinklio alone, with Notion read-only.
- Cancel Notion.
Total: about six to seven weeks of build. Daily tasks move after 5.1; project lists are visible after 5.3.
Progress¶
- 5.0 Groundwork: done (2026-10-05, deployed). One task write path; backend typecheck 76 → 0; four agent bugs fixed (knowledge search, policy-blocked replies, retrier callback, key dedupe);
convex-testwith tests. Production Convex was found four months stale and brought up to date (it held no data to migrate). Two items moved: the Migrations component is not needed yet (production had no tasks to backfill, and new task fields are optional), and views driven by field definitions move to 5.2, where lists need them; 5.1 made the task views take their tasks as input instead. -
5.1 Spaces and tasks: done and in production (2026-10-05). Spaces and members, personal spaces, space access on every task read and write, the
changeslog with history and undo, My work as the home page, space pages (list, board, calendar, activity, members), the Spaces sidebar. The eight pilot spaces are seeded in the Novansa account, and the 40 open Notion tasks are imported (22 from the Tasks Tracker into the matching spaces, 18 from Andrew's Personal Tasks into his personal space), each linking back to its Notion page. Antonette's 10 tasks wait for her account: once she signs in, runspaces:seedSpaceswith her as a member andimports:assignImported. Assigning tasks to agents (assigneeType) moves to the assistant's first slice (personal assistant proposal A0). -
5.2 Lists and 5.3 project lists: done and in production (2026-10-05). Lists with typed fields, saved views (table with groups and totals, board, calendar), record pages with history and undo, list templates (Renewals, Meetings, Decisions), and "Changed this week". Six repos are connected with push webhooks and an hourly sweep; each has a
thinklio.yml. Live lists: Ripplebase Tech debt (137), Twikka Open to-dos (32), Thinklio Tech debt (18, from the newdocs/tech-debt.md), Couple Tools Tech debt (12) and Backlog (9), FALL Outstanding (8), Clindice Open items (6). Couple Tools' roadmap (headings, not a list) is not read yet. -
Repo ingestion as a module (2026-10-05). Generalised for any account: Repo Ingestion (proposal). Spec
thinklio-ingestv1 published at/v1/ingest/specwith JSON Schemas and a guide; files can opt in with front matter (thinklio: { ingest: list }orthinklioIngest: true); each connected repo has a default space. Thinklio's own register now declares itself with front matter. Next for the module: the Thinklio GitHub App and a Connections screen (proposal I1). -
Module architecture and 5.4 Wiki: done and in production (2026-10-05). Module Architecture (proposal) (draft ADR-040): object types with one contract (object registry), connectors in mirror/import/link mode feeding one bundle applier, capabilities and surfaces. Pages built as the first module: tree per space, rich and Markdown editing with autosave, files in R2, search, history and undo. The Notion connector (import mode) is deployed with its import plan ready; it runs once a Notion integration token is set (
NOTION_TOKEN) and the pages are shared with it.
6. After the pilot¶
In order: the Inbox (Needs you, Today, Waiting on, What changed) and the morning brief; a Renewals watcher as the first routine; Google Workspace (calendar into Today); membership out of Clerk organisations and per-space roles, ahead of more users; then Ripplebase integration (its review, failed-job and delivery items in the Inbox; brands as spaces), starting with a signed activity feed on the Ripplebase side. Proposal §13 steps 4–7 follow.
7. Risks¶
- Repo formats drift. A Claude session reshapes a table and the parser misreads it. Mitigations:
thinklio.ymlnames the key column; a read that would archive more than a third of a list's records is held, and shown on the list as a warning instead of applied. - Stale project lists if a webhook fails silently: the hourly sweep, and each list shows the commit and time it was last read.
- Scope creep toward Notion. Fixed object types only: tasks, list records, pages. No blocks, no databases inside pages, no inline views.
- Notion AI meeting notes and Home's synced blocks do not import cleanly; meetings keep a link back to the archived export for the transcript.
- Typecheck noise if the 5.0 cleanup slips; check new files individually until it is done.
Cross-references¶
- Work Model & IA (proposal): the model this implements (§3–§6, §14 schema)
- Adoption strategy: the List Manager design and success indicators
- 09 External API & Tool Integration: Platform API envelope, MCP services
- Decision log: ADR-029 (Platform API on Convex), ADR-030 (MCP services)
thinklio-services/docs/51-tool-integration-developer-guide-v02.md,52-mcp-credential-and-permission-model-v01.md,54-service-registry-and-ci-v01.md(outside this repo)