docs(spec): optional-connector catalog#152
Conversation
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>
…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>
|
Folded #172 (email/
Commit: 8b8ffc2. |
jordanrburger
left a comment
There was a problem hiding this comment.
Design review — optional-connector catalog
Verdict: 🟠 Needs revision (high-quality prose, but it rests on an outdated codebase model and a reversed premise)
The problem framing is real (adding a non-default connector today means hand-editing three files), the proposed CLI surface (catalog/enable/disable, --json) fits the existing scoutctl connectors sub-app, and the optional: true + catalog: schema additions are backward-compatible as described (_build_connector reads via raw.get(...)). And credit where due — §7 catches a genuine latent bug (below). But three load-bearing issues:
-
The flagship use-case has been reversed. The spec seeds the catalog with Google Messages as the proof-of-concept optional connector — but
connectors.yamlshows it was promoted OPTIONAL→CRITICAL on 2026-04-25 (≈2 months before this spec), with a note that no work connector replaces it. There's also nophases/connectors/google-messages.mdand no probe for it. The spec argues for opt-in defaults; the maintainers' revealed preference is the opposite. Re-justify the premise, or re-seed with a connector genuinely wanted default-off. -
The key model is internally inconsistent. There are three non-reconciled namespaces: roster key (
mcp:claude_ai_Gmail), probe/config key (gmail), and phaserequires:(email). Theenableflow's step-1 validation ("validate<key>exists in roster") operates on themcp:…namespace, butconnectors.enabledtakes the probe key — the spec conflates them, so the turn-key promise can silently no-op. State which namespace each step uses, and make the proposed CI invariant assert agreement across all three (not two). -
Missing scope items: the CI-verified
connectors.snapshot.jsonartifact (snapshot --check) and the scout-app fixture will drift when the schema changes — not mentioned. And the seed connector's phase + probe don't exist and must be authored.
Real bug worth splitting out now (independent of this PR): §7 correctly identifies that probe/config key gmail ≠ phase requires: email, so select_sections silently drops all email phases whenever Gmail is enabled — masked in tests because the fixture (dummy-mixed.md) uses requires: gmail, not the real requires: email. Recommend a standalone fix PR, and fix the masking fixture at the same time.
The spec is well-written and the §7 catch is valuable — but don't merge it as a basis for implementation without addressing 1–3.
🤖 Claude Code-assisted design review.
* docs: preserve three unrealized design specs Move three design proposals that lived only on stale local branches into the in-tree docs so they survive branch pruning. None are implemented on main; this preserves the design work for future use. - docs/specs/event-triggers.md (event-driven triggers; roadmap 'in progress') - docs/superpowers/specs/2026-06-21-optional-connector-catalog-design.md - docs/superpowers/specs/2026-06-21-enrichment-recall-subsystem-design.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: drop specs already covered by open PRs #150 and #152 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> --------- Co-authored-by: Jordan Burger <jordan.burger@keboola.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rection proposal) (#156) * docs(spec): SKILL brain structure — mode-based vs connector-based (direction proposal) A direction-setting proposal (for review by others, not yet decided) on whether SKILL.md should canonically use the mode-based structure (a running vault today) or the connector-based structure (the engine today), and the migration path either way. Genuinely open evaluation across six criteria, weighted toward vault<->engine convergence, self-improvement-loop fit, and distributability (legibility explicitly de-prioritized). The analysis recommends connector-based — it ends the recurring merge tax by construction and is the shape the modular self-improvement loop and the optional-connector catalog are built for; the honest cost is human legibility, flagged for reviewers to challenge. Migration strategy is upstream-first (finish porting the vault's ~24 Patterns + capabilities into the engine's connector phases, then the vault re-renders and adopts — no risky local re-graft), gated by a completeness checklist + behavioral dry-run validation so nothing is lost. Out of scope: implementation (the remaining upstream PRs + the Phase-2 adoption/validation harness) follows once the direction is agreed. Companion to specs #149/#150/#152. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(spec): relabel brain-structure proposal RFC → accepted ADR Per design review on #156: the connector-based structure this doc recommends already shipped (briefing-mode layer #153/ced9247), so the 'for review / direction open' framing would plant a false signal. Relabeled Status to Accepted — implemented, added an implementation- status banner, converted reviewer open questions into decisions taken & accepted trade-offs, and corrected the Phase-1 migration inventory. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Jordan Burger <jordan.burger@keboola.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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 onenabled_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")
connectors.yamlentries (+ theConnectorloader) withoptional: true(default-off; never auto-enabled by detection) and acatalog:block (summary/description/requirements/setup). Orthogonal totier.scoutctl connectors catalog [--json]lists optional connectors with enabled/available markers.enable <key>writes config, collectsneeds_user_input, prints setup steps, probe-verifies, and re-renders the brain files (additive cat-4 merge → clean) so it takes effect now;/scout-updateis the fallback.disablereverts config./scout-setup&/scout-updatesurface the catalog as an opt-in step (built on the CLI primitive).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
/scout-updateas fallback — comfortable with that, or should enable always defer to/scout-update?Spec:
docs/superpowers/specs/2026-06-21-optional-connector-catalog-design.md🤖 Generated with Claude Code