Skip to content

feat(packages): add voc-data-pull, the VoC raw-data package with connect-time auto-install and self-activating daily sync - #159

Merged
Eric Smith (motionBuilderEric) merged 14 commits into
eric/aligned-onboarding-v2-meta-packagefrom
eric/pdec-9193-voc-data-pull-package
Jul 23, 2026
Merged

feat(packages): add voc-data-pull, the VoC raw-data package with connect-time auto-install and self-activating daily sync#159
Eric Smith (motionBuilderEric) merged 14 commits into
eric/aligned-onboarding-v2-meta-packagefrom
eric/pdec-9193-voc-data-pull-package

Conversation

@motionBuilderEric

@motionBuilderEric Eric Smith (motionBuilderEric) commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

What this is

voc-data-pull is an installer package that pulls raw voice-of-customer (VoC) data - product reviews, support conversations, community posts, and ad comments - from a connected platform into standardized files in the org brain: one file per item, a human-readable header and content with the full machine-parseable metadata record in a collapsed block. Once installed, the package activates itself: a standing instruction has Runneth create one daily sync routine per connected platform, so the backfill and all subsequent pulls run with zero human prompting. Creative strategy's VoC packages build on these files. Tracking: PDEC-9193 (PR 1 of 2; PR 2 in agent-builder makes the backend feed package intent on connect and wake the conversation so the activation instruction runs).

Contents

  • packages/voc-data-pull/package.json - installer manifest (schema v1): a directory resource installing the skill to agent_skills/voc-data-pull, and a package_instruction resource (instructions/activation.md) that lands in the agent's standing instructions. installPolicy: auto so a matching intent installs with no manual step; updatePolicy: auto so recipe fixes roll out on later syncs.
  • packages/voc-data-pull/instructions/activation.md - the self-activation contract. When a covered platform is connected and its voc-sync-<platform> routine does not exist, Runneth creates it (pinned cron 0 6 * * *, silent-success/delivered-failure delivery) and kicks the first sync run in the background. Routine absence - not folder state - is the setup trigger, so cancel-and-reconnect re-sets-up cleanly. Pulls never run inside the user's conversation; the routine prompt defers all run behavior to the skill. Junip is gated on a working key check before its routine is created.
  • packages/voc-data-pull/skill/SKILL.md - the pull workflow: resolve the connection path (Pipedream OAuth via the integrations CLI, stored customer key via secure-fetch, Motion native for Meta ad comments), follow the platform recipe, write id-keyed files, report results. A "Recurring sync runs" section owns routine-run behavior: the incremental window (empty folder → trailing 12 months backfill; otherwise newest item's created_at minus 2 days, updated_at bound for tickets - daily runs pull only new data, never re-page history), multi-account iteration, and disconnect handling (no-op run, never self-pause/cancel). Per-source write policy: reviews skip existing files, tickets overwrite on fresher updated_at, comments/posts overwrite inside the pull window (engagement mutates). Hard boundaries: read-only against platforms; bounded pulls with the 12-month window as the coverage contract (page caps are per-run batching, never a coverage limit); never write into /agent/brain/integrations/<source>/; author_contact stays null and raw payloads are not persisted (both flagged halves of the same pending PII/template policy call).
  • File layout: everything lands under /agent/brain/data-sources/voc/<platform>/ - one flat folder per platform, type-prefixed id-keyed filenames (review-<id>.md, ticket-<id>.md, comment-<id>.md, post-<id>.md). The id-keyed path is the contract that re-pull dedupe, ticket overwrite, and the incremental window depend on. Each file is three parts: H1 headline, bold-label human header, readable content, then the unified metadata as a collapsed fenced-YAML block (one flat shape for every item, all fields always present, null when the source lacks the concept).
  • skill/references/platform-recipes.md - per-platform endpoints, pagination, discovery steps, and unified-template field mappings (including source_url and reply_count semantics per platform), with honest evidence levels: Judge.me/Gorgias/Intercom live-verified; Trustpilot/Yotpo doc-grounded pending first connects; Reddit needs-setup with org-specific pull targets; Junip blocked on a dead key; Okendo/Stamped secrets-path (no Pipedream app exists - customer API key + secure-fetch).
  • skill/templates/ - copyable skeletons for all four output shapes: review, support conversation (header top, full conversation below), ad comment (replies are their own files via parent_ref), and community post.
  • package-index.json - the first indexed package. Categories list one integration:<slug> per VoC platform (judge_me, trustpilot, yotpo, junip, gorgias_oauth, intercom, reddit, okendo, stamped) because the VM reconciler matches literal connected slugs - no invented family category. Slugs verified against the Builder integration registry. Source type backend-github (fetched through the backend's package cache). indexRevision uses a date-sequence scheme (2026-07-22-01).
  • scripts/validate-runneth-package-index.mjs - aligned with the current package-manager contract (package.json manifests, installPolicy, packageManagerVersion 1|2, manifest v2 tasks/workflows, github/backend-github sources), with shared manifest assertions (semver required for v1 and v2), a header pinning the agent-builder schema files it mirrors, and packageManagerVersion included in the fleet-gate fingerprint so a manifest-contract flip cannot bypass approval. Overlaps fix(package-index): validate current package contract #152 by design; whichever merges first, the other rebases clean.

This is an installer package under packages/, not a use-case-library card: no site catalog changes, and validate-catalog.mjs is untouched.

How it installs and activates

Connected-integration package intent selects this package via its integration:<slug> categories and the desired-state installer installs it. Two triggers: the connect-time dispatch shipping in agent-builder (automatic - and its post-connect turn is what makes the activation instruction run with zero human words), or package intent add-integration <slug> in a sandbox (manual path, works today - also the route for the secrets-path platforms, which have no Pipedream connect). On the manual path, activation happens on the next conversation turn or prompt.

Validation

  • node --test scripts/validate-runneth-package-index.mjs - passes except the intentional fleet-approval gate (see CI note).
  • node --test scripts/validate-catalog.mjs - passes, untouched surface.
  • Manifest and index entry are field-for-field consistent (enforced by the validator's mirror test).
  • Live E2E on a fresh sandbox with the agent-builder PR: Judge.me connect → auto-install → activation turn → voc-sync-judge_me created (cron 6am) → backfill ran and wrote correctly shaped files → a manual re-run used the incremental window (newest-minus-2-days, 0 re-writes). Idempotency verified: re-asking and reconnecting found the existing routine and created nothing.

Open items (surfaced, not solved here)

  • The unified metadata template is proposed pending Eric/Rachel sign-off; the package builds against it as the contract.
  • PII policy call: author_contact is nulled and raw platform payloads are not persisted - both halves of the same pending decision, flagged in the skill rather than silently resolved.
  • Trustpilot/Yotpo recipes are doc-grounded until their first live connects; Junip needs a working key; Reddit pull targets are org-specific and need setup.
  • Package installs on Azure-mounted staging VMs currently hit a pre-existing chmod/EPERM bug in the runneth-tools installer (mounted-filesystem contract); fix lands separately in agent-builder.

CI note

The fleet-approval gate fires (new package with installPolicy: auto) - needs the runneth-fleet-change-approved label after core engineering approval.

…rm connect

Installer package that pulls raw voice-of-customer data - product reviews,
support conversations, and ad comments - from a connected platform into
standardized files in the org brain: one file per review/ticket/comment,
flat metadata header + body, untouched platform payload preserved in every
file (PDEC-9193, PR 1 of 2).

- skill/SKILL.md: the pull workflow - resolve the connection path
  (Pipedream OAuth via integrations proxy, stored secret via secure-fetch,
  Motion native for Meta ad comments), follow the platform recipe, write
  files under /agent/brain/data-sources/<platform>/. Hard boundaries:
  read-only against platforms, bounded pulls (12-month default, page caps),
  never write into /agent/brain/integrations/<source>/, author_contact
  nulled pending the PII policy call.
- skill/references/platform-recipes.md: per-platform endpoints, pagination,
  discovery steps, and unified-template field mappings with evidence
  levels. Judge.me/Gorgias/Intercom live-verified; Trustpilot/Yotpo
  doc-grounded pending first connects; Junip blocked on a dead key;
  Okendo/Stamped are secrets-path (no Pipedream app exists); Meta ad
  comments via motion meta creative-comments.
- skill/templates/: copyable review and support-conversation file skeletons
  (support shape follows the Ramy Brook Gorgias precedent:
  daily/<date>/ticket-<id>.md, metadata top, full conversation below).
- package.json manifest: one directory resource installing the skill to
  agent_skills/voc-data-pull; installPolicy auto so matching intent
  installs with no manual step, updatePolicy auto so recipe fixes roll out.
- package-index.json: first indexed package. Categories list one
  integration:<slug> per platform (judge_me, trustpilot, yotpo, junip,
  gorgias_oauth, intercom, okendo, stamped) because the VM reconciler
  matches literal connected slugs - no invented family category.
- scripts/validate-runneth-package-index.mjs: aligned with the current
  package-manager contract (package.json manifests, installPolicy,
  packageManagerVersion 1|2, manifest v2 tasks/workflows, backend-github
  sources). Same content as #152; whichever merges first rebases clean.
- Card files (use-case.json, README.md, marketing.md) included per repo
  structure; slug added to catalog excluded[] - not a public-site use case.

CI note: the fleet-approval gate fires (new auto-installable package) and
needs the runneth-fleet-change-approved label after core engineering
approval.
…honest date-bound claims, PII disclosure, fleet-gate fingerprint
@motionBuilderEric
Eric Smith (motionBuilderEric) marked this pull request as ready for review July 21, 2026 17:47
@motionBuilderEric
Eric Smith (motionBuilderEric) requested a review from a team July 21, 2026 17:47
@motionBuilderEric Eric Smith (motionBuilderEric) changed the title feat(package): add voc-data-pull v0.1.0, auto-installed on VoC platfo… feat(packages): add voc-data-pull, the VoC raw-data installer package with connect-time auto-install Jul 21, 2026
…l header, collapsed metadata; drop raw payloads
…uction

Switch the index entry's package source to backend-github per repo package
conventions, so VM artifact fetches route through the backend cache instead
of raw GitHub (bump indexRevision to 2026-07-22-01).

Add a package_instruction resource (instructions/activation.md) that lands
in the agent's standing instructions on install: Runneth offers the first
pull when a covered VoC platform is connected and no data-sources pull
exists, runs the skill on request, and never starts a pull without user
confirmation. Install stages files only; this closes the awareness gap
without auto-running anything.
…ruction

activation.md: routine absence triggers setup - creates voc-sync-<platform> (cron 0 6 * * *), kicks the backfill run, silent-success/delivered-failure delivery, Junip key gate; pulls never run in-conversation. SKILL.md: new Recurring sync runs section owns the incremental window (empty folder = trailing 12 months, else newest created_at minus 2 days, updated_at for tickets), multi-account iteration, disconnect no-op; dropped the confirm-before-starting gate. README updated to match.
…e policy, routine routing

SKILL.md: the id-keyed filename contract now survives existing folder conventions (adopt surrounding layout, keep id-keyed names); explicit re-pull write policy per source type (reviews skip, tickets overwrite on fresher updated_at, comments/posts overwrite inside the pull window since engagement mutates); user pull requests route through the sync routine; description covers Reddit and community posts. activation.md: routine prompt defers run behavior to the skill's recurring-sync rules instead of restating it; first kick described as a sync run whose window the skill determines. README: drop the stale no-automatic-post-install-trigger gap, describe the header shape directly, point the platform list at the Step 1 table.
@motionBuilderEric Eric Smith (motionBuilderEric) changed the title feat(packages): add voc-data-pull, the VoC raw-data installer package with connect-time auto-install feat(packages): add voc-data-pull, the VoC raw-data package with connect-time auto-install and self-activating daily sync Jul 22, 2026
installPolicy flips to manual - the team installs per VM (package intent add-optional voc-data-pull + package sync); updatePolicy stays auto so installed copies track main. Setup is strictly manually triggered: the recurring-sync procedure (routine-absence check, routine add with cron 0 6 * * *, first-run kick, Junip gate, never pull in-conversation) moves into SKILL.md and runs only when asked, directly or via an onboarding run - nothing happens just because a platform is connected. The activation instruction slims to a pointer stating the same. Once set up, the daily routine refreshes data on its own. Categories retained for a future auto-install flip.
@motionBuilderEric
Eric Smith (motionBuilderEric) changed the base branch from main to eric/aligned-onboarding-v2-meta-package July 23, 2026 18:39
…-pull/ subfolders, one combined README

Merges eric/aligned-onboarding-v2-meta-package and folds the VoC package into the onboarding folder as its own subfolder beside meta/, per the agreed shape. The install-config (v2.1.0) stages the skill, platform recipes, and four output templates to /agent/.agents/skills/voc-data-pull/; the combined README documents the VoC part with its own scope rules and adds sync setup to the run order. Setup is manually triggered only - when asked, Runneth creates one daily voc-sync-<platform> routine per available platform (OAuth, stored key, or Motion native alike). The package-manager lane is dropped: the index returns to initial-empty, so the fleet gate no longer applies. Root README/MIGRATION manifest-name references corrected to package.json.
@motionBuilderEric
Eric Smith (motionBuilderEric) merged commit eb3b5c5 into eric/aligned-onboarding-v2-meta-package Jul 23, 2026
2 of 3 checks passed
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.

1 participant