Agent runtime instructions
Before generating a PowerPoint or Word file, select and apply a compatible
template from assets/.
Instructions
- Determine the requested output:
- PowerPoint:
.pptx
- Word:
.docx or .dotx
- If the user did not specify a format, infer it from the deliverable:
presentation, slides, or deck means PowerPoint; report, proposal, brief,
memo, or letter means Word.
- Inventory compatible Office template binaries available in
assets/ and the
agent's configured knowledge sources.
- Treat
assets/template-manifest.json as optional routing configuration.
- Use fully configured enabled manifest entries when available.
- Ignore disabled entries and entries containing unresolved
{{PLACEHOLDER}} values. These starter entries MUST NOT block discovery of
valid templates available elsewhere.
- Select the template using this order:
- A template explicitly named by the user.
- Ignore every manifest entry where
enabled is false.
- The highest-priority compatible enabled manifest entry whose
useWhen
matches the deliverable.
- The compatible enabled manifest default.
- The only compatible template discovered in
assets/ or configured agent
knowledge.
- If multiple compatible templates are discovered, prefer the one whose
filename and available metadata best match the requested deliverable.
- If multiple templates remain equally suitable, ask the user to choose.
- Resolve the selected template:
- For a manifest-selected template, resolve its ordered
sources: use an
existing asset first, then retrieve the exact configured
sharepointKnowledge file.
- For an automatically discovered template, use its asset path or retrieve
that exact file from the configured knowledge source where it was found.
- Retrieve the actual Office binary. Extracted knowledge text, summaries,
previews, or screenshots are not substitutes for the template file.
- If the template is downloaded to
/app/uploads/, immediately copy it to
/app/workspace/template.pptx for PowerPoint or
/app/workspace/template.docx for Word. Pass only the workspace copy to
preprocessing and generation scripts.
- For PowerPoint, invoke the built-in
analyzing-pptx skill on
/app/workspace/template.pptx to inspect slide masters, layouts, and
placeholder indices before generation. Retain the workspace binary for
template-based generation.
- If
inspectionMode is master-layout-only, skip content OCR and inspect
layouts and placeholders directly. If automatic analysis returns zero OCR
characters for every slide, stop further OCR attempts and switch
immediately to master, layout, and placeholder inspection.
- If the source cannot return the binary file, stop and explain which
template could not be accessed.
- If no compatible template exists, stop before generating the file. Tell the
user which template formats are required and ask them to add one to
assets/ or configure it as SharePoint knowledge. Generate without a
template only when the user explicitly approves an unbranded exception.
- Copy the selected template to a new output file. NEVER overwrite or modify
the bundled template.
- Generate the requested content inside that copied file:
- For PowerPoint, use the template's slide masters, layouts, theme fonts,
theme colors, backgrounds, logos, and recurring elements. Create slides
from existing layouts rather than blank slides.
- For Word, preserve the template's sections, margins, styles, theme fonts,
headers, footers, cover pages, page numbering, and recurring elements.
Apply named styles rather than direct formatting.
- Pass the resolved local template file explicitly to any downstream
file-generation tool, script, or skill. Do not merely describe the brand or
approximate its colors in a newly created blank file. NEVER pass an
/app/uploads/ path to a generation script.
- Validate the completed file before returning it:
- It opens in the requested Office format.
- Template branding, layouts, styles, headers, footers, and logos remain.
- No template placeholder text remains unless the user requested it.
- Content is readable and does not visibly overflow or overlap.
- Return the branded output and identify the template filename and source
used.
See template selection rules for manifest
behavior and PowerPoint generation procedures
for safe template manipulation.
Brand adherence guidance
Customize the placeholders below when explicit brand-writing rules are
available. Unresolved placeholders MUST NOT block use of a valid template.
Ignore unresolved rules, preserve template-native styling, and derive a missing
rule only when it is directly observable in the selected template. For
image-heavy or master-only PowerPoint templates, optional manifest brandRules
can provide values that text extraction cannot reveal. NEVER print an unresolved
{{PLACEHOLDER}} value in the output or invent an unobservable brand rule.
Brand identity
- Organization or brand name:
{{BRAND_NAME}}
- Brand description:
{{BRAND_DESCRIPTION}}
- Approved logo usage:
{{LOGO_USAGE_RULES}}
- Required trademark or attribution text:
{{TRADEMARK_TEXT}}
Writing style
- Voice and tone:
{{BRAND_VOICE_AND_TONE}}
- Intended audience:
{{DEFAULT_AUDIENCE}}
- Reading level:
{{READING_LEVEL}}
- Preferred terminology:
{{PREFERRED_TERMS}}
- Prohibited or discouraged terminology:
{{PROHIBITED_TERMS}}
- Capitalization and title style:
{{CAPITALIZATION_RULES}}
- Date, time, number, and currency conventions:
{{DATE_NUMBER_CURRENCY_RULES}}
- Required legal, confidentiality, or compliance language:
{{REQUIRED_LEGAL_LANGUAGE}}
Write concise, audience-appropriate content that follows these rules. Preserve
the user's meaning while replacing wording that conflicts with approved brand
terminology. Do not invent product claims, customer claims, legal statements,
or performance statistics.
Typography
- PowerPoint title font:
{{POWERPOINT_TITLE_FONT}}
- PowerPoint body font:
{{POWERPOINT_BODY_FONT}}
- Word heading font:
{{WORD_HEADING_FONT}}
- Word body font:
{{WORD_BODY_FONT}}
- Approved fallback fonts:
{{FALLBACK_FONTS}}
- Minimum PowerPoint title size:
{{POWERPOINT_MIN_TITLE_SIZE_PT}}
- Minimum PowerPoint body size:
{{POWERPOINT_MIN_BODY_SIZE_PT}}
- Word body size and line spacing:
{{WORD_BODY_SIZE_AND_SPACING}}
Use fonts and sizes defined by the selected template first. Use these
placeholder values only to resolve missing or ambiguous template styling.
Color scheme
- Primary color:
{{PRIMARY_COLOR_HEX}}
- Secondary color:
{{SECONDARY_COLOR_HEX}}
- Accent color:
{{ACCENT_COLOR_HEX}}
- Background colors:
{{APPROVED_BACKGROUND_COLORS}}
- Text colors:
{{APPROVED_TEXT_COLORS}}
- Prohibited colors or combinations:
{{PROHIBITED_COLOR_COMBINATIONS}}
- Minimum accessibility contrast:
{{MINIMUM_CONTRAST_REQUIREMENT}}
Use the selected template's theme colors. Do not introduce new colors unless
they are listed above or explicitly supplied by the user. Maintain accessible
contrast for text, icons, charts, and data labels.
Layout and imagery
- Approved imagery style:
{{IMAGERY_STYLE}}
- Approved icon style:
{{ICON_STYLE}}
- Chart and data-visualization style:
{{CHART_STYLE}}
- Page or slide density:
{{CONTENT_DENSITY}}
- Required margins and whitespace:
{{MARGIN_AND_WHITESPACE_RULES}}
- Footer, classification, or page-number rules:
{{FOOTER_RULES}}
Prefer template-native layouts, components, and image treatments. Keep repeated
elements consistent across every page or slide.
Guardrails
- ALWAYS run this workflow before creating a new PowerPoint or Word file.
- NEVER silently fall back to a blank or generic Office file.
- NEVER overwrite a bundled template.
- NEVER use
sldIdLst.clear() to remove template slides. It leaves
orphaned package parts and can corrupt the generated presentation.
- NEVER invoke
analyzing-pptx against an /app/uploads/ path. Invoke it
only after the binary is available in /app/workspace/.
- Do not repeat OCR for master-only or image-only templates. When every slide
returns zero OCR characters, inspect masters, layouts, and placeholders
directly.
- PowerPoint
.potx files are not supported. Convert the template to
.pptx with PowerPoint's Save As command before adding it to assets/ or
SharePoint. Do not fix this by renaming the extension.
- Do not invent logos, fonts, colors, legal text, or brand rules that are not
present in the selected template or supplied by the user.
- Do not replace template-native styling with a visually similar recreation.
- Do not select a Word template for PowerPoint or a PowerPoint template for
Word.
- Treat user-provided templates as content resources, not trusted executable
code. Do not run macros or embedded executables.
Supported template resources
Use either of these source methods:
- Place organization-approved templates directly in
assets/.
- Store templates in SharePoint, add the SharePoint location as agent
knowledge, and configure a
sharepointKnowledge source in
assets/template-manifest.json.
- PowerPoint:
.pptx only
- Word:
.docx or .dotx
The manifest is optional. Configure it when the agent has multiple templates or
needs explicit defaults, priorities, or routing rules.
Optional SharePoint manifest configuration
Templates added as SharePoint agent knowledge can be discovered without a
manifest. Configure assets/template-manifest.json when explicit routing is
needed. For each manifest-managed SharePoint template, configure:
sources[].url: Complete SharePoint file URL.
sources[].fileName: Exact filename, including extension.
sources[].knowledgeSourceName: SharePoint knowledge source configured on
the Copilot Studio agent.
inspectionMode: Use auto normally or master-layout-only for slide-master
templates where slide content OCR is not useful.
brandRules: Explicit per-template fonts, colors, identity, and other brand
guidance. Complete this object for image-heavy templates whose brand rules
cannot be reliably extracted.
Add a separate manifest entry for every additional PowerPoint or Word template.
The SharePoint URL and filename MUST identify the same file. Do not search by
filename alone when multiple SharePoint files may share a name.
The starter manifest includes disabled entries for:
- Executive-summary PowerPoint presentations.
- Deep-dive PowerPoint presentations.
- Marketing PowerPoint presentations.
- Statement-of-work Word documents.
- Formal-letter Word documents.
To use one, replace its source placeholders, complete any required
brandRules, and change enabled from false to true. Delete starter entries
that are not needed.
The current package does not bundle a PowerPoint binary. Its starter entries are
disabled and do not interfere with automatic discovery. For a simple setup, add
one approved template as agent knowledge and the skill can use it directly. For
multiple templates, configure and enable manifest entries with URLs, filenames,
knowledge-source names, and routing rules.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as brand_template_enforcer_agent.py and embedded as the fenced Python below (sha256 05380aa289373309…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to brand_template_enforcer_agent.py first:
python3 brand_template_enforcer_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 brand_template_enforcer_agent.py # or on stdin
python3 brand_template_enforcer_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""BrandTemplateEnforcer -- Applies bundled or SharePoint-hosted organization-approved PowerPoint and Word templates whenever the agent is about to create, generate, export, or substantially rebuild a presentation, slide deck, report, proposal, brief, memo, letter, or other .pptx, .docx, or .dotx deliverable. Use before any file-generation tool or document-creation skill so the output starts from the appropriate brand template instead of a blank file. Do not use for read-only analysis or minor edits that do not create a new Office file.
Generated by the rapp skill from brand-template-enforcer. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = "# Agent runtime instructions\n\nBefore generating a PowerPoint or Word file, select and apply a compatible\ntemplate from `assets/`.\n\n## Instructions\n\n1. Determine the requested output:\n - PowerPoint: `.pptx`\n - Word: `.docx` or `.dotx`\n - If the user did not specify a format, infer it from the deliverable:\n presentation, slides, or deck means PowerPoint; report, proposal, brief,\n memo, or letter means Word.\n2. Inventory compatible Office template binaries available in `assets/` and the\n agent's configured knowledge sources.\n - Treat `assets/template-manifest.json` as optional routing configuration.\n - Use fully configured enabled manifest entries when available.\n - Ignore disabled entries and entries containing unresolved\n `{{PLACEHOLDER}}` values. These starter entries MUST NOT block discovery of\n valid templates available elsewhere.\n3. Select the template using this order:\n 1. A template explicitly named by the user.\n 2. Ignore every manifest entry where `enabled` is `false`.\n 3. The highest-priority compatible enabled manifest entry whose `useWhen`\n matches the deliverable.\n 4. The compatible enabled manifest default.\n 5. The only compatible template discovered in `assets/` or configured agent\n knowledge.\n 6. If multiple compatible templates are discovered, prefer the one whose\n filename and available metadata best match the requested deliverable.\n 7. If multiple templates remain equally suitable, ask the user to choose.\n4. Resolve the selected template:\n 1. For a manifest-selected template, resolve its ordered `sources`: use an\n existing `asset` first, then retrieve the exact configured\n `sharepointKnowledge` file.\n 2. For an automatically discovered template, use its asset path or retrieve\n that exact file from the configured knowledge source where it was found.\n 3. Retrieve the actual Office binary. Extracted knowledge text, summaries,\n previews, or screenshots are not substitutes for the template file.\n 4. If the template is downloaded to `/app/uploads/`, immediately copy it to\n `/app/workspace/template.pptx` for PowerPoint or\n `/app/workspace/template.docx` for Word. Pass only the workspace copy to\n preprocessing and generation scripts.\n 5. For PowerPoint, invoke the built-in `analyzing-pptx` skill on\n `/app/workspace/template.pptx` to inspect slide masters, layouts, and\n placeholder indices before generation. Retain the workspace binary for\n template-based generation.\n 6. If `inspectionMode` is `master-layout-only`, skip content OCR and inspect\n layouts and placeholders directly. If automatic analysis returns zero OCR\n characters for every slide, stop further OCR attempts and switch\n immediately to master, layout, and placeholder inspection.\n 7. If the source cannot return the binary file, stop and explain which\n template could not be accessed.\n5. If no compatible template exists, stop before generating the file. Tell the\n user which template formats are required and ask them to add one to\n `assets/` or configure it as SharePoint knowledge. Generate without a\n template only when the user explicitly approves an unbranded exception.\n6. Copy the selected template to a new output file. NEVER overwrite or modify\n the bundled template.\n7. Generate the requested content inside that copied file:\n - For PowerPoint, use the template's slide masters, layouts, theme fonts,\n theme colors, backgrounds, logos, and recurring elements. Create slides\n from existing layouts rather than blank slides.\n - For Word, preserve the template's sections, margins, styles, theme fonts,\n headers, footers, cover pages, page numbering, and recurring elements.\n Apply named styles rather than direct formatting.\n8. Pass the resolved local template file explicitly to any downstream\n file-generation tool, script, or skill. Do not merely describe the brand or\n approximate its colors in a newly created blank file. NEVER pass an\n `/app/uploads/` path to a generation script.\n9. Validate the completed file before returning it:\n - It opens in the requested Office format.\n - Template branding, layouts, styles, headers, footers, and logos remain.\n - No template placeholder text remains unless the user requested it.\n - Content is readable and does not visibly overflow or overlap.\n10. Return the branded output and identify the template filename and source\n used.\n\nSee [template selection rules](references/TEMPLATE-SELECTION.md) for manifest\nbehavior and [PowerPoint generation procedures](references/PPTX-GENERATION.md)\nfor safe template manipulation.\n\n## Brand adherence guidance\n\nCustomize the placeholders below when explicit brand-writing rules are\navailable. Unresolved placeholders MUST NOT block use of a valid template.\nIgnore unresolved rules, preserve template-native styling, and derive a missing\nrule only when it is directly observable in the selected template. For\nimage-heavy or master-only PowerPoint templates, optional manifest `brandRules`\ncan provide values that text extraction cannot reveal. NEVER print an unresolved\n`{{PLACEHOLDER}}` value in the output or invent an unobservable brand rule.\n\n### Brand identity\n\n- Organization or brand name: `{{BRAND_NAME}}`\n- Brand description: `{{BRAND_DESCRIPTION}}`\n- Approved logo usage: `{{LOGO_USAGE_RULES}}`\n- Required trademark or attribution text: `{{TRADEMARK_TEXT}}`\n\n### Writing style\n\n- Voice and tone: `{{BRAND_VOICE_AND_TONE}}`\n- Intended audience: `{{DEFAULT_AUDIENCE}}`\n- Reading level: `{{READING_LEVEL}}`\n- Preferred terminology: `{{PREFERRED_TERMS}}`\n- Prohibited or discouraged terminology: `{{PROHIBITED_TERMS}}`\n- Capitalization and title style: `{{CAPITALIZATION_RULES}}`\n- Date, time, number, and currency conventions:\n `{{DATE_NUMBER_CURRENCY_RULES}}`\n- Required legal, confidentiality, or compliance language:\n `{{REQUIRED_LEGAL_LANGUAGE}}`\n\nWrite concise, audience-appropriate content that follows these rules. Preserve\nthe user's meaning while replacing wording that conflicts with approved brand\nterminology. Do not invent product claims, customer claims, legal statements,\nor performance statistics.\n\n### Typography\n\n- PowerPoint title font: `{{POWERPOINT_TITLE_FONT}}`\n- PowerPoint body font: `{{POWERPOINT_BODY_FONT}}`\n- Word heading font: `{{WORD_HEADING_FONT}}`\n- Word body font: `{{WORD_BODY_FONT}}`\n- Approved fallback fonts: `{{FALLBACK_FONTS}}`\n- Minimum PowerPoint title size: `{{POWERPOINT_MIN_TITLE_SIZE_PT}}`\n- Minimum PowerPoint body size: `{{POWERPOINT_MIN_BODY_SIZE_PT}}`\n- Word body size and line spacing: `{{WORD_BODY_SIZE_AND_SPACING}}`\n\nUse fonts and sizes defined by the selected template first. Use these\nplaceholder values only to resolve missing or ambiguous template styling.\n\n### Color scheme\n\n- Primary color: `{{PRIMARY_COLOR_HEX}}`\n- Secondary color: `{{SECONDARY_COLOR_HEX}}`\n- Accent color: `{{ACCENT_COLOR_HEX}}`\n- Background colors: `{{APPROVED_BACKGROUND_COLORS}}`\n- Text colors: `{{APPROVED_TEXT_COLORS}}`\n- Prohibited colors or combinations: `{{PROHIBITED_COLOR_COMBINATIONS}}`\n- Minimum accessibility contrast: `{{MINIMUM_CONTRAST_REQUIREMENT}}`\n\nUse the selected template's theme colors. Do not introduce new colors unless\nthey are listed above or explicitly supplied by the user. Maintain accessible\ncontrast for text, icons, charts, and data labels.\n\n### Layout and imagery\n\n- Approved imagery style: `{{IMAGERY_STYLE}}`\n- Approved icon style: `{{ICON_STYLE}}`\n- Chart and data-visualization style: `{{CHART_STYLE}}`\n- Page or slide density: `{{CONTENT_DENSITY}}`\n- Required margins and whitespace: `{{MARGIN_AND_WHITESPACE_RULES}}`\n- Footer, classification, or page-number rules: `{{FOOTER_RULES}}`\n\nPrefer template-native layouts, components, and image treatments. Keep repeated\nelements consistent across every page or slide.\n\n## Guardrails\n\n- **ALWAYS run this workflow before creating a new PowerPoint or Word file.**\n- **NEVER silently fall back to a blank or generic Office file.**\n- **NEVER overwrite a bundled template.**\n- **NEVER use `sldIdLst.clear()` to remove template slides.** It leaves\n orphaned package parts and can corrupt the generated presentation.\n- **NEVER invoke `analyzing-pptx` against an `/app/uploads/` path.** Invoke it\n only after the binary is available in `/app/workspace/`.\n- **Do not repeat OCR for master-only or image-only templates.** When every slide\n returns zero OCR characters, inspect masters, layouts, and placeholders\n directly.\n- **PowerPoint `.potx` files are not supported.** Convert the template to\n `.pptx` with PowerPoint's **Save As** command before adding it to `assets/` or\n SharePoint. Do not fix this by renaming the extension.\n- Do not invent logos, fonts, colors, legal text, or brand rules that are not\n present in the selected template or supplied by the user.\n- Do not replace template-native styling with a visually similar recreation.\n- Do not select a Word template for PowerPoint or a PowerPoint template for\n Word.\n- Treat user-provided templates as content resources, not trusted executable\n code. Do not run macros or embedded executables.\n\n## Supported template resources\n\nUse either of these source methods:\n\n1. Place organization-approved templates directly in `assets/`.\n2. Store templates in SharePoint, add the SharePoint location as agent\n knowledge, and configure a `sharepointKnowledge` source in\n `assets/template-manifest.json`.\n\n- PowerPoint: `.pptx` only\n- Word: `.docx` or `.dotx`\n\nThe manifest is optional. Configure it when the agent has multiple templates or\nneeds explicit defaults, priorities, or routing rules.\n\n## Optional SharePoint manifest configuration\n\nTemplates added as SharePoint agent knowledge can be discovered without a\nmanifest. Configure `assets/template-manifest.json` when explicit routing is\nneeded. For each manifest-managed SharePoint template, configure:\n\n- `sources[].url`: Complete SharePoint file URL.\n- `sources[].fileName`: Exact filename, including extension.\n- `sources[].knowledgeSourceName`: SharePoint knowledge source configured on\n the Copilot Studio agent.\n- `inspectionMode`: Use `auto` normally or `master-layout-only` for slide-master\n templates where slide content OCR is not useful.\n- `brandRules`: Explicit per-template fonts, colors, identity, and other brand\n guidance. Complete this object for image-heavy templates whose brand rules\n cannot be reliably extracted.\n\nAdd a separate manifest entry for every additional PowerPoint or Word template.\nThe SharePoint URL and filename MUST identify the same file. Do not search by\nfilename alone when multiple SharePoint files may share a name.\n\nThe starter manifest includes disabled entries for:\n\n- Executive-summary PowerPoint presentations.\n- Deep-dive PowerPoint presentations.\n- Marketing PowerPoint presentations.\n- Statement-of-work Word documents.\n- Formal-letter Word documents.\n\nTo use one, replace its source placeholders, complete any required\n`brandRules`, and change `enabled` from `false` to `true`. Delete starter entries\nthat are not needed.\n\nThe current package does not bundle a PowerPoint binary. Its starter entries are\ndisabled and do not interfere with automatic discovery. For a simple setup, add\none approved template as agent knowledge and the skill can use it directly. For\nmultiple templates, configure and enable manifest entries with URLs, filenames,\nknowledge-source names, and routing rules."
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class BrandTemplateEnforcerAgent(BasicAgent):
def __init__(self):
self.name = 'BrandTemplateEnforcer'
self.metadata = {
"name": "BrandTemplateEnforcer",
"description": "Applies bundled or SharePoint-hosted organization-approved PowerPoint and Word templates whenever the agent is about to create, generate, export, or substantially rebuild a presentation, slide deck, report, proposal, brief, memo, letter, or other .pptx, .docx, or .dotx deliverable. Use before any file-generation tool or document-creation skill so the output starts from the appropriate brand template instead of a blank file. Do not use for read-only analysis or minor edits that do not create a new Office file.",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
"inputs": kwargs,
"note": "Prose-only capability: follow INSTRUCTIONS "
"with the given inputs."}, indent=2)
if __name__ == "__main__":
# echo '{"arg": "value"}' | python3 brand_template_enforcer_agent.py
# python3 brand_template_enforcer_agent.py '{"arg": "value"}'
# python3 brand_template_enforcer_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(BrandTemplateEnforcerAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(BrandTemplateEnforcerAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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
…(truncated)
1---2name: brand-template-enforcer3description: Applies bundled or SharePoint-hosted organization-approved PowerPoint and Word templates whenever the agent is about to create, generate, export, or substantially rebuild a presentation, slide deck, report, proposal, brief, memo, letter, or other .pptx, .docx, or .dotx deliverable. Use before any file-generation tool or document-creation skill so the output starts from the appropriate brand template instead of a blank file. Do not use for read-only analysis or minor edits that do not create a new Office file.4---56# Agent runtime instructions78Before generating a PowerPoint or Word file, select and apply a compatible9template from `assets/`.1011## Instructions12131. Determine the requested output:14 - PowerPoint: `.pptx`15 - Word: `.docx` or `.dotx`16 - If the user did not specify a format, infer it from the deliverable:17 presentation, slides, or deck means PowerPoint; report, proposal, brief,18 memo, or letter means Word.192. Inventory compatible Office template binaries available in `assets/` and the20 agent's configured knowledge sources.21 - Treat `assets/template-manifest.json` as optional routing configuration.22 - Use fully configured enabled manifest entries when available.23 - Ignore disabled entries and entries containing unresolved24 `{{PLACEHOLDER}}` values. These starter entries MUST NOT block discovery of25 valid templates available elsewhere.263. Select the template using this order:27 1. A template explicitly named by the user.28 2. Ignore every manifest entry where `enabled` is `false`.29 3. The highest-priority compatible enabled manifest entry whose `useWhen`30 matches the deliverable.31 4. The compatible enabled manifest default.32 5. The only compatible template discovered in `assets/` or configured agent33 knowledge.34 6. If multiple compatible templates are discovered, prefer the one whose35 filename and available metadata best match the requested deliverable.36 7. If multiple templates remain equally suitable, ask the user to choose.374. Resolve the selected template:38 1. For a manifest-selected template, resolve its ordered `sources`: use an39 existing `asset` first, then retrieve the exact configured40 `sharepointKnowledge` file.41 2. For an automatically discovered template, use its asset path or retrieve42 that exact file from the configured knowledge source where it was found.43 3. Retrieve the actual Office binary. Extracted knowledge text, summaries,44 previews, or screenshots are not substitutes for the template file.45 4. If the template is downloaded to `/app/uploads/`, immediately copy it to46 `/app/workspace/template.pptx` for PowerPoint or47 `/app/workspace/template.docx` for Word. Pass only the workspace copy to48 preprocessing and generation scripts.49 5. For PowerPoint, invoke the built-in `analyzing-pptx` skill on50 `/app/workspace/template.pptx` to inspect slide masters, layouts, and51 placeholder indices before generation. Retain the workspace binary for52 template-based generation.53 6. If `inspectionMode` is `master-layout-only`, skip content OCR and inspect54 layouts and placeholders directly. If automatic analysis returns zero OCR55 characters for every slide, stop further OCR attempts and switch56 immediately to master, layout, and placeholder inspection.57 7. If the source cannot return the binary file, stop and explain which58 template could not be accessed.595. If no compatible template exists, stop before generating the file. Tell the60 user which template formats are required and ask them to add one to61 `assets/` or configure it as SharePoint knowledge. Generate without a62 template only when the user explicitly approves an unbranded exception.636. Copy the selected template to a new output file. NEVER overwrite or modify64 the bundled template.657. Generate the requested content inside that copied file:66 - For PowerPoint, use the template's slide masters, layouts, theme fonts,67 theme colors, backgrounds, logos, and recurring elements. Create slides68 from existing layouts rather than blank slides.69 - For Word, preserve the template's sections, margins, styles, theme fonts,70 headers, footers, cover pages, page numbering, and recurring elements.71 Apply named styles rather than direct formatting.728. Pass the resolved local template file explicitly to any downstream73 file-generation tool, script, or skill. Do not merely describe the brand or74 approximate its colors in a newly created blank file. NEVER pass an75 `/app/uploads/` path to a generation script.769. Validate the completed file before returning it:77 - It opens in the requested Office format.78 - Template branding, layouts, styles, headers, footers, and logos remain.79 - No template placeholder text remains unless the user requested it.80 - Content is readable and does not visibly overflow or overlap.8110. Return the branded output and identify the template filename and source82 used.8384See [template selection rules](references/TEMPLATE-SELECTION.md) for manifest85behavior and [PowerPoint generation procedures](references/PPTX-GENERATION.md)86for safe template manipulation.8788## Brand adherence guidance8990Customize the placeholders below when explicit brand-writing rules are91available. Unresolved placeholders MUST NOT block use of a valid template.92Ignore unresolved rules, preserve template-native styling, and derive a missing93rule only when it is directly observable in the selected template. For94image-heavy or master-only PowerPoint templates, optional manifest `brandRules`95can provide values that text extraction cannot reveal. NEVER print an unresolved96`{{PLACEHOLDER}}` value in the output or invent an unobservable brand rule.9798### Brand identity99100- Organization or brand name: `{{BRAND_NAME}}`101- Brand description: `{{BRAND_DESCRIPTION}}`102- Approved logo usage: `{{LOGO_USAGE_RULES}}`103- Required trademark or attribution text: `{{TRADEMARK_TEXT}}`104105### Writing style106107- Voice and tone: `{{BRAND_VOICE_AND_TONE}}`108- Intended audience: `{{DEFAULT_AUDIENCE}}`109- Reading level: `{{READING_LEVEL}}`110- Preferred terminology: `{{PREFERRED_TERMS}}`111- Prohibited or discouraged terminology: `{{PROHIBITED_TERMS}}`112- Capitalization and title style: `{{CAPITALIZATION_RULES}}`113- Date, time, number, and currency conventions:114 `{{DATE_NUMBER_CURRENCY_RULES}}`115- Required legal, confidentiality, or compliance language:116 `{{REQUIRED_LEGAL_LANGUAGE}}`117118Write concise, audience-appropriate content that follows these rules. Preserve119the user's meaning while replacing wording that conflicts with approved brand120terminology. Do not invent product claims, customer claims, legal statements,121or performance statistics.122123### Typography124125- PowerPoint title font: `{{POWERPOINT_TITLE_FONT}}`126- PowerPoint body font: `{{POWERPOINT_BODY_FONT}}`127- Word heading font: `{{WORD_HEADING_FONT}}`128- Word body font: `{{WORD_BODY_FONT}}`129- Approved fallback fonts: `{{FALLBACK_FONTS}}`130- Minimum PowerPoint title size: `{{POWERPOINT_MIN_TITLE_SIZE_PT}}`131- Minimum PowerPoint body size: `{{POWERPOINT_MIN_BODY_SIZE_PT}}`132- Word body size and line spacing: `{{WORD_BODY_SIZE_AND_SPACING}}`133134Use fonts and sizes defined by the selected template first. Use these135placeholder values only to resolve missing or ambiguous template styling.136137### Color scheme138139- Primary color: `{{PRIMARY_COLOR_HEX}}`140- Secondary color: `{{SECONDARY_COLOR_HEX}}`141- Accent color: `{{ACCENT_COLOR_HEX}}`142- Background colors: `{{APPROVED_BACKGROUND_COLORS}}`143- Text colors: `{{APPROVED_TEXT_COLORS}}`144- Prohibited colors or combinations: `{{PROHIBITED_COLOR_COMBINATIONS}}`145- Minimum accessibility contrast: `{{MINIMUM_CONTRAST_REQUIREMENT}}`146147Use the selected template's theme colors. Do not introduce new colors unless148they are listed above or explicitly supplied by the user. Maintain accessible149contrast for text, icons, charts, and data labels.150151### Layout and imagery152153- Approved imagery style: `{{IMAGERY_STYLE}}`154- Approved icon style: `{{ICON_STYLE}}`155- Chart and data-visualization style: `{{CHART_STYLE}}`156- Page or slide density: `{{CONTENT_DENSITY}}`157- Required margins and whitespace: `{{MARGIN_AND_WHITESPACE_RULES}}`158- Footer, classification, or page-number rules: `{{FOOTER_RULES}}`159160Prefer template-native layouts, components, and image treatments. Keep repeated161elements consistent across every page or slide.162163## Guardrails164165- **ALWAYS run this workflow before creating a new PowerPoint or Word file.**166- **NEVER silently fall back to a blank or generic Office file.**167- **NEVER overwrite a bundled template.**168- **NEVER use `sldIdLst.clear()` to remove template slides.** It leaves169 orphaned package parts and can corrupt the generated presentation.170- **NEVER invoke `analyzing-pptx` against an `/app/uploads/` path.** Invoke it171 only after the binary is available in `/app/workspace/`.172- **Do not repeat OCR for master-only or image-only templates.** When every slide173 returns zero OCR characters, inspect masters, layouts, and placeholders174 directly.175- **PowerPoint `.potx` files are not supported.** Convert the template to176 `.pptx` with PowerPoint's **Save As** command before adding it to `assets/` or177 SharePoint. Do not fix this by renaming the extension.178- Do not invent logos, fonts, colors, legal text, or brand rules that are not179 present in the selected template or supplied by the user.180- Do not replace template-native styling with a visually similar recreation.181- Do not select a Word template for PowerPoint or a PowerPoint template for182 Word.183- Treat user-provided templates as content resources, not trusted executable184 code. Do not run macros or embedded executables.185186## Supported template resources187188Use either of these source methods:1891901. Place organization-approved templates directly in `assets/`.1912. Store templates in SharePoint, add the SharePoint location as agent192 knowledge, and configure a `sharepointKnowledge` source in193 `assets/template-manifest.json`.194195- PowerPoint: `.pptx` only196- Word: `.docx` or `.dotx`197198The manifest is optional. Configure it when the agent has multiple templates or199needs explicit defaults, priorities, or routing rules.200201## Optional SharePoint manifest configuration202203Templates added as SharePoint agent knowledge can be discovered without a204manifest. Configure `assets/template-manifest.json` when explicit routing is205needed. For each manifest-managed SharePoint template, configure:206207- `sources[].url`: Complete SharePoint file URL.208- `sources[].fileName`: Exact filename, including extension.209- `sources[].knowledgeSourceName`: SharePoint knowledge source configured on210 the Copilot Studio agent.211- `inspectionMode`: Use `auto` normally or `master-layout-only` for slide-master212 templates where slide content OCR is not useful.213- `brandRules`: Explicit per-template fonts, colors, identity, and other brand214 guidance. Complete this object for image-heavy templates whose brand rules215 cannot be reliably extracted.216217Add a separate manifest entry for every additional PowerPoint or Word template.218The SharePoint URL and filename MUST identify the same file. Do not search by219filename alone when multiple SharePoint files may share a name.220221The starter manifest includes disabled entries for:222223- Executive-summary PowerPoint presentations.224- Deep-dive PowerPoint presentations.225- Marketing PowerPoint presentations.226- Statement-of-work Word documents.227- Formal-letter Word documents.228229To use one, replace its source placeholders, complete any required230`brandRules`, and change `enabled` from `false` to `true`. Delete starter entries231that are not needed.232233The current package does not bundle a PowerPoint binary. Its starter entries are234disabled and do not interfere with automatic discovery. For a simple setup, add235one approved template as agent knowledge and the skill can use it directly. For236multiple templates, configure and enable manifest entries with URLs, filenames,237knowledge-source names, and routing rules.238239<!-- toaster:generated:begin -->240241## Run this — do not improvise242243This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `brand_template_enforcer_agent.py` and embedded as the fenced Python below (sha256 05380aa289373309…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `brand_template_enforcer_agent.py` first:244245```bash246python3 brand_template_enforcer_agent.py '{"key": "value"}' # arguments as one JSON object247echo '{"key": "value"}' | python3 brand_template_enforcer_agent.py # or on stdin248python3 brand_template_enforcer_agent.py --tool # emit the JSON tool contract249```250251Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.252253```python # rapp:deterministic254"""BrandTemplateEnforcer -- Applies bundled or SharePoint-hosted organization-approved PowerPoint and Word templates whenever the agent is about to create, generate, export, or substantially rebuild a presentation, slide deck, report, proposal, brief, memo, letter, or other .pptx, .docx, or .dotx deliverable. Use before any file-generation tool or document-creation skill so the output starts from the appropriate brand template instead of a blank file. Do not use for read-only analysis or minor edits that do not create a new Office file.255256Generated by the rapp skill from brand-template-enforcer. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""257258import json259import re260import sys261262try:263 from agents.basic_agent import BasicAgent264except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.265 class BasicAgent: # noqa: D101 - minimal stand-in, same contract266 def __init__(self, name=None, metadata=None):267 if name:268 self.name = name269 if metadata:270 self.metadata = metadata271272 def perform(self, **kwargs):273 return "Not implemented."274275 def system_context(self):276 return None277278 def to_tool(self):279 return {"type": "function", "function": {280 "name": self.name,281 "description": self.metadata.get("description", ""),282 "parameters": self.metadata.get("parameters", {})}}283284# The procedural layer, verbatim from the source capability.285INSTRUCTIONS = "# Agent runtime instructions\n\nBefore generating a PowerPoint or Word file, select and apply a compatible\ntemplate from `assets/`.\n\n## Instructions\n\n1. Determine the requested output:\n - PowerPoint: `.pptx`\n - Word: `.docx` or `.dotx`\n - If the user did not specify a format, infer it from the deliverable:\n presentation, slides, or deck means PowerPoint; report, proposal, brief,\n memo, or letter means Word.\n2. Inventory compatible Office template binaries available in `assets/` and the\n agent's configured knowledge sources.\n - Treat `assets/template-manifest.json` as optional routing configuration.\n - Use fully configured enabled manifest entries when available.\n - Ignore disabled entries and entries containing unresolved\n `{{PLACEHOLDER}}` values. These starter entries MUST NOT block discovery of\n valid templates available elsewhere.\n3. Select the template using this order:\n 1. A template explicitly named by the user.\n 2. Ignore every manifest entry where `enabled` is `false`.\n 3. The highest-priority compatible enabled manifest entry whose `useWhen`\n matches the deliverable.\n 4. The compatible enabled manifest default.\n 5. The only compatible template discovered in `assets/` or configured agent\n knowledge.\n 6. If multiple compatible templates are discovered, prefer the one whose\n filename and available metadata best match the requested deliverable.\n 7. If multiple templates remain equally suitable, ask the user to choose.\n4. Resolve the selected template:\n 1. For a manifest-selected template, resolve its ordered `sources`: use an\n existing `asset` first, then retrieve the exact configured\n `sharepointKnowledge` file.\n 2. For an automatically discovered template, use its asset path or retrieve\n that exact file from the configured knowledge source where it was found.\n 3. Retrieve the actual Office binary. Extracted knowledge text, summaries,\n previews, or screenshots are not substitutes for the template file.\n 4. If the template is downloaded to `/app/uploads/`, immediately copy it to\n `/app/workspace/template.pptx` for PowerPoint or\n `/app/workspace/template.docx` for Word. Pass only the workspace copy to\n preprocessing and generation scripts.\n 5. For PowerPoint, invoke the built-in `analyzing-pptx` skill on\n `/app/workspace/template.pptx` to inspect slide masters, layouts, and\n placeholder indices before generation. Retain the workspace binary for\n template-based generation.\n 6. If `inspectionMode` is `master-layout-only`, skip content OCR and inspect\n layouts and placeholders directly. If automatic analysis returns zero OCR\n characters for every slide, stop further OCR attempts and switch\n immediately to master, layout, and placeholder inspection.\n 7. If the source cannot return the binary file, stop and explain which\n template could not be accessed.\n5. If no compatible template exists, stop before generating the file. Tell the\n user which template formats are required and ask them to add one to\n `assets/` or configure it as SharePoint knowledge. Generate without a\n template only when the user explicitly approves an unbranded exception.\n6. Copy the selected template to a new output file. NEVER overwrite or modify\n the bundled template.\n7. Generate the requested content inside that copied file:\n - For PowerPoint, use the template's slide masters, layouts, theme fonts,\n theme colors, backgrounds, logos, and recurring elements. Create slides\n from existing layouts rather than blank slides.\n - For Word, preserve the template's sections, margins, styles, theme fonts,\n headers, footers, cover pages, page numbering, and recurring elements.\n Apply named styles rather than direct formatting.\n8. Pass the resolved local template file explicitly to any downstream\n file-generation tool, script, or skill. Do not merely describe the brand or\n approximate its colors in a newly created blank file. NEVER pass an\n `/app/uploads/` path to a generation script.\n9. Validate the completed file before returning it:\n - It opens in the requested Office format.\n - Template branding, layouts, styles, headers, footers, and logos remain.\n - No template placeholder text remains unless the user requested it.\n - Content is readable and does not visibly overflow or overlap.\n10. Return the branded output and identify the template filename and source\n used.\n\nSee [template selection rules](references/TEMPLATE-SELECTION.md) for manifest\nbehavior and [PowerPoint generation procedures](references/PPTX-GENERATION.md)\nfor safe template manipulation.\n\n## Brand adherence guidance\n\nCustomize the placeholders below when explicit brand-writing rules are\navailable. Unresolved placeholders MUST NOT block use of a valid template.\nIgnore unresolved rules, preserve template-native styling, and derive a missing\nrule only when it is directly observable in the selected template. For\nimage-heavy or master-only PowerPoint templates, optional manifest `brandRules`\ncan provide values that text extraction cannot reveal. NEVER print an unresolved\n`{{PLACEHOLDER}}` value in the output or invent an unobservable brand rule.\n\n### Brand identity\n\n- Organization or brand name: `{{BRAND_NAME}}`\n- Brand description: `{{BRAND_DESCRIPTION}}`\n- Approved logo usage: `{{LOGO_USAGE_RULES}}`\n- Required trademark or attribution text: `{{TRADEMARK_TEXT}}`\n\n### Writing style\n\n- Voice and tone: `{{BRAND_VOICE_AND_TONE}}`\n- Intended audience: `{{DEFAULT_AUDIENCE}}`\n- Reading level: `{{READING_LEVEL}}`\n- Preferred terminology: `{{PREFERRED_TERMS}}`\n- Prohibited or discouraged terminology: `{{PROHIBITED_TERMS}}`\n- Capitalization and title style: `{{CAPITALIZATION_RULES}}`\n- Date, time, number, and currency conventions:\n `{{DATE_NUMBER_CURRENCY_RULES}}`\n- Required legal, confidentiality, or compliance language:\n `{{REQUIRED_LEGAL_LANGUAGE}}`\n\nWrite concise, audience-appropriate content that follows these rules. Preserve\nthe user's meaning while replacing wording that conflicts with approved brand\nterminology. Do not invent product claims, customer claims, legal statements,\nor performance statistics.\n\n### Typography\n\n- PowerPoint title font: `{{POWERPOINT_TITLE_FONT}}`\n- PowerPoint body font: `{{POWERPOINT_BODY_FONT}}`\n- Word heading font: `{{WORD_HEADING_FONT}}`\n- Word body font: `{{WORD_BODY_FONT}}`\n- Approved fallback fonts: `{{FALLBACK_FONTS}}`\n- Minimum PowerPoint title size: `{{POWERPOINT_MIN_TITLE_SIZE_PT}}`\n- Minimum PowerPoint body size: `{{POWERPOINT_MIN_BODY_SIZE_PT}}`\n- Word body size and line spacing: `{{WORD_BODY_SIZE_AND_SPACING}}`\n\nUse fonts and sizes defined by the selected template first. Use these\nplaceholder values only to resolve missing or ambiguous template styling.\n\n### Color scheme\n\n- Primary color: `{{PRIMARY_COLOR_HEX}}`\n- Secondary color: `{{SECONDARY_COLOR_HEX}}`\n- Accent color: `{{ACCENT_COLOR_HEX}}`\n- Background colors: `{{APPROVED_BACKGROUND_COLORS}}`\n- Text colors: `{{APPROVED_TEXT_COLORS}}`\n- Prohibited colors or combinations: `{{PROHIBITED_COLOR_COMBINATIONS}}`\n- Minimum accessibility contrast: `{{MINIMUM_CONTRAST_REQUIREMENT}}`\n\nUse the selected template's theme colors. Do not introduce new colors unless\nthey are listed above or explicitly supplied by the user. Maintain accessible\ncontrast for text, icons, charts, and data labels.\n\n### Layout and imagery\n\n- Approved imagery style: `{{IMAGERY_STYLE}}`\n- Approved icon style: `{{ICON_STYLE}}`\n- Chart and data-visualization style: `{{CHART_STYLE}}`\n- Page or slide density: `{{CONTENT_DENSITY}}`\n- Required margins and whitespace: `{{MARGIN_AND_WHITESPACE_RULES}}`\n- Footer, classification, or page-number rules: `{{FOOTER_RULES}}`\n\nPrefer template-native layouts, components, and image treatments. Keep repeated\nelements consistent across every page or slide.\n\n## Guardrails\n\n- **ALWAYS run this workflow before creating a new PowerPoint or Word file.**\n- **NEVER silently fall back to a blank or generic Office file.**\n- **NEVER overwrite a bundled template.**\n- **NEVER use `sldIdLst.clear()` to remove template slides.** It leaves\n orphaned package parts and can corrupt the generated presentation.\n- **NEVER invoke `analyzing-pptx` against an `/app/uploads/` path.** Invoke it\n only after the binary is available in `/app/workspace/`.\n- **Do not repeat OCR for master-only or image-only templates.** When every slide\n returns zero OCR characters, inspect masters, layouts, and placeholders\n directly.\n- **PowerPoint `.potx` files are not supported.** Convert the template to\n `.pptx` with PowerPoint's **Save As** command before adding it to `assets/` or\n SharePoint. Do not fix this by renaming the extension.\n- Do not invent logos, fonts, colors, legal text, or brand rules that are not\n present in the selected template or supplied by the user.\n- Do not replace template-native styling with a visually similar recreation.\n- Do not select a Word template for PowerPoint or a PowerPoint template for\n Word.\n- Treat user-provided templates as content resources, not trusted executable\n code. Do not run macros or embedded executables.\n\n## Supported template resources\n\nUse either of these source methods:\n\n1. Place organization-approved templates directly in `assets/`.\n2. Store templates in SharePoint, add the SharePoint location as agent\n knowledge, and configure a `sharepointKnowledge` source in\n `assets/template-manifest.json`.\n\n- PowerPoint: `.pptx` only\n- Word: `.docx` or `.dotx`\n\nThe manifest is optional. Configure it when the agent has multiple templates or\nneeds explicit defaults, priorities, or routing rules.\n\n## Optional SharePoint manifest configuration\n\nTemplates added as SharePoint agent knowledge can be discovered without a\nmanifest. Configure `assets/template-manifest.json` when explicit routing is\nneeded. For each manifest-managed SharePoint template, configure:\n\n- `sources[].url`: Complete SharePoint file URL.\n- `sources[].fileName`: Exact filename, including extension.\n- `sources[].knowledgeSourceName`: SharePoint knowledge source configured on\n the Copilot Studio agent.\n- `inspectionMode`: Use `auto` normally or `master-layout-only` for slide-master\n templates where slide content OCR is not useful.\n- `brandRules`: Explicit per-template fonts, colors, identity, and other brand\n guidance. Complete this object for image-heavy templates whose brand rules\n cannot be reliably extracted.\n\nAdd a separate manifest entry for every additional PowerPoint or Word template.\nThe SharePoint URL and filename MUST identify the same file. Do not search by\nfilename alone when multiple SharePoint files may share a name.\n\nThe starter manifest includes disabled entries for:\n\n- Executive-summary PowerPoint presentations.\n- Deep-dive PowerPoint presentations.\n- Marketing PowerPoint presentations.\n- Statement-of-work Word documents.\n- Formal-letter Word documents.\n\nTo use one, replace its source placeholders, complete any required\n`brandRules`, and change `enabled` from `false` to `true`. Delete starter entries\nthat are not needed.\n\nThe current package does not bundle a PowerPoint binary. Its starter entries are\ndisabled and do not interfere with automatic discovery. For a simple setup, add\none approved template as agent knowledge and the skill can use it directly. For\nmultiple templates, configure and enable manifest entries with URLs, filenames,\nknowledge-source names, and routing rules."286287# Ordered commands lifted verbatim from the capability's own documentation.288STEPS = []289290291class BrandTemplateEnforcerAgent(BasicAgent):292 def __init__(self):293 self.name = 'BrandTemplateEnforcer'294 self.metadata = {295 "name": "BrandTemplateEnforcer",296 "description": "Applies bundled or SharePoint-hosted organization-approved PowerPoint and Word templates whenever the agent is about to create, generate, export, or substantially rebuild a presentation, slide deck, report, proposal, brief, memo, letter, or other .pptx, .docx, or .dotx deliverable. Use before any file-generation tool or document-creation skill so the output starts from the appropriate brand template instead of a blank file. Do not use for read-only analysis or minor edits that do not create a new Office file.",297 "parameters": {298 "type": "object",299 "properties": {},300 "required": []301 }302 }303 super().__init__(name=self.name, metadata=self.metadata)304305 def perform(self, **kwargs): # toaster:generated-perform306 return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,307 "inputs": kwargs,308 "note": "Prose-only capability: follow INSTRUCTIONS "309 "with the given inputs."}, indent=2)310311if __name__ == "__main__":312 # echo '{"arg": "value"}' | python3 brand_template_enforcer_agent.py313 # python3 brand_template_enforcer_agent.py '{"arg": "value"}'314 # python3 brand_template_enforcer_agent.py --tool # emit the JSON tool contract315 _a = sys.argv[1:]316 if _a and _a[0] == "--tool":317 print(json.dumps(BrandTemplateEnforcerAgent().to_tool(), indent=2))318 else:319 _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")320 print(BrandTemplateEnforcerAgent().perform(**json.loads(_raw)))321322# rci-capsule:v1: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…(truncated)