Skip to main content

Manuscript First Seed — 3 Handbooks, Dual-Source, Validated

The Manuscript ingestion pipeline shipped with zero canonical handbooks. Today it has three — across both Notion and Airtable — with the full ingest → sync → cross-reference flow verified end-to-end on production.

What got seeded

HandbookPlatformSlugProgram
STRATT Social Comeback EngineAirtablephm-social-comebackstratt
Escape Velocity: Corporate Orbit → Autonomous InfrastructureNotionescape-velocitydevarno
Dev Campaign Framework — Master PlaybookNotiondev-campaign-master-playbookdevarno

Canonical IDs

  • Airtable base: appiayWVkTET7TmyW · table: tblSvqsW7iacC2zoU · workspace: wsp26BZxwFETzo118
  • Notion database: 348a6719-ea07-8177-9eb3-f165653e12cd · data-source: 348a6719-ea07-81fe-a331-000baf949839 · parent page: 348a6719-ea07-81d5-b808-fafc85e0c48c (inside Document Hub 348a6719-ea07-80ad-b86e-df55a34f1647)
  • Vercel env vars on cloud-hubble production: NOTION_TOKEN, AIRTABLE_API_KEY, MANUSCRIPT_NOTION_DATA_SOURCE_ID, MANUSCRIPT_AIRTABLE_BASE_ID, MANUSCRIPT_AIRTABLE_TABLE_ID, MANUSCRIPT_WEBHOOK_SECRET

Sync result (first real run)

handbooksScanned: 3  ·  diffsWithChanges: 3
signalsWritten:   9
xrefs:            8 inserted / 0 updated / 0 pruned
manuscriptVersion: 1 → 2
Eight cross-references emerged on first scan: STRATT shared across all three, devarno+pebble+airlock+casa shared between EV and Master Playbook, platform overlap (twitter/linkedin) between PHM and the other two.

Footguns hit

  1. Notion v5 data-source split. The ingester calls notion.dataSources.query({ data_source_id }) (API version 2025-09-03), not the legacy databases.query({ database_id }). MANUSCRIPT_NOTION_DATA_SOURCE_ID must be the data-source ID (fetched via GET /v1/databases/{id} and reading data_sources[0].id), NOT the database ID. First ingest failed with 404 “Could not find database” because I’d set the database ID. Swap was one Vercel env bump.
  2. Internal integrations can’t create workspace-level pages. Notion rejects parent: { type: "workspace", workspace: true } for internal integrations. Workaround: user shares one existing page/database with the integration; creates a child page there; databases hang off that child. We used the default Document Hub database as the grandparent.
  3. Airtable PAT can’t mutate existing select-field options. Adding bluesky/reddit to an existing Target Platforms field via PATCH /meta/.../fields/{id} returned validation error despite schema.bases:write scope. Workaround: declare all options at base-creation time, or use ?typecast=true on record create (which auto-provisions options at record-insert). We pre-declared the common set and dropped the missing platforms into Principles text.

How to add handbook #4

  1. Create a new row/page in the relevant source (Airtable base appiayWVkTET7TmyW or Notion DB 348a6719-ea07-8177-9eb3-f165653e12cd) with the 11 canonical fields.
  2. POST https://hubble.devarno.cloud/api/cron/manuscript-ingest with {"source":"notion"} or {"source":"airtable"} and Authorization: Bearer $CRON_SECRET.
  3. POST https://hubble.devarno.cloud/api/cron/sync/manuscript with {"trigger":"manual"} to recompute xrefs + signals.
  4. Confirm in Studio at studio.devarno.cloud/manuscript.