Connectors publish a deployment path, not a build state
Decided
every connector in the catalogue carries a required maturity field on one of three levels — "Generally available", "Limited release", "Implementation-led" — and the level answers the question *how do I turn this on*, not the question *does this exist*. MATURITY_LEVELS carries a selfServe boolean per level; SELF_SERVE_CONNECTOR_COUNT is derived from the catalogue and feeds the "9 of 15" figure in the copy above the grid.
Affects: lib/integrations.ts, components/integrations/integration-grid.tsx
Alternative, and the one tried first: grade connectors by build state — in production, limited release, or specified-but-not-yet-written — and mark five of them as specified. This is the more candid-sounding taxonomy and it is what the audit item appeared to be asking for.
Why not: it would have contradicted five other surfaces at once. All five candidates for "specified" appear in sample-workspace connectedIntegrations arrays in lib/tenant-workspaces.ts, so their cards would have rendered "nothing has synced" beside a live sync age. lib/careers.ts:281 tells candidates we ship native connectors for Sage 300 CRE and NetSuite; app/integrations/page.tsx:23 names all fifteen as native connectors; two activity feeds carry "Sage 300 CRE sync" and "NetSuite sync" as actors. Closing one audit item by opening five is not closing it.
The deeper problem is that the build-state framing answers a question no buyer asked. Nobody evaluating a connector needs to know whether the code exists — they assume it does, because it is on a page listing connectors. What they need before they can plan a go-live is whether turning it on is a switch or a project, and three of these are honestly a project: Sage 300 needs its cost-code mapping agreed before a transaction can post, NetSuite needs subsidiary and item mapping, QuickBooks Desktop needs a signed .QWC file installed on a machine inside the customer's network. Each of those three already said so in its own detail prose. The taxonomy makes the page's structure agree with what the page already told a careful reader, which is the version of honesty that is also useful.
Why the field is required rather than optional: an omitted maturity defaults to whatever the reader assumed, and what a reader assumes on a page this specific is "flip a switch". The default would silently be the most flattering answer, applied to exactly the connectors somebody forgot to think about.
Why the count is derived: SELF_SERVE_CONNECTOR_COUNT filters the catalogue rather than being typed. Promoting a connector moves the published sentence and the card in the same edit. A hand-typed count would be a second place for the number to live and therefore the place it would eventually be wrong — the general form of this is D-042.
What would make this wrong: a connector that is genuinely unbuilt. There is no level for that and there should not be one, because an unbuilt connector should not have a card. If one is ever specified ahead of implementation, it belongs on a roadmap surface, not in a catalogue whose entries publish field mappings.