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 intoJul 23, 2026
Conversation
…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
Eric Smith (motionBuilderEric)
marked this pull request as ready for review
July 21, 2026 17:47
…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.
…s per-run batching, never a coverage limit
…ity_post source type, recipe + template
…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.
…flat type-prefixed filenames
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.
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.
Eric Smith (motionBuilderEric)
merged commit Jul 23, 2026
eb3b5c5
into
eric/aligned-onboarding-v2-meta-package
2 of 3 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
voc-data-pullis 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 toagent_skills/voc-data-pull, and apackage_instructionresource (instructions/activation.md) that lands in the agent's standing instructions.installPolicy: autoso a matching intent installs with no manual step;updatePolicy: autoso 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 itsvoc-sync-<platform>routine does not exist, Runneth creates it (pinned cron0 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 theintegrationsCLI, stored customer key viasecure-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'screated_atminus 2 days,updated_atbound 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 fresherupdated_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_contactstays null and raw payloads are not persisted (both flagged halves of the same pending PII/template policy call)./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,nullwhen the source lacks the concept).skill/references/platform-recipes.md- per-platform endpoints, pagination, discovery steps, and unified-template field mappings (includingsource_urlandreply_countsemantics 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 viaparent_ref), and community post.package-index.json- the first indexed package. Categories list oneintegration:<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 typebackend-github(fetched through the backend's package cache).indexRevisionuses a date-sequence scheme (2026-07-22-01).scripts/validate-runneth-package-index.mjs- aligned with the current package-manager contract (package.jsonmanifests,installPolicy,packageManagerVersion1|2, manifest v2 tasks/workflows,github/backend-githubsources), with shared manifest assertions (semver required for v1 and v2), a header pinning the agent-builder schema files it mirrors, andpackageManagerVersionincluded 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, andvalidate-catalog.mjsis 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), orpackage 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.voc-sync-judge_mecreated (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)
author_contactis nulled and raw platform payloads are not persisted - both halves of the same pending decision, flagged in the skill rather than silently resolved.chmod/EPERMbug 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 therunneth-fleet-change-approvedlabel after core engineering approval.