Skip to content

docs(spec): optional-connector catalog#152

Open
jordanrburger wants to merge 2 commits into
mainfrom
upstream/connector-catalog-spec
Open

docs(spec): optional-connector catalog#152
jordanrburger wants to merge 2 commits into
mainfrom
upstream/connector-catalog-spec

Conversation

@jordanrburger

Copy link
Copy Markdown
Collaborator

Design review only — no behavior change. Adds a design spec; implementation follows once the approach is agreed. Generalizes the one-off "Google Messages connector" into a reusable catalog. Companion to #149 (merged) and #150.

Context

Scout ships a fixed default connector set. Adding anything else (e.g. Google Messages for personal texts) means hand-editing three files (connectors.yaml, connector-probes.yaml, phases/connectors/*.md) and knowing how assembly gates on enabled_connectors. There's no way for a user to browse connectors Scout already knows how to drive but doesn't enable by default, and turn one on without that authoring.

The enable mechanism is largely already there — the gap is discovery, a turn-on flow, and a default-off marker.

Proposed design (Approach A — "the roster is the catalog")

  1. Data model: extend connectors.yaml entries (+ the Connector loader) with optional: true (default-off; never auto-enabled by detection) and a catalog: block (summary / description / requirements / setup). Orthogonal to tier.
  2. Browse: scoutctl connectors catalog [--json] lists optional connectors with enabled/available markers.
  3. Enable/disable: enable <key> writes config, collects needs_user_input, prints setup steps, probe-verifies, and re-renders the brain files (additive cat-4 merge → clean) so it takes effect now; /scout-update is the fallback. disable reverts config.
  4. Wizard: /scout-setup & /scout-update surface the catalog as an opt-in step (built on the CLI primitive).
  5. Seed/proof: Google Messages as the first catalog entry, de-personalized — no contacts ship (vault-only state).

Alternatives B (connector package dirs — for community sharing, scoped out; sizeable refactor) and C (separate catalog manifest — drift) documented and rejected. B is left as a clean future path.

Asking reviewers

  • Is "the roster is the catalog" the right call vs. a package format (B)?
  • The enable → re-render coupling (enable invokes the cat-4 assembly path): the change is additive so the merge should be clean, with /scout-update as fallback — comfortable with that, or should enable always defer to /scout-update?
  • Probe honesty for setup-gated connectors (Google Messages pairing is manual; the probe asserts the browser capability, not readiness).

Spec: docs/superpowers/specs/2026-06-21-optional-connector-catalog-design.md

🤖 Generated with Claude Code

Design spec (for review, not yet implemented) for a curated, in-engine catalog of
optional connectors users can browse and turn on without authoring — generalizing the
one-off "Google Messages connector" need.

Approach A (chosen): the roster IS the catalog. Extend connectors.yaml entries (and the
Connector loader) with `optional: true` (default-off; never auto-enabled by detection)
+ a `catalog:` block (summary/description/requirements/setup). Add scoutctl
`connectors catalog` (browse) + `enable`/`disable` (guided: config write, needs_user_input
collection, setup steps, probe verify, and an additive brain-file re-render so it takes
effect). Surface the catalog as an opt-in step in the /scout-setup & /scout-update wizard.
Seed with Google Messages (de-personalized; no contacts ship — that's vault-only state).

Alternatives B (connector package directories — for community sharing, scoped out) and
C (separate catalog manifest — drift) considered and rejected. Companion to specs #149
(merged) and #150.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@AdamVyborny AdamVyborny left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make sense to me

…model

The catalog's enable flow (add key to connectors.enabled → re-render so
requires:-gated sections appear) only works if a connector has ONE key
across its namespaces: probe/detection, config enabled, phase requires:,
and roster. Add a canonical-key invariant section (§7) making agreement a
hard, validation-enforced rule, and call out the existing mail-connector
violation (#172 — probe/config key `gmail` vs phase `requires: email`,
which drops the whole email phase from assembled SKILL.md) as a
precondition to reconcile. Recommend standardizing on the provider-neutral
key `email` with a `gmail` alias + idempotent `gmail → email` config
normalization on /scout-update. Adds a key-consistency test bullet and a
legacy-config-migration risk note; renumbers Testing to §8.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jordanrburger

Copy link
Copy Markdown
Collaborator Author

Folded #172 (email/gmail canonical-key mismatch) into this spec as a precondition of the catalog's key model:

  • New §7 Canonical-key invariant — a connector must use one key across all namespaces (probe/detection, config enabled, phase requires:, roster); scoutctl connectors + CI enforce it. A mismatch makes a connector silently un-enableable (the enable <key> flow writes a key the phase gate never matches → sections never render), which is exactly the trap the catalog's turn-key promise must not inherit.
  • Calls out the existing mail violation (probe/config gmail vs phase requires: email → the whole email phase is dropped from assembled SKILL.md; verified on a live vault) and recommends standardizing on the provider-neutral email with a gmail alias + idempotent gmail → email config normalization on /scout-update.
  • Added a key-consistency test bullet (§8) and a legacy-config-migration risk note.

Commit: 8b8ffc2.

jordanrburger pushed a commit that referenced this pull request Jun 28, 2026
Leaves only docs/specs/event-triggers.md in this PR. The enrichment-recall
and optional-connector-catalog specs are already under review as #150 and
#152 respectively, so they don't belong here.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

2 participants