The question nobody could answer
Ask a deployment how much of its knowledge base was written by people outside the organisation, and until now there was no way to find out. Not because the answer was hidden, but because nothing recorded it. Ingestion captures what a document is — a title, a path, a mime type, a project. It captured nothing about where the authority of its text comes from. That gap is invisible right up until you line up what the connectors actually do:- Confluence, Jira, Notion, Drive, OneDrive, Evernote and Fabric read systems the organisation administers. Whoever authored a document there had to be granted the ability to author it.
- IMAP reads a mailbox. A mailbox accepts a message from anyone who knows the address.
This page describes v8.32, the first of three phases in
ADR 0028.
It ships labels and no enforcement — deliberately. Enforcement is only
testable against a corpus that is already labelled.
The three tiers
The connector declares it, never the host
A connector opts in by implementing one interface frompadosoft/askmydocs-connector-base v1.5:
SupportsFolderDiscovery::listAvailableFolders():
two installations of one connector routinely differ, and ConnectorRegistry
keeps a single instance per connector key.
Reading the corpus
Three surfaces, one core (ProvenanceInsightsService):
KbProvenanceTool answers the same question for an agent.
Why declared sits next to the headline
A corpus reading 100% trusted-internal with 0 declared has not been
assessed — it has been assumed. The two numbers are reported together
precisely so a reassuring percentage cannot be mistaken for evidence. The CLI
says so out loud when nothing has been declared yet.
Design decisions worth stating
The default is not the most cautious value
An undeclared document reads asTrustedInternal. Defaulting to untrusted
would relabel every existing corpus overnight and make the label mean nothing.
External content is the exception a connector has to declare.
Unknown values fail closed
ProvenanceTier::fromStorage() treats absence and unrecognition as
different facts:
null— no declaration was ever recorded. Reads as the default.- an unrecognised string — a tier written by a newer version during a mixed
deployment or after a rollback. Fails closed to
UntrustedExternal.
A broken connector labels untrusted, not trusted
If a connector’sprovenanceTier() throws, the host logs it and labels the
document UntrustedExternal. Propagating would fail a document’s ingestion
over a label nothing yet enforces; swallowing it and returning null would
silently promote the content. A wrong “untrusted” is recoverable and visible in
the read-out. A wrong “trusted” is noticed by nobody.
Provenance is not the curation tier
This is the distinction most likely to be collapsed by mistake, so it is worth being blunt about.
A page a human reviewed and accepted, summarising an external email, is fully
curated and externally authored at the same time. Both facts matter, and
each is useless as a substitute for the other.
What comes next
They are separate releases on purpose. Provenance labelling is days; ACL
mirroring plus principal resolution plus reconciliation plus a triage screen is
a cycle. Coupling them would hold the cheap half behind the expensive one.