Copilot, SharePoint and 400,000 construction documents: four checks before you trust an AI answer

Document AI version and approval check: Little Red Riding Hood looks closely at who is really in the bed

A question with two right-looking answers

A site engineer asks the company assistant which tolerance applies to a concrete element. The procedure exists in SharePoint in two states. There is the approved version that everyone works from, and there is a newer revision that a colleague is still editing. The newer one has a different value. Both are in the same library and both contain the word tolerance. A language model will write a clean, well-structured answer from either of them, and the engineer has no way to tell which one it used.

This is the real risk in a company with a lot of documents. An answer that sounds fluent gets trusted. The questions that matter are where the sentence came from, in which state that document was, and whether this person should have seen it. SharePoint already records all of this. A document assistant is only as trustworthy as its willingness to read those records and show them to the reader.

Check one: which version

SharePoint libraries can keep major and minor versions. Microsoft describes a major version as a milestone, such as a file submitted for review or publication, and a minor version as a work in progress that is not ready for all site participants to read.[1] Major versions are whole numbers such as 5.0. Minor versions are decimals such as 5.1. When a minor version is published as major, it becomes the next whole number and later drafts continue from there.[1]

This matters for AI because the newest file is not always the valid one. Version 5.1 is newer than 5.0, but in a library that uses drafts it may be exactly the unfinished revision from the example above. An assistant that simply indexes the current file content, without knowing which version it is reading, cannot tell a published procedure from a work in progress.

Microsoft Graph exposes this directly. The list versions API returns the versions of a file, newest to oldest, each with an ID, modification time and the identity of who modified it.[2] The version resource also has a publication facet, and its versionId property is defined as the identifier of the version that is visible to the current caller.[3] In other words, two people looking at the same file can be shown different versions. A citation should therefore name the version that was actually used, not just the file name.

Earlier versions are a separate question. Microsoft notes that previous versions may be kept only for a limited time, depending on admin settings.[2] Searching history can be useful, for example to see what a procedure said when a contract was signed, but it should be a deliberate choice made by the person asking, not something that happens silently.

Check two: was it approved

Content approval is a separate library setting, turned on in versioning settings with the option to require content approval for submitted items.[4] When it is enabled, a submitted item is in Pending status until someone with at least Manage Lists permission approves it. Microsoft states that pending items are usually visible only to the originator and to people who can manage the list or library. After approval, the item becomes visible to anyone who can view the library.[5] Rejected items stay in the library until someone deletes them.[5]

Two details in Microsoft’s documentation are worth knowing before you rely on this status. First, if you turn on content approval in a library that already has items, all existing items are marked Approved.[5] Approved therefore means the status field says Approved, not necessarily that someone reviewed the file. Second, if library security is set so that any user can read items, anyone with Read permission can see all items, whatever their approval status.[5] Visibility of drafts depends on configuration. The draft item security setting decides who can see drafts.

For an assistant, this means approval status cannot be assumed from the fact that a person can open a file. It has to be read and shown next to the answer, so the reader can see at a glance whether the source was Approved, Pending or Rejected.

Check three: where in the document

A link to a 200-page document is not a citation. It forces the reader to search again and, in practice, most people will not. A useful citation points to the place the answer came from: the page in a PDF, the sheet and rows in a spreadsheet, the slide number in a presentation. This is the check that makes verification take seconds instead of minutes. If the reader cannot quickly compare the answer with the source text, the other three checks lose most of their value, because nobody will actually look.

Check four: was this person allowed to see it

SharePoint permissions are inherited from parent to child. Sites, libraries, folders and items get their permissions from above unless inheritance is broken.[6] Microsoft’s guidance recommends not breaking inheritance, but it also describes common cases where it is broken, for example when a user shares a single folder and SharePoint creates unique permissions on it automatically.[6] In a large tenant, the real permission picture is the result of years of such decisions, and it is different for every person.

The safe pattern is for the assistant not to hold its own view of who may see what, but to ask Microsoft 365 on the user’s behalf. The Microsoft identity platform calls this the on-behalf-of flow: a service passes the user’s identity and permissions through the request chain using delegated scopes.[7] The Microsoft Search API in Graph works the same way. Search requests run in the context of the signed-in user, results are trimmed to items that user can access, and Microsoft states that users cannot get more items through search than through a corresponding GET request with the same permissions.[8]

The opposite pattern is an index built with an application identity that can read everything, followed by filtering in the assistant’s own code. That puts the whole permission model into a second system that must stay in sync with SharePoint. One related detail: the Graph download URL for a file version does not require authentication, and Microsoft notes that removing a user’s permission might not immediately invalidate it.[9] That is a good reason to keep such links inside the service and not pass them to users.

A short checklist for evaluating any document assistant

  • Does every answer show the source document with a working link that opens in SharePoint?
  • Does it show which version was used, and can it tell a major version from a draft?
  • Where content approval is enabled, does it show whether the source was Approved, Pending or Rejected?
  • Does the citation point to a page, a sheet and rows, or a slide, and not just to a file?
  • Are permissions checked as the signed-in user with delegated access, or does the tool read everything with its own identity and filter later?
  • Is searching earlier versions an explicit option, not the default?
  • Where are prompts and responses processed? In Azure OpenAI, Data Zone deployments in the EU process data within the EU Data Boundary, which Microsoft says can also include EFTA countries.[10] Regional Standard deployments process data within the chosen Azure geography.[10] Ask which one is used.
  • Ask for a test on your own documents: a question where a draft and an approved version disagree, and a question from a document the tester cannot open.

How KSJ approaches this

At KSJ we built Answergrove around these four checks. It started in daily use at a construction company, where it answers from 865 SharePoint sites and roughly 400,000 documents in four languages. The current version shows, for each answer, the source document with a link, the version, the page (exact for PDF), the sheet and rows for Excel, the slide number for PowerPoint, and the SharePoint approval status where content approval is enabled. It acts on behalf of the signed-in user, so each person gets answers only from documents they can already open. Earlier versions can be searched as an option. It runs alongside Microsoft 365 Copilot without interfering with it and does not need a per-user licence. A pilot covers one SharePoint site for two weeks at a fixed price of 1,500 EUR and runs in KSJ’s Azure in Sweden Central, so the data stays in the EU.

References

  1. ^ a b “How versioning works in lists and libraries“. Microsoft Support. Retrieved 19 October 2026.
  2. ^ a b “List versions – Microsoft Graph v1.0“. Microsoft Learn. Retrieved 19 October 2026.
  3. ^ “PublicationFacet resource type – Microsoft Graph v1.0“. Microsoft Learn. Retrieved 19 October 2026.
  4. ^ “Enable and configure versioning for a list or library“. Microsoft Support. Retrieved 19 October 2026.
  5. ^ a b c d “Require approval of items in a list or library“. Microsoft Support. Retrieved 19 October 2026.
  6. ^ a b “What is permissions inheritance? – SharePoint in Microsoft 365“. Microsoft Learn. Retrieved 19 October 2026.
  7. ^ “Microsoft identity platform and OAuth2.0 On-Behalf-Of flow – Microsoft identity platform“. Microsoft Learn. Retrieved 19 October 2026.
  8. ^ “Use the Microsoft Search API to query data – Microsoft Graph v1.0“. Microsoft Learn. Retrieved 19 October 2026.
  9. ^ “driveItemVersion resource type – Microsoft Graph v1.0“. Microsoft Learn. Retrieved 19 October 2026.
  10. ^ a b “Understanding deployment types in Microsoft Foundry Models – Microsoft Foundry“. Microsoft Learn. Retrieved 19 October 2026.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top