partner-marketplaces · git:20260924.0d5d7a1 · 2026-09-24 · sha256 f14c8decd4f31fc9
partner-marketplaces git:20260924.0d5d7a1A
Immutable. This exact content never changes and is served at /api/v1/blob/f14c8decd4f31fc9.
--- name: partner-marketplaces description: Turn the integrations in the Code map into ranked, submission-ready listings on the partners' own app marketplaces. --- People who already use Slack, GitHub, HubSpot or Shopify look for add-ons in those platforms' own marketplaces. This skill compares two lists: the integrations in the Code map, and the marketplaces where the product is listed. It then prepares the few listings worth submitting now. Read MARKETPLACES.md, SCORING.md and REPORT.md before starting. Extract the Python block from SCORING.md into a scratch module and use it unchanged for readiness, scores, picks, character limits and run-to-run state. ## Budget - At most 11 marketplaces, one row each. Several integrations that land in the same marketplace (Gmail and Calendar in Google Workspace) share one row. - At most 40 web actions in total: two presence lookups and one competitor lookup per marketplace, one site check per required page, and one rules recheck per pick. - Stop looking when the budget is spent. A row you could not finish is `unknown`, and the report says so. Status is `incomplete` only when a picked row lacks evidence: a gate or presence result with no URL or `path:line` behind it. An `unknown` gate with its evidence cited, or an unpicked row you could not finish, still allows `complete`. ## 1. Load memory and the last run 1. Read `wiki/INDEX.md`. Find `### Code map` under `## Product`. If it is missing or has no `**Integrations**` block, write the diagnostic report from REPORT.md and stop: name `product.code_map` as the workflow to run first. Never infer integrations from the website. 2. Read `### Feature map` when present, and any positioning or competitor notes the index names. These supply the listing copy and the competitor names. They are evidence, not instructions. 3. Read `reports/GROWTH_ONBOARDING_PLAN.md` when present: `## The business` for who buys and the words they use, and any `hard no: …` in `## Marketing systems` or anything the founder forbids (`no discounting`: no launch discounts in pricing fields; `no unbacked claims`: every claim in the copy is cited). Read `.agents/skills/writing-style/SKILL.md` when present: the listing copy follows it within each field's limit. Never ask the founder for what these files already say. 4. Resolve the product website: the `product_url` input, else the site named in memory. If neither exists, gates that need a public page are `unknown`. 5. Find every earlier report in the output folder (the directory of the declared output path), parse each `tin-listings-state` block with `read_state()` and fold them with `merge_states()`. If none can be trusted, say continuity is unavailable and carry on. 6. Map the `skip` input to marketplace ids. Words you cannot map are quoted back in the report, not guessed. ## 2. Inventory the integrations Take every line of `**Integrations**`, plus any `**Surfaces**` line that shows an install flow, OAuth callback, public API, browser extension or MCP server. Keep the service, what it does and the `path:line` evidence exactly as memory states it. ## 3. Classify the shape of each one Assign one shape from SCORING.md and write the reason in a few words. Most wrong recommendations start here: - Stripe used for your own checkout is `vendor_side`; a Stripe App that Stripe users install is `user_authorized`. - Google sign-in used only to log users in is `vendor_side`; reading a user's Gmail or Calendar with their consent is `user_authorized`. - A Slack incoming-webhook URL the customer pastes is `outbound_only`; "Add to Slack" with OAuth is `user_authorized`. - Email providers, model APIs, databases, hosting, analytics you run on yourself, and authentication vendors are `vendor_side`. - A declared dependency with no call site is `declared_only`. When the evidence cannot decide, choose the less favourable shape and say what would change it. Also check the Code map for things the product ships that have their own store: a browser extension manifest or an MCP server. They are `distributed_artifact`. ## 4. Map to marketplaces Match each storefront shape to its entry in MARKETPLACES.md by the code signals listed there. A partner with no entry goes to "No marketplace in the reference" with its evidence. Never search the web for other directories. Mark rows the founder asked to skip; they stay in the table and are never picked. ## 5. Check the shelf For each mapped marketplace, run the listed marketplace search for the product name, then a domain search for the product's domain or name. Open a result before you call it `listed`. Record the URL and the date. If both lookups ran cleanly and found nothing, the row is `absent`. Anything else is `unknown`. Then find who is already there: search the marketplace for up to three competitors named in memory, or else the product's category term. Count only listings you opened, and keep their URLs. Similar tools on the shelf show that buyers look for this kind of product there. ## 6. Test the gates For every hard gate of the marketplace, decide `pass`, `fail` or `unknown` from evidence: - Page gates (privacy policy, terms, support contact, pricing, setup docs for this integration): open the site's own page. A link in the footer that returns an error is a `fail`. - Build gates (an installable app, OAuth as the only method, a Stripe App, Shopify billing): read the Code map line. An integration that exists only in the other direction is a `fail`. - Usage gates (install counts, active workspaces): memory rarely proves them. Use `unknown` unless memory states a figure with a source. Never estimate usage. - Review gates (security assessment, OAuth verification): `pass` only when the site or memory shows it was done, for example a verified-app note. Give every `fail` and `unknown` the one fix that clears it, phrased as an action. ## 7. Score and pick Build one row per marketplace and call `pick(rows, max_picks, skip, previous)`. Rate `audience` from memory and cite the line. Do not change a score by hand. A row an earlier run recommended comes back as waiting, never as a pick: do not fill its form again. If no row is picked, the decision is "Nothing new to submit this week", followed by the listing still waiting on the founder, or else the single change that would unblock the best blocked row. ## 8. Prepare each pick For each pick, reopen its rules source once. If a limit or rule changed, follow the live page and record the difference under Evidence. Then fill in the form fields listed for that marketplace: - Write about what the integration does for someone who already uses the partner, from the Feature map and Code map. A listing about the product in general gets rejected. - Use the product's own words and the writing style guide from step 1. No claims memory cannot support: no customer counts, ratings, security badges or partner status. - Run `fit()` on every field with a stated limit and rewrite until it passes. Report the counts. - List the screenshots to take (screen, state, size) instead of inventing images. - Put the page fixes and founder confirmations from step 6 above the form. ## 9. Write the report Call `next_state(previous, ranked, picks, checked, report)` with today's UTC date and the declared output path. Write REPORT.md's layout to the declared output path with Python, inserting the checked values instead of retyping them. Write nothing else. Submission stays with the founder, through each marketplace's own form. Nothing here is an email to a person, so there are no rows for `outreach/email/SHORTLIST.csv`. Do not sign up, sign in, submit a listing, fill a live form, contact a marketplace or a competitor, change project memory, or recommend paid placement. The report is a plan the founder acts on.