The docent in Microsoft 365 Copilot
playbooks/docent-in-m365-copilotChecked by automation only
still a draft
- 2026-10-03,
ktl-librarian(automation): Microsoft's page on custom skills (updated 2026-09-04) says the Agents Toolkit takes a skill directory and that.zipisn't supported.skills/ktl-sidecar/references/m365.mdsaysatk add skill --fromtakes a zip from any path, as checked against the toolkit's source, and this concept follows it. Which holds for the toolkit a reader installs? - 2026-10-19,
ktl-librarian(automation): the limits list already gives Agent Builder's 50 MB zip beside the toolkit's 10 MB app package, asskills/ktl-sidecar/references/m365.mdline 18 does. Whetheratk add skill --fromtakes a zip stays open:skills/ktl-sidecar/references/m365.mdsays it does, from the toolkit's source up to the 1.1.18 betas, Microsoft's page says it takes a directory only, and no file in the repository records the test that would settle it.
Written 2026-10-26 by ktl-librarian (automation). Last checked 2026-10-29 by ktl-librarian (automation).
The full record
- Checks
- 2026-10-29 by
ktl-librarian(automation)
- 2026-10-29 by
- Sources
- Is part of
- References
- Related to
- Pointed to by
- Hosts and doorways: where the bundle's real folder lives (related to)
- ktl-sidecar skill (has part)
- Releasing (references)
- When the built-in vocabulary stops fitting: domain schemas (related to)
- Why the skills live in their own repository (references)
- Graph
- Open this concept in the knowledge graph
- IRI
https://w3id.org/ktl/knowledge/playbooks/docent-in-m365-copilot- Licence
- CC BY 4.0
- Files
- MarkdownJSON-LDSource on GitHubHistory on GitHub
Overview
Section titled “Overview”ktl-docent-m365 is the docent as a custom skill for a Microsoft 365 Copilot declarative agent. It is not a skill of its own: it puts ktl-docent into Copilot. Copilot runs a skill with no repository, shell or network, so the skill carries a snapshot of the bundle and answers from it. Every answer names the snapshot (repository, revision, build date) and the trust label of each concept it used, in the same words ktl-docent uses. It cannot check a value at its source or write .lokf/feedback.md. So it says so, and hands the reader a ready-to-paste Miss or Disagreement line to file in the repository instead.
Getting it running takes three steps, in this order: get the zip, add it to an agent, then ask it something and check that the answer names the snapshot. The short route installs nothing.
1. Get the zip
Section titled “1. Get the zip”From a release. The release workflow attaches ktl-docent-m365-<tag>-<repository>.zip beside the bundle zip on every release whose bundle changed. <repository> is the repository’s name, or the name its KNOWLEDGE_RELEASE_NAME variable sets. A release with no such asset means one of two things:
- the bundle did not change since the last release that carries one, and the reader takes the zip from that earlier release;
- the repository’s sidecar has no
.lokf/m365/, and its releases carry the bundle zip alone.
Or build it. A repository on another forge, or on none, runs the builder the release workflow runs, on its bundle folder. It needs bash and zip:
.lokf/m365/knowledge-m365.sh --repo-url https://github.com/me/my-repo --ref v1.2.0 .lokf/knowledge ./distIt writes dist/ktl-docent-m365/ (with SKILL.md, SNAPSHOT.md and knowledge/) and dist/ktl-docent-m365.zip. In a git clone only tracked files are copied, and hidden files such as .obsidian/ are left out. With SOURCE_DATE_EPOCH set, one input gives one zip. The build writes nothing and exits 1 if a skill breaks one of Copilot’s limits:
SKILL.mdover 20,000 characters;- folders more than 3 deep;
- file types Copilot does not accept;
- more than 350 files;
- more than 10 MB, the toolkit’s limit on the whole app package;
- symbolic links.
Agent Builder’s own limit is a 50 MB zip, which skills/ktl-sidecar/references/m365.md gives from Microsoft’s page on custom skills, preview as of 2026-09.
2. Add it to an agent
Section titled “2. Add it to an agent”Custom skills are in preview, only for tenants in Microsoft’s Frontier program and not with Information Barriers, so the page has the reader check that first. Without the preview, both routes fail with errors that do not say why. Two routes take the same zip, and the page recommends Agent Builder unless the reader already develops agents with the toolkit.
With Agent Builder, nothing is installed: create or open an agent in Microsoft 365 Copilot and add the zip as a skill. If Agent Builder says skill attachments require the full Copilot Studio experience, the reader copies the agent to Copilot Studio and adds the zip there. That needs a Copilot Studio licence or trial.
With the Agents Toolkit CLI (atk, for developers, on Node.js):
- Log in, scaffold or reuse a declarative agent, and change into its folder.
- Export
TEAMSFX_AGENT_SKILLS=trueandATK_FRONTIER=true. Skills are hidden without the variable its version reads:TEAMSFX_AGENT_SKILLSin the 1.1.17 release,ATK_FRONTIERfrom the 1.1.18 betas on. - Run
atk add skill --from <zip> -i false, thenatk provision --env devandatk preview --env dev, in the same shell. Without the variable, the toolkit packs the agent without the skill’s files.
The page says to skip atk validate for now, because it rejects the agent_skills entry the toolkit itself wrote. Whichever route the reader takes, an agent cannot yet have skills and embedded files together.
3. Ask it something
Section titled “3. Ask it something”Ask the agent a question the bundle answers, such as what a service does or who owns it. The answer names the snapshot, its version and build date, and each concept it rests on with a trust label. An answer with no snapshot in it did not come from the skill.
When the docent cannot answer, or two concepts disagree, it ends with one line to paste into the repository’s .lokf/feedback.md, and SNAPSHOT.md says where to send it. The docent never records the gap itself. A Miss line starts with the reader’s question in quotes. It says whether a concept looked relevant from index.md and did not answer, or nothing relevant was listed. A Disagreement line says which version the answer gave, or that it gave both. Filed in the repository, the line reaches ktl-librarian, which turns it into a concept or a question for the curator.
Keep it current
Section titled “Keep it current”The snapshot does not update itself. After each release that changes the bundle, take the new zip and add it again. The workflow packs the skill only when the bundle changed, so a release with new instructions and the same bundle carries no new zip. For that tag, run the workflow by hand with force.
If something goes wrong
Section titled “If something goes wrong”- The release has no
ktl-docent-m365-…asset. The bundle did not change since the last release that carries one, or the repository’s sidecar has no.lokf/m365/. - The build exits 1. The skill breaks one of Copilot’s limits, the output names which, and nothing is written.
- The build says
zip not found. The folder is built but not zipped: installzip, or zip the folder by hand before adding it. atk add skillis not a command (UnknownCommandError). Export bothTEAMSFX_AGENT_SKILLS=trueandATK_FRONTIER=true.atk add skillsaysInvalidProjectError. It ran outside the agent’s project: change into the folderatk newcreated, or pass--folder.atk validatesaysproperty name must be validforagent_skills. The newest published manifest schema, v1.8, has no such property yet, and the toolkit’s ownadd skillwrote the entry, so the zip is not at fault. Skip it, and letprovisiondecide.atk provisionfails atteamsApp/validateAppPackagewithUnrecognized member 'agent_skills'. Microsoft’s service refused the entry: check that the tenant has custom skills.teamsApp/createhas already registered an app by then, which the reader deletes in the Teams Developer Portal if they give up.- Agent Builder says skill attachments require the full Copilot Studio experience. Copy the agent to Copilot Studio and add the zip there. If Copilot Studio says sign-up is disabled, only an admin can grant the licence.
- Agent Builder or the toolkit refuses the skill for another reason. The agent may already have embedded files. That is a preview limit, not a fault in the zip.
Which roles go to Copilot
Section titled “Which roles go to Copilot”.lokf/m365/ holds one instructions file per read-only role, named after the skill it becomes: ktl-docent-m365.md, not SKILL.md, so no installer lists it. The builder packs each file into its own zip. An auditor, the third line, would be ktl-auditor-m365.md beside it, with no change to the builder, workflow or checks. The sidecar and librarian need a repository and a shell, so they have no Copilot form. The curator has none yet. It needs a write action the agent can call and an identity that is not a forge login. The curator’s references/domain-schemas.md holds the shape of that identity record (see domain-schemas).
A host’s copy under .lokf/m365/ is what its releases pack, so a host that edits it changes what its readers’ Copilot follows. Its trust labels must match ktl-docent’s, and the repository checks enforce that.
Open questions
Section titled “Open questions”- 2026-10-03, process:ktl-librarian: Microsoft’s page on custom skills (updated 2026-09-04) says the Agents Toolkit takes a skill directory and that
.zipisn’t supported.skills/ktl-sidecar/references/m365.mdsaysatk add skill --fromtakes a zip from any path, as checked against the toolkit’s source, and this concept follows it. Which holds for the toolkit a reader installs? - 2026-10-19, process:ktl-librarian: the limits list already gives Agent Builder’s 50 MB zip beside the toolkit’s 10 MB app package, as
skills/ktl-sidecar/references/m365.mdline 18 does. Whetheratk add skill --fromtakes a zip stays open:skills/ktl-sidecar/references/m365.mdsays it does, from the toolkit’s source up to the 1.1.18 betas, Microsoft’s page says it takes a directory only, and no file in the repository records the test that would settle it.