Sloth-ninja clears phantom connectors out of the shop window

The fork stops pilot users being offered integrations that were never ready to connect.

integrationworkflow

Canva and Apollo have been removed from the connector gallery after their advertised one-click connections proved unverified. That is a small product decision with a practical effect: fewer dead ends for firms setting up new tools.

  • Gallery settings now ignore retired connectors, so an administrator can still save changes made before an option disappeared.
  • Old connections to a retired option remain visible as removable custom connections.
  • Firm members can no longer change a legacy free-text organisation label through their profile, matching the interface.
So what Legal-ops teams trialling connected workflows should care because the setup screen now makes a more honest promise about what will work.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

5 commits from Sloth-ninja/JessicaOSS, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
04b78e20 fix: remove Canva and Apollo from the connector registry (never built) sloth-ninja 2026-08-13 ↗ GitHub
commit body
Owner decision 13/08/2026: neither was part of the UK-legal shortlist
rationale, and both were marked availability:"oauth" with "VERIFIED"
comments that nothing ever verified - the gallery rendered a live
Connect button that dead-ended for pilot users. Delete both entries
outright.

Removing a previously-valid registry id exposes a real gap: the admin
connector-gallery curation PATCH validated every incoming id against
the live registry and 400'd the whole write on an unknown one. Since
the admin UI round-trips its full tick-list on every toggle (with no
control to un-tick a row the registry no longer renders), a firm that
had curated canva/apollo would be permanently blocked from saving any
future connector-gallery change. parseConnectorCuration now silently
drops unknown string ids (still 400s on genuinely malformed,
non-string entries), matching the read-side tolerance
filterRegistryByOrgCuration already has.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
05571808 fix: server-side belt drops firm members' legacy organisation writes sloth-ninja 2026-08-13 ↗ GitHub
commit body
PATCH /user/profile accepted and unconditionally wrote the legacy
free-text `organisation` field. A sibling frontend PR hides the input
for firm members; this is the server-side belt.

When the caller has a non-null organisation membership, the
organisation key is now silently dropped from the update before it
reaches the DB - not rejected with a 4xx, since the field is cosmetic
(absence-not-disabled precedent, WS8 PR B). Other fields in the same
PATCH still apply. Fails OPEN on a membership-lookup error: this is a
non-destructive cosmetic write, so availability wins (WS8 PR B
precedent, not the deletion fail-SAFE direction). Orgless callers are
unaffected. The membership lookup only runs when the payload actually
touches `organisation`, avoiding an extra query on unrelated PATCHes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
eedbb795 fix: GET /admin/connector-gallery filters stale ids from enabledConnectorIds sloth-ninja 2026-08-13 ↗ GitHub
commit body
Review finding (Minor 1): the stored enabledConnectorIds were returned
unfiltered, so a firm that had curated a since-removed registry entry
(e.g. canva/apollo, removed 13/08/2026) would see it echoed back. This
inflates the admin card's tick count - its "all visible" footer
compares visible.size === registry.length, so a phantom stale id makes
that comparison false while a real entry stays effectively hidden from
the count - and a curation stored as ONLY stale ids would let an
untick compute a payload the server canonicalises to [] ("all
visible"), inverting the admin's intent.

Filters the stored list against connectorRegistryIds() before
returning, mirroring the write-side tolerance already applied to
PATCH /admin/connector-gallery.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
8832de30 test: make resolveUserOrganisation a spy so call-count claims are real sloth-ninja 2026-08-13 ↗ GitHub
commit body
Review finding (Minor 2): the "does not resolve membership when payload
has no organisation key" test used a bare closure for the
resolveUserOrganisation mock, so it recorded nothing and the test would
pass under any implementation - the claim was never actually checked.

Replaces the closure with a vi.fn() spy (call-through pattern matching
user.connectorGallery.test.ts) and asserts exact call counts: a
displayName-only PATCH resolves membership exactly once (loadProfile's
own resolve for the response's `firm` field), an organisation-touching
PATCH exactly twice (the belt's resolve + loadProfile's).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5bbe0a09 docs: BUILD_LOG entry for the pilot-feedback fix train PR B sloth-ninja 2026-08-13 ↗ GitHub
commit body
Connector-registry honesty (Canva/Apollo removed, owner decision
13/08) + firm-member organisation-write belt, including the two
review-round fixes (PATCH silent-drop, GET read-side stale-id filter).

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

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-1018.md from inside the repo you want the changes in.

⬇ Download capture-thread-1018.md