> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quivr.thevibecompany.co/llms.txt
> Use this file to discover all available pages before exploring further.

# X list connector plugin (x-list)

> The first-party X list connector plugin and its parity tests

The first-party connector plugin behind the `x_list` kind: it polls the posts
of one X list through the X API v2 and withdraws posts deleted or made
protected at the source. The operator guide is
[docs/connectors/x.md](/connectors/x); this page is for people who
build, test or pin the plugin.

* **Built only on the Go SDK** ([sdks/go](/sdks/go)), as its own
  module; `make plugin-boundary` keeps it off the engine's packages.
* **Manifest** `plugins/x-list/quivr-plugin.yaml`: plugin id and extension
  namespace `connector.x_list`, the names the former built-in kind used, so
  existing Connector Instances and Records carry over. Plugin API 0.5: the
  plugin binds Relation targets to the instance's `corpus_id` and
  `source_namespace`, receives webhook deliveries (`modes: [pull, push]`), and
  declares `max_checkpoint_bytes` 512 KiB for the deletion recheck set (up to
  2,000 posts) and the members of a webhook resync.
* **Webhook mode** ([guide](/connectors/x-webhooks)): pull runs
  keep Filtered Stream rules, the webhook and its link in step with the list
  members (`stream.go`); `Receive` answers the CRC check and maps signed
  deliveries with `MapPost`, like polling (`webhook.go`). The X endpoint shapes
  follow X's public docs and are tested against fakes only.
* **Configuration**: `api_endpoint`, the X API origin (default
  `https://api.x.com`). Set it only to point at a test fake.
  `allow_short_recheck` accepts `recheck_interval_seconds` below 60 so tests
  need not wait a minute; it holds only with a loopback `api_endpoint`, and
  every fetch fails with `invalid_configuration` otherwise.
* **Credential check**: answers ok without calling X, because X bills every
  request. A refused token shows at the first fetch as `unauthorized`.

<h2 id="pin-it">
  Pin it
</h2>

`make dev`, `make verify` and the browser demo build and pin it on every stack
start (`QUIVR_X_LIST=off make dev` leaves it out); they point `api_endpoint` at
the local fake X API and set `allow_short_recheck`. The Railway image runs it beside the worker on
127.0.0.1:9930, and beside the API for webhook deliveries. Elsewhere, build it (`go build .` here) and pin it as
[Run a connector plugin](/plugins/run-a-connector-plugin) explains.

<h2 id="test-it">
  Test it
</h2>

`make test` runs `scripts/plugin_sdk_go.sh`, which:

* runs `go vet` and `go test` here. The tests replay the scenarios of
  testdata/scenarios.json (`plugins/x-list/testdata/scenarios.json`) against a fake X API and
  compare every X request, item, checkpoint, billed-read count, notice,
  diagnostic and error with testdata/builtin (`plugins/x-list/testdata/builtin/`), what the
  former built-in kind returned before it was deleted. Each run starts from the
  built-in kind's checkpoint, so each run also proves the cutover;
* certifies the plugin with `quivr plugin test` against `scripts/fake_x.py`
  (`plugins/x-list/fixtures/`); CI uploads the report as `x-list-contract-report`.

The goldens are frozen: a behaviour change updates them on purpose, in the same
pull request, and says why.
