Skip to main content

Constraints

Every hard limit discovered during the build, with the observation that produced it.

None of these are stated in product documentation. Each one cost time to find.

Agent icon​

ConstraintValueEvidence
FormatPNG onlyUpload dialog rejects other formats
Maximum size100 KB512 px render at 195.8 KB rejected
Working size256 px53.8 KB, accepted

The rejection message does not state the limit or the file's size. It says the upload failed. The 100 KB figure was established by bisecting render sizes, not by reading it anywhere.

Practical consequence: render at 256 px. A 512 px PNG of any reasonable complexity exceeds 100 KB.

The Build-tab icon has no admin gate. This is worth stating because the Teams app-package icon does — see Phase 6.

Save gating​

ActionAvailable before first save
PublishNo
ShareNo
EvaluateNo

The agent ID is minted at first save. Until agent-command-bar.save-button has been pressed once, there is no agent to publish, share, or evaluate, and the controls are inert.

This is the single most disorienting thing about the Build tab on first use: the toolbar is fully rendered and looks operable.

Identity fields​

Identity fields become read-only after first save. Name and schema name cannot be changed afterward through the UI.

Default_Raybot_vyN1Rz is therefore permanent for this agent. The vyN1Rz suffix is generated, not chosen.

Decide naming before the first save, not after.

Connected agents​

Only published agents can be connected. The picker's empty state says so, but only after you open it.

A draft agent is invisible to the connected-agents picker regardless of how complete it is. Publish first, then connect.

ConstraintValue
Minimum tierBasic
API version exposing /knowledgeBases2025-11-01-preview
Web knowledge sources requireoutputMode: answerSynthesis
Answer synthesis requiresAn Azure OpenAI model in models[]

The tier floor is the expensive one. Free-tier search services can be created, and knowledge bases can be created on them through the REST API without error. They simply never appear in the Copilot Studio picker.

raybot-foundryiq-search was built on Free in Australia East and was entirely wasted. There is no error, no warning, and no empty-state text explaining the absence. The only signal is that the dropdown stays empty.

The api-version constraint is equally silent. Earlier api-versions return 404 on /knowledgeBases, which reads as "wrong path" rather than "wrong version".

az search service create --name darbotlm --resource-group rg-DarbotLM \
--sku basic --location centralus

Skill fields​

FieldTypeLimit
skill-name-inputINPUT64 characters
skill-description-inputTEXTAREA1,024 characters
skill-instructions-inputTEXTAREAMarkdown, no observed limit

The instructions field accepts markdown and is the only one of the three without an enforced ceiling observed during the build.

Evaluation​

ConstraintValue
CSV schemaconversationNumber,question,response
CSV maximum size5 MB
Q-A pairs per conversation6
Reference field maximum1,000 characters
Quick conversation setAuto-generates 10

The 6-pair ceiling is per conversation, not per test set. raybot-evalset.csv carries 6 pairs in one conversation, which is the maximum a single conversation holds.

Test method is General quality. Agent version is Current draft or Published.

Moderation and authentication​

SettingRangeUsed
ModerationMinimum to MaximumMedium
AuthenticationSeveralAuthenticate with Microsoft

Do not enable "Require secured access" while using Demo or Preview. It breaks both. The setting is correct for production and wrong for every iteration loop before it.

Publishing​

Coral publishes inline, with no confirmation dialog. POST publishv2-operations followed by a long poll.

The absence of a dialog means there is no confirmation step and no obvious completion signal beyond the toolbar state changing. Watch the network, not the UI, if you need to know when it finished.

Teams​

ConstraintEvidence
Tenant App Customization Policy consent requiredisConsentProvidedToChangeACPToAny=false on the Edit-details PUT
Channel status endpoint failsGET /api/botmanagement/v1/channels/msteams/app/status returns HTTP 500

The UI reports "Channel enabled". The agent does not appear in Teams. Both statements are true simultaneously, and nothing in the UI reconciles them.

This is a tenant-admin blocker with zero actionable UI signal. See Phase 6 and troubleshooting.

Automation​

ConstraintConsequence
Element refs go stale on every snapshotRe-query by role and name each time
Test ids are not unique76 of 177 span multiple surfaces
Playwright type and fill jumble adjacent React fieldsUse a native value setter via browser_evaluate for multi-field forms
Playwright blocks file://Validation used @darbotlabs/darbot-browser-mcp@1.3.0 instead

The React field-jumbling behaviour is the least obvious of these. Filling two adjacent controlled inputs in sequence produces interleaved text, because React's synthetic event handling does not see the intermediate states the way it expects. The workaround is to set the value through the native setter and dispatch an input event.

Constraints that do not exist​

Worth stating, because their absence was also tested:

  • No rate limit was hit during any capture session
  • No limit was found on the number of knowledge sources
  • No limit was found on the number of tools attached
  • The Build-tab icon has no admin gate, unlike the Teams app-package icon