Anonymised Case Study Writer
Use this skill to create credible, anonymised case studies from engagement notes, interview notes, project summaries, outcomes, or source documents.
Core rules
- Protect confidentiality. Remove or generalise names, client identifiers, locations, internal programme names, system names, and commercially sensitive details unless the user explicitly says they are public.
- Do not invent outcomes. Only include outcomes, metrics, timelines, and benefits that appear in the source material or are supplied by the user.
- Preserve credibility. Prefer specific operational detail over vague marketing claims, while keeping the client anonymised.
- Make the story reusable. Structure the case study so it can be used in proposals, webpages, thought leadership, sales conversations, and internal learning.
- Separate unknowns. If outcomes or proof points are missing, include a short "Evidence gaps" section rather than fabricating.
Default anonymisation pattern
Use neutral descriptors such as:
- A large public sector organisation.
- A global consumer goods company.
- A regulated financial services organisation.
- A national healthcare provider.
- A multinational energy business.
Only describe sector, scale, geography, and technology where the source material supports it and doing so does not identify the client.
Workflow
- Read all supplied source material.
- Extract the engagement context, problem, constraints, intervention, outcomes, and lessons.
- Identify any confidential or identifying details and replace them with safe descriptors.
- Draft the case study using the structure below.
- Check every claim against the source material.
- Add evidence gaps or suggested follow-up questions only where needed.
- Return copy-ready Markdown.
Default structure
# [Case study title]
## At a glance
| Field | Summary |
|---|---|
| Client type | [Anonymised descriptor] |
| Sector | [Sector if known] |
| Challenge | [One-sentence challenge] |
| Work delivered | [One-sentence intervention] |
| Outcome | [Evidence-backed outcome or "Outcome evidence not provided"] |
## Context
[What was happening and why it mattered.]
## The challenge
[The specific business, operating, adoption, governance, delivery, or technology problem.]
## What we did
[Practical work performed. Use bullets only where they improve clarity.]
## What changed
[Evidence-backed outcomes, capability shifts, decisions enabled, delivery improvements, or learning generated.]
## Why it mattered
[Business relevance and wider lesson.]
## Reusable insight
[The portable lesson other organisations can learn from this case.]
## Evidence gaps
- [Only include if relevant.]
Style guidance
- Write in a human, experienced, consultancy-literate voice.
- Avoid exaggerated sales language.
- Avoid implying certainty where the source only suggests possibility.
- Make the piece useful even if formal metrics are unavailable.
- Keep paragraphs short enough for web reading.
References
This skill includes supporting reference material. Read the relevant reference file when the task needs additional structure, rubric detail, examples, or checklist support.
references/anonymisation-checklist.md- use this when additional structure, examples, or checks are useful for the task.
Quality checklist
Before responding, check:
- No client-confidential detail has leaked.
- Every outcome is backed by supplied evidence.
- The case study has a clear before / intervention / after shape.
- The writing is credible and not generic.
- Evidence gaps are visible rather than hidden.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as anonymised_case_study_writer_agent.py and embedded as the fenced Python below (sha256 df30ec64bf2a16ee…; 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 anonymised_case_study_writer_agent.py first:
python3 anonymised_case_study_writer_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 anonymised_case_study_writer_agent.py # or on stdin
python3 anonymised_case_study_writer_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.
"""AnonymisedCaseStudyWriter -- Use this skill when the user asks to create, improve, anonymise, structure, or publish a client case study, success story, engagement summary, or transformation story.
Generated by the rapp skill from anonymised-case-study-writer. 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 = '# Anonymised Case Study Writer\n\nUse this skill to create credible, anonymised case studies from engagement notes, interview notes, project summaries, outcomes, or source documents.\n\n## Core rules\n\n1. **Protect confidentiality.** Remove or generalise names, client identifiers, locations, internal programme names, system names, and commercially sensitive details unless the user explicitly says they are public.\n2. **Do not invent outcomes.** Only include outcomes, metrics, timelines, and benefits that appear in the source material or are supplied by the user.\n3. **Preserve credibility.** Prefer specific operational detail over vague marketing claims, while keeping the client anonymised.\n4. **Make the story reusable.** Structure the case study so it can be used in proposals, webpages, thought leadership, sales conversations, and internal learning.\n5. **Separate unknowns.** If outcomes or proof points are missing, include a short "Evidence gaps" section rather than fabricating.\n\n## Default anonymisation pattern\n\nUse neutral descriptors such as:\n\n- A large public sector organisation.\n- A global consumer goods company.\n- A regulated financial services organisation.\n- A national healthcare provider.\n- A multinational energy business.\n\nOnly describe sector, scale, geography, and technology where the source material supports it and doing so does not identify the client.\n\n## Workflow\n\n1. Read all supplied source material.\n2. Extract the engagement context, problem, constraints, intervention, outcomes, and lessons.\n3. Identify any confidential or identifying details and replace them with safe descriptors.\n4. Draft the case study using the structure below.\n5. Check every claim against the source material.\n6. Add evidence gaps or suggested follow-up questions only where needed.\n7. Return copy-ready Markdown.\n\n## Default structure\n\n```markdown\n# [Case study title]\n\n## At a glance\n\n| Field | Summary |\n|---|---|\n| Client type | [Anonymised descriptor] |\n| Sector | [Sector if known] |\n| Challenge | [One-sentence challenge] |\n| Work delivered | [One-sentence intervention] |\n| Outcome | [Evidence-backed outcome or "Outcome evidence not provided"] |\n\n## Context\n\n[What was happening and why it mattered.]\n\n## The challenge\n\n[The specific business, operating, adoption, governance, delivery, or technology problem.]\n\n## What we did\n\n[Practical work performed. Use bullets only where they improve clarity.]\n\n## What changed\n\n[Evidence-backed outcomes, capability shifts, decisions enabled, delivery improvements, or learning generated.]\n\n## Why it mattered\n\n[Business relevance and wider lesson.]\n\n## Reusable insight\n\n[The portable lesson other organisations can learn from this case.]\n\n## Evidence gaps\n\n- [Only include if relevant.]\n```\n\n## Style guidance\n\n- Write in a human, experienced, consultancy-literate voice.\n- Avoid exaggerated sales language.\n- Avoid implying certainty where the source only suggests possibility.\n- Make the piece useful even if formal metrics are unavailable.\n- Keep paragraphs short enough for web reading.\n\n\n## References\n\nThis skill includes supporting reference material. Read the relevant reference file when the task needs additional structure, rubric detail, examples, or checklist support.\n\n- `references/anonymisation-checklist.md` - use this when additional structure, examples, or checks are useful for the task.\n\n## Quality checklist\n\nBefore responding, check:\n\n- No client-confidential detail has leaked.\n- Every outcome is backed by supplied evidence.\n- The case study has a clear before / intervention / after shape.\n- The writing is credible and not generic.\n- Evidence gaps are visible rather than hidden.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class AnonymisedCaseStudyWriterAgent(BasicAgent):
def __init__(self):
self.name = 'AnonymisedCaseStudyWriter'
self.metadata = {
"name": "AnonymisedCaseStudyWriter",
"description": "Use this skill when the user asks to create, improve, anonymise, structure, or publish a client case study, success story, engagement summary, or transformation story.",
"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 anonymised_case_study_writer_agent.py
# python3 anonymised_case_study_writer_agent.py '{"arg": "value"}'
# python3 anonymised_case_study_writer_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(AnonymisedCaseStudyWriterAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(AnonymisedCaseStudyWriterAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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