docs(connectors): D8 Phase 2 — the gate surface and the capability catalog (TASK-009) - #1545
Conversation
…talog (TASK-009) A read the page lacks (GET /api/installables with per-provider readiness and the caller's parent row), parent states as rows whose actions are the verbs the service already honours (Retry reclaims from error, Remove from error, Cancel exactly when the lock is stale), and the D8 schema flip: user scope, optional podId, config.gates per pod, outbound inverted pod → members → gated connectors, membership as the outer gate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…the pod-creator branch of canDeleteIntegration does not carry over Vera 63551: a pod creator could flip gates[theirPod] on another member's private DM through the existing PATCH authorisation. Seed 7b pins it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tes need one admin verb, and it is a stop with a reason Vera 63565: owner-only PATCH left an admin with the database or disabling the provider. Pause/resume writes the paused status the enum already carries, never touches the owner's config, and audits both ways. Seed 10 pins it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…too — the webhooks never join to the parent Vera 63571: the dispatcher reads the parent, the two inbound resolvers read the Integration. One flag, config.adminPause, stamped by the same write and excluded by both resolvers; distinct from the owner's relayMutedUntil. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…a crash fails toward paused Vera 63602: parent and children are two collections. Pause writes parent first, resume writes children first; the sweep repairs toward the parent; the admin route answers 202 projected:false when the second write fails. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Gate at Ordering — accepted. Parent-first on pause is right, and my earlier suggestion (children first) was wrong on the mechanism: with a parent-authoritative reconciler, a children-first crash is reverted by the sweep, not repaired. Resume children-first is the correct mirror. One wording point: "always fails toward paused" overstates it. Parent-first stops outbound immediately (the dispatcher’s Blocker — §2 D3,
Consequences on main today:
The index was written when nothing wrote Sweep repair is two new branches, not existing behaviour. §4 seed 10 covers the crash windows well. It needs one more case: an owner pressing Connect (and Remove) on a paused row must not produce a second live parent or a silent success. |
…owner verbs refuse, sweep gains its branches Vera's #1545 review: with D3 as the first writer of paused, the partial unique index and claim filters that omit it become load-bearing — an owner's install would upsert a second live parent and lift the pause; uninstall would no-op. Both now answer 409 installation_paused. Wording corrected to "fails toward outbound stopped"; seed 10 gains the owner-verb case. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Re-gate at Still open: two call sites, or neither promised 409 fires. The three sites the note names (partial index,
Both need an explicit Nothing else new since |
… a 409 Vera 63733: the index and claim statuses make the claim refuse; a typed InstallationPausedError thrown from the install loser path and the uninstall winner path, mapped in sendInstallError, is what makes the 409 real. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Gate clear at Verified the three named sites are the complete set:
Seed 10 already asserts the response code and the reason, not just the parent count, which was the other half of my last comment. No further findings. The note is buildable as written. |
…d uninstall's return path — the exact sites Vera 63734: a paused row falls to the transient tail (202 installing that never resolves, or InstallInProgressError) and uninstall returns the paused row as 200. Both throw InstallationPausedError. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Design note for TASK-009, the piece #1542 §4 named as missing from the kernel and Vera asked for at 63278.
docs/plans/d8-phase-2-gate-surface.md:ADD_PLATFORMSis page-side), one pod per connectorGET /api/installables: catalog +availablefrom a per-manifest readiness check (reason enum only, never an env name) + the caller's parent row withclaimedAt+ the public integration; install refuses an unconfigured provider with 422errorin place, Remove uninstalls fromerror, Cancel appears exactly when the lock is stale (no new verb),projection missingfrom the reconcilerscope: 'user', optionalpodId,config.gates[podId], outbound inverted pod → members → gated connectors, membership as the outer gate, membership-gated PATCH writes, one-shot migrationDocs only.
🤖 Generated with Claude Code