Install any skill in seconds. Free to start, no credit card required.
Get Started Free →처리방침·이용약관 자동 생성 스킬 패키지 (v4.0). 호출 시 privacy-kr·privacy-eu·privacy-us·privacy-global 4개 하위 스킬을 번호 메뉴로 제시하고 번호 입력 즉시 해당 스킬 인터뷰로 직행. 한국 PIPA + EU GDPR + US CCPA/CPRA 대응.
SkillScore82/100
Test results 82
3/3 safety checks passed
41%82%of test cases passed +41 pts
Passed 18 of 22 test cases with the skill, and 9 of 22 without it.
9 fixed9 passed either way4 still failing0 broke
One test taskWhat legal disclaimer note must be included at the top of all generated privacy policy and terms files?
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add kimlawtech-korean-privacy-terms
claude --plugin-dir "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.agents"The same install from Python, for a notebook or a setup script.
pip install "decimalai>=0.15"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
print("Added. Start Claude Code with the command below.")claude --plugin-dir "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.agents"Type these in a Claude Code session. No account or API key. It writes the skill and any files it bundles, and asks first when its safety rating isn't Passed.
/plugin marketplace add decimal-labs/decimalai-claude-plugins
/plugin install decimalai@decimalai/decimalai:install kimlawtech-korean-privacy-termsThe plugin needs python3 and curl on your machine.
No Python or account. Claude Code picks it up in its next session.
curl -fsSL --create-dirs -o .claude/skills/kimlawtech-korean-privacy-terms/SKILL.md https://app.decimal.ai/s/kimlawtech-korean-privacy-terms/SKILL.md.claude/skills/kimlawtech-korean-privacy-terms/SKILL.mdThis gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[claude-agent-sdk]"
decimalai skills add kimlawtech-korean-privacy-termsimport asyncio
from claude_agent_sdk import ClaudeAgentOptions
from decimalai.claude_agent_sdk import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
async def main():
question = "Hello!"
async with support.run(question) as run: # one user message, one run
async for message in run.query(options=ClaudeAgentOptions(max_turns=6)):
print(message)
# In a notebook or async code: await main()
asyncio.run(main())Prefer its own loader? ClaudeAgentOptions(plugins=[skills_plugin()], skills="all") reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[claude-agent-sdk]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
import asyncio
from claude_agent_sdk import ClaudeAgentOptions
from decimalai.claude_agent_sdk import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
async def main():
question = "Hello!"
async with support.run(question) as run: # one user message, one run
async for message in run.query(options=ClaudeAgentOptions(max_turns=6)):
print(message)
# In a notebook or async code: await main()
asyncio.run(main())Prefer its own loader? ClaudeAgentOptions(plugins=[skills_plugin()], skills="all") reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
options = ClaudeAgentOptions(system_prompt=f"You are a helpful agent.\n\n{skill}", max_turns=6)
async def main():
async for message in query(prompt="Hello!", options=options):
print(message)
# In a notebook or async code: await main()
asyncio.run(main())This gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai-agents]"
decimalai skills add kimlawtech-korean-privacy-termsfrom agents import Agent, Runner
from decimalai.openai_agents import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
name=support.name,
instructions=support.instructions, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# In a notebook or async code: result = await Runner.run(agent, "Hello!")
result = Runner.run_sync(agent, "Hello!")Using SandboxAgent? capabilities=[Shell(), decimalai.openai_agents.sandbox_skills()] points its own loader at the same folder.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai-agents]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
from agents import Agent, Runner
from decimalai.openai_agents import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
name=support.name,
instructions=support.instructions, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# In a notebook or async code: result = await Runner.run(agent, "Hello!")
result = Runner.run_sync(agent, "Hello!")Using SandboxAgent? capabilities=[Shell(), decimalai.openai_agents.sandbox_skills()] points its own loader at the same folder.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = Agent(name="support", instructions=f"You are a helpful agent.\n\n{skill}")
# In a notebook or async code: result = await Runner.run(agent, "Hello!")
result = Runner.run_sync(agent, "Hello!")This gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai]"
decimalai skills add kimlawtech-korean-privacy-termsimport json
from openai import OpenAI
from decimalai.openai import agent_config
client = OpenAI()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your tools, as Chat Completions takes them, and what answers each.
TOOLS = [{"type": "function", "function": {
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
# run.system is your prompt, then the skill list.
messages = [{"role": "system", "content": run.system}, run.message]
while True:
reply = client.chat.completions.create(
model="gpt-5.4-mini",
messages=messages,
tools=[*TOOLS, *run.tools], # your tools, then load_skill
).choices[0].message
messages.append(reply)
if not reply.tool_calls:
break
for call in reply.tool_calls:
# load_skill is answered by the run; your own tools by FUNCTIONS.
function = FUNCTIONS.get(call.function.name)
messages.append(run.tool_result(call) or {
"role": "tool", "tool_call_id": call.id,
"content": function(**json.loads(call.function.arguments)) if function
else f"There is no tool named {call.function.name!r}.",
})
print(reply.content)
# The Responses API takes run.response_tools instead of run.tools.The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
import json
from openai import OpenAI
from decimalai.openai import agent_config
client = OpenAI()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your tools, as Chat Completions takes them, and what answers each.
TOOLS = [{"type": "function", "function": {
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
# run.system is your prompt, then the skill list.
messages = [{"role": "system", "content": run.system}, run.message]
while True:
reply = client.chat.completions.create(
model="gpt-5.4-mini",
messages=messages,
tools=[*TOOLS, *run.tools], # your tools, then load_skill
).choices[0].message
messages.append(reply)
if not reply.tool_calls:
break
for call in reply.tool_calls:
# load_skill is answered by the run; your own tools by FUNCTIONS.
function = FUNCTIONS.get(call.function.name)
messages.append(run.tool_result(call) or {
"role": "tool", "tool_call_id": call.id,
"content": function(**json.loads(call.function.arguments)) if function
else f"There is no tool named {call.function.name!r}.",
})
print(reply.content)
# The Responses API takes run.response_tools instead of run.tools.No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
reply = client.chat.completions.create(
model="gpt-5.4-mini",
messages=[
{"role": "system", "content": f"You are a helpful agent.\n\n{skill}"},
{"role": "user", "content": "Hello!"},
],
).choices[0].messageThis gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[anthropic]"
decimalai skills add kimlawtech-korean-privacy-termsimport anthropic
from decimalai.anthropic import agent_config
client = anthropic.Anthropic()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
question = "Hello!"
with support.run(question) as run: # one user message, one run
answer = client.beta.messages.tool_runner(
model="claude-haiku-5-5",
max_tokens=4096,
system=run.system, # your prompt, then the skill list
tools=[*run.tools], # your tools, then load_skill
messages=[{"role": "user", "content": question}],
).until_done()The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[anthropic]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
import anthropic
from decimalai.anthropic import agent_config
client = anthropic.Anthropic()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
question = "Hello!"
with support.run(question) as run: # one user message, one run
answer = client.beta.messages.tool_runner(
model="claude-haiku-5-5",
max_tokens=4096,
system=run.system, # your prompt, then the skill list
tools=[*run.tools], # your tools, then load_skill
messages=[{"role": "user", "content": question}],
).until_done()No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
reply = client.messages.create(
model="claude-haiku-5-5",
max_tokens=4096,
system=f"You are a helpful agent.\n\n{skill}",
messages=[{"role": "user", "content": "Hello!"}],
)This gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[google-genai]"
decimalai skills add kimlawtech-korean-privacy-termsfrom google import genai
from google.genai import types
from decimalai.google_genai import agent_config
client = genai.Client()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your functions, as declarations for the model, and what answers each.
TOOLS = [{"function_declarations": [{
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters_json_schema": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}]}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
config = types.GenerateContentConfig(
system_instruction=run.system, # your prompt, then the skill list
tools=[*TOOLS, *run.tool_params], # your functions, then load_skill
)
contents = [{"role": "user", "parts": [{"text": run.message}]}]
while True:
response = client.models.generate_content(
model="gemini-3.5-flash", contents=contents, config=config,
)
if not response.function_calls:
break
contents.append(response.candidates[0].content)
parts = []
for call in response.function_calls:
# load_skill is answered by the run; your own functions by FUNCTIONS.
# A loop of your own rather than automatic function calling, which
# raises KeyError when the model asks for a function you did not pass.
function = FUNCTIONS.get(call.name)
parts.append(run.tool_result(call) or {"function_response": {
"name": call.name, "id": call.id,
"response": {"result": function(**(call.args or {})) if function
else f"There is no function named {call.name!r}."},
}})
contents.append({"role": "user", "parts": parts})
print(response.text)The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[google-genai]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
from google import genai
from google.genai import types
from decimalai.google_genai import agent_config
client = genai.Client()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your functions, as declarations for the model, and what answers each.
TOOLS = [{"function_declarations": [{
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters_json_schema": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}]}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
config = types.GenerateContentConfig(
system_instruction=run.system, # your prompt, then the skill list
tools=[*TOOLS, *run.tool_params], # your functions, then load_skill
)
contents = [{"role": "user", "parts": [{"text": run.message}]}]
while True:
response = client.models.generate_content(
model="gemini-3.5-flash", contents=contents, config=config,
)
if not response.function_calls:
break
contents.append(response.candidates[0].content)
parts = []
for call in response.function_calls:
# load_skill is answered by the run; your own functions by FUNCTIONS.
# A loop of your own rather than automatic function calling, which
# raises KeyError when the model asks for a function you did not pass.
function = FUNCTIONS.get(call.name)
parts.append(run.tool_result(call) or {"function_response": {
"name": call.name, "id": call.id,
"response": {"result": function(**(call.args or {})) if function
else f"There is no function named {call.name!r}."},
}})
contents.append({"role": "user", "parts": parts})
print(response.text)No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="Hello!",
config=types.GenerateContentConfig(system_instruction=f"You are a helpful agent.\n\n{skill}"),
)This gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[langchain]" langchain-openai
decimalai skills add kimlawtech-korean-privacy-termsfrom langchain.agents import create_agent
from decimalai.langchain import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = create_agent(
"openai:gpt-5.4-mini",
tools=[], # your tools; the middleware adds load_skill
middleware=[support.middleware], # your prompt, the skill list and load_skill
)
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[langchain]" langchain-openaifrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
from langchain.agents import create_agent
from decimalai.langchain import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = create_agent(
"openai:gpt-5.4-mini",
tools=[], # your tools; the middleware adds load_skill
middleware=[support.middleware], # your prompt, the skill list and load_skill
)
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = create_agent("openai:gpt-5.4-mini", tools=[], system_prompt=f"You are a helpful agent.\n\n{skill}")
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})This gets SKILL.md only. The skill's 14 other files are not included.
CrewAI's own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" "crewai>=1.15.27"
decimalai skills add kimlawtech-korean-privacy-termsimport decimalai.crewai
from crewai import Agent, Crew, Task
agent = Agent(
role="Support", goal="Help the customer", backstory="A support agent.",
llm=llm, # your own CrewAI LLM
skills=decimalai.crewai.skills(), # the installed folder
tools=decimalai.crewai.skill_tools(), # reads a skill's files, runs its scripts
)
task = Task(description="Hello!", expected_output="an answer", agent=agent)
Crew(agents=[agent], tasks=[task]).kickoff()The same install from Python, for a notebook or a setup script. CrewAI's own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" "crewai>=1.15.27"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
import decimalai.crewai
from crewai import Agent, Crew, Task
agent = Agent(
role="Support", goal="Help the customer", backstory="A support agent.",
llm=llm, # your own CrewAI LLM
skills=decimalai.crewai.skills(), # the installed folder
tools=decimalai.crewai.skill_tools(), # reads a skill's files, runs its scripts
)
task = Task(description="Hello!", expected_output="an answer", agent=agent)
Crew(agents=[agent], tasks=[task]).kickoff()No DecimalAI package. CrewAI's own loader reads the folder, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from crewai import Agent, Crew, Task
agent = Agent(
role="Support", goal="Help the customer", backstory="A support agent.",
llm=llm, # your own CrewAI LLM
skills=[Path(".agents/skills")],
)
task = Task(description="Hello!", expected_output="an answer", agent=agent)
Crew(agents=[agent], tasks=[task]).kickoff()This gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[adk]"
decimalai skills add kimlawtech-korean-privacy-termsfrom decimalai.adk import DecimalAIPlugin, agent_config
from google.adk.agents import LlmAgent
from google.adk.apps import App
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = LlmAgent(
name="support", # ADK needs a Python identifier
model="gemini-3.5-flash",
instruction=support.instruction, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# DecimalAIPlugin makes each invocation of runners built from this App one trace.
app = App(name="support", root_agent=agent, plugins=[DecimalAIPlugin()])Prefer ADK's own loader? SkillToolset(skills=decimalai.adk.skills(), ...) reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[adk]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
from decimalai.adk import DecimalAIPlugin, agent_config
from google.adk.agents import LlmAgent
from google.adk.apps import App
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = LlmAgent(
name="support", # ADK needs a Python identifier
model="gemini-3.5-flash",
instruction=support.instruction, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# DecimalAIPlugin makes each invocation of runners built from this App one trace.
app = App(name="support", root_agent=agent, plugins=[DecimalAIPlugin()])Prefer ADK's own loader? SkillToolset(skills=decimalai.adk.skills(), ...) reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = LlmAgent(
name="support",
model="gemini-3.5-flash",
instruction=lambda context: f"You are a helpful agent.\n\n{skill}",
)This gets SKILL.md only. The skill's 14 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[pydantic-ai]"
decimalai skills add kimlawtech-korean-privacy-termsfrom pydantic_ai import Agent
from decimalai.pydantic_ai import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
"openai:gpt-4o-mini",
name=support.name,
tools=[], # your tools; the capability adds load_skill
capabilities=[support], # your prompt, the skill list and load_skill
)
# In a notebook or async code: result = await agent.run("Hello!")
result = agent.run_sync("Hello!")On the Pydantic AI harness, decimalai.pydantic_ai_harness.skills(project) uses its own loader instead.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[pydantic-ai]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
from pydantic_ai import Agent
from decimalai.pydantic_ai import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
"openai:gpt-4o-mini",
name=support.name,
tools=[], # your tools; the capability adds load_skill
capabilities=[support], # your prompt, the skill list and load_skill
)
# In a notebook or async code: result = await agent.run("Hello!")
result = agent.run_sync("Hello!")On the Pydantic AI harness, decimalai.pydantic_ai_harness.skills(project) uses its own loader instead.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = Agent("openai:gpt-4o-mini", instructions=f"You are a helpful agent.\n\n{skill}")
# In a notebook or async code: result = await agent.run("Hello!")
result = agent.run_sync("Hello!")This gets SKILL.md only. The skill's 14 other files are not included.
Deep Agents' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" deepagents
decimalai skills add kimlawtech-korean-privacy-termsimport decimalai.deepagents
from deepagents import create_deep_agent
agent = create_deep_agent(model=model, **decimalai.deepagents.skills())
agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})The default backend reads files but has no shell. To run a skill's scripts, pass skills(backend=LocalShellBackend(...)).
The same install from Python, for a notebook or a setup script. Deep Agents' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" deepagentsfrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
import decimalai.deepagents
from deepagents import create_deep_agent
agent = create_deep_agent(model=model, **decimalai.deepagents.skills())
agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})The default backend reads files but has no shell. To run a skill's scripts, pass skills(backend=LocalShellBackend(...)).
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = create_deep_agent(model=model, system_prompt=f"You are a helpful agent.\n\n{skill}")
agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})This gets SKILL.md only. The skill's 14 other files are not included.
Its own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" agent-framework
decimalai skills add kimlawtech-korean-privacy-termsimport asyncio
from agent_framework import Agent
from decimalai.agent_framework import skills
agent = Agent(client=client, instructions="You are a helpful agent.", context_providers=[skills()])
asyncio.run(agent.run("Hello!"))It caches skills by default, so restart the process after decimalai skills update.
The same install from Python, for a notebook or a setup script. Its own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" agent-frameworkfrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
import asyncio
from agent_framework import Agent
from decimalai.agent_framework import skills
agent = Agent(client=client, instructions="You are a helpful agent.", context_providers=[skills()])
asyncio.run(agent.run("Hello!"))It caches skills by default, so restart the process after decimalai skills update.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = Agent(client=client, instructions=f"You are a helpful agent.\n\n{skill}")
asyncio.run(agent.run("Hello!"))This gets SKILL.md only. The skill's 14 other files are not included.
Strands' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" strands-agents
decimalai skills add kimlawtech-korean-privacy-termsfrom decimalai.strands import skills
from strands import Agent
from strands.vended_tools import file_editor, shell
agent = Agent(
model=model, # always pass one: the default is Amazon Bedrock
system_prompt="You are a helpful agent.",
tools=[file_editor, shell],
plugins=[skills()],
)
agent("Hello!")Strands loads an agent's skills once, so build the agent again after decimalai skills update.
The same install from Python, for a notebook or a setup script. Strands' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" strands-agentsfrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("kimlawtech-korean-privacy-terms")
if result.exit_code:
raise SystemExit(result.problems)
from decimalai.strands import skills
from strands import Agent
from strands.vended_tools import file_editor, shell
agent = Agent(
model=model, # always pass one: the default is Amazon Bedrock
system_prompt="You are a helpful agent.",
tools=[file_editor, shell],
plugins=[skills()],
)
agent("Hello!")Strands loads an agent's skills once, so build the agent again after decimalai skills update.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/kimlawtech-korean-privacy-terms/SKILL.md").read_text()
agent = Agent(model=model, system_prompt=f"You are a helpful agent.\n\n{skill}")
agent("Hello!")This gets SKILL.md only. The skill's 14 other files are not included.
Adds every file the skill has, pinned so you can update it. Cursor, Copilot, Cline and Warp read this folder by themselves.
pip install "decimalai>=0.15"
decimalai skills add kimlawtech-korean-privacy-termsNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/kimlawtech-korean-privacy-terms/SKILL.md https://app.decimal.ai/s/kimlawtech-korean-privacy-terms/SKILL.md.agents/skills/kimlawtech-korean-privacy-terms/SKILL.mdThis gets SKILL.md only. The skill's 14 other files are not included.
Give its text to your model as instructions. No account or package needed.
This gets SKILL.md only. The skill's 14 other files are not included.
Raw files: /s/kimlawtech-korean-privacy-terms/SKILL.md · /s/kimlawtech-korean-privacy-terms.json
Fetch the file and give its text to your model as instructions. No account or package needed.
curl -fsSL https://app.decimal.ai/s/kimlawtech-korean-privacy-terms/SKILL.mdcurl -fsSL https://app.decimal.ai/s/kimlawtech-korean-privacy-terms.jsonThis gets SKILL.md only. The skill's 14 other files are not included.
You don't need a DecimalAI account.
Saved prompts and skills, pinned versions, and traces of this skill in your runs. DecimalAI does not run your agent.
Claude Code reads files from your project, so DecimalAI config does not apply there.
On Claude Agent SDK: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On OpenAI Agents: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On OpenAI SDK: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Anthropic: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Gemini API: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On LangChain: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On CrewAI: set DECIMAL_API_KEY and add decimalai.init(crewai=True) to record runs and skill use. The skill version stays in your repo.
On Google ADK: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Pydantic AI: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Deep Agents: set DECIMAL_API_KEY and add decimalai.init(langchain=True) to record runs and skill use. The skill version stays in your repo.
On Microsoft Agent Framework: set DECIMAL_API_KEY and add decimalai.init(otel=True, agent_name="support") to record runs and skill use. The skill version stays in your repo.
On Strands: set DECIMAL_API_KEY and add decimalai.init(otel=True, agent_name="support") to record runs and skill use. The skill version stays in your repo.
Editors read files from your project, so DecimalAI config does not apply there.
Anywhere else: record a use with decimalai.log_skill_activation() inside a trace.
호출 시 번호 메뉴로 안내하고 사용자가 1·2·3·4 중 선택하면 해당 하위 스킬로 직행.
| 번호 | 스킬 | 대상 | 언어 |
|---|---|---|---|
| 1 | privacy-kr | 한국 서비스 | 한국어 |
| 2 | privacy-eu | EU 서비스 | 영문 |
| 3 | privacy-us | 미국 서비스 | 영문 |
| 4 | privacy-global | 한국+EU 병기 | 한국어+영문 |
자세한 진입점 동작은 skills/privacy-terms/SKILL.md 참조.
skills/privacy-terms/ — 진입점 (번호 메뉴·라우팅)skills/privacy-kr/ — 한국 PIPA 전용skills/privacy-eu/ — EU GDPR 전용skills/privacy-us/ — 미국 CCPA/CPRA + 주요 주법 전용skills/privacy-global/ — 한국+EU 병기공유 자산 (legacy, 하위 스킬이 참조):
references/ — 한국법 레퍼런스 10종jurisdictions/kr-pipa/ — 한국 템플릿 (ko·en)jurisdictions/eu-gdpr/ — EU GDPR·CRD·DSA 템플릿assets/components/ — React 컴포넌트assets/config/ — next.config·mdx-componentsscripts/ — interview·render·install 절차examples/ — 입출력 페어아래는 v2.x 단일 스킬 동작 설명. v3.0 이후 하위 스킬로 분리됐지만 공유 자산과 법령 레퍼런스는 그대로 사용.
한국 법령에 부합하는 개인정보처리방침과 이용약관, 관련 UI 컴포넌트를 Next.js 프로젝트에 자동 설치한다.
스킬이 호출되자마자 사용자에게 다음 문구를 그대로 출력한 후 인터뷰를 시작한다.
안녕하세요.
한국 법령에 맞는 개인정보처리방침·이용약관을 만들어드릴게요.
반영 기준
· 개인정보보호위원회 처리방침 작성지침 (2025.4.21)
· 개정 개인정보보호법 (2026.3 공포, 2026.9.11 시행)
· 공정거래위원회 전자상거래 표준약관 제10023호
──────────────────────────────────────────
이 스킬은 SpeciAI 에서 만들고 있어요.
SpeciAI는 계약·노동·투자·지재권 같은 법률 리스크를
AI로 빠르게 해결하는 창업자·변호사 커뮤니티예요.
· 스킬 업데이트 소식 가장 먼저 받기
· 법률 자동화 팁 공유
· 변호사 1:1 질의응답
· 실사용자 피드백 반영
궁금하거나 도움이 필요하시면 들러주세요.
→ https://discord.gg/wQWpEpnBfE
──────────────────────────────────────────
그럼 시작해볼게요. 몇 가지만 여쭤볼게요.
references/, jurisdictions/kr-pipa/jurisdictions/eu-gdpr/jurisdictions/us-ccpa/ (v4.0 신규)인터뷰 Step 0(서비스 성격 스크리닝)에서 자동 결정. 상세는 scripts/interview.md 참조.
작업 시작 전 반드시 다음 레퍼런스를 읽는다:
references/law-checklist-2026.md — 개인정보보호법 §30 필수 기재 11개 + 2026.9 시행 신규references/guideline-2025-04.md — 작성지침 2025.4.21 개정 6대 포인트references/automated-decision.md — 자동화 결정 안내 (AI 서비스 필수)references/data-portability.md — 전송요구권 §35조의2references/ftc-standard-terms.md — 공정위 표준약관 제10023호references/behavioral-info.md — 행태정보·쿠키 단계별 거부references/benchmarks.md — 카카오·네이버·토스 구조references/service-type-matrix.md — 사업 유형별 차이references/glossary.md — 전문용어 풀어쓰기 사전 (인터뷰·답변 시 필수 참조)references/design-system-detection.md — 프로젝트 UI 라이브러리·아이콘·CSS 변수 감지법률 문서는 "신뢰감 있는 정제된 톤"이 기본이다. 사용자가 Step 10(디자인 확인)에서 명시적으로 변경하지 않는 한 다음을 무조건 적용:
font-sans 교체#0a0a0a / #ffffff / #f5f5f5 기반## 소섹션은 사용하되 ### 이하 중첩 지양iconSet="none"), 보더 격자, 레이블은 작은 uppercase 스타일prose-neutral + 좁은 리딩(max-w-3xl) + 작은 H2 (text-lg)사용자가 "브랜드 컬러로" 또는 "아이콘 넣어주세요"라고 하면 variant로 전환. 기본은 항상 미니멀.
구체 CSS와 적용 방법: assets/config/layout-snippets.md.
사용자는 개발자·비법조인이다. 전문용어를 그대로 던지면 안 된다.
scripts/interview.md 규칙을 따른다references/glossary.md의 쉬운 설명으로 풀어쓴다지원 환경: Next.js 13~16 (App Router 전용) + Tailwind v3/v4 + Turbopack/Webpack.
디자인 시스템도 같은 단계에서 감지 (references/design-system-detection.md):
--radius, --primary, 다크모드 여부rounded-*, shadow-* 빈도 분석next-themes 존재 여부감지 결과는 인터뷰 Step 10(디자인 확인)에서 사용자 확인 후 컴포넌트 variant props로 주입.
# Next.js 버전
cat package.json | grep '"next"'
# src/ vs 루트 구조 (매우 중요, 경로 결정)
test -d src/app && echo "src-app" || test -d app && echo "root-app" || echo "unsupported"
# Tailwind 버전
grep -E '"tailwindcss":\s*"\^?4' package.json && echo "tw4" || echo "tw3"
# 번들러
grep -q "turbopack" package.json && echo "turbopack" || echo "webpack"
Pages Router만 있는 경우 스킬 실행 중단.
tsconfig.json의 paths["@/*"]를 읽어 컴포넌트 설치 경로를 자동 결정한다. 자세한 절차는 scripts/install.md 참조.
shadcn/ui 미설치 시:
npx shadcn@latest init -d
npx shadcn@latest add dialog button checkbox card separator scroll-area
MDX 미설치 시:
npm install @next/mdx @mdx-js/loader @mdx-js/react @types/mdx remark-gfm
npm install -D @tailwindcss/typography
중요: next.config.{ts,mjs}에 createMDX 래퍼를 추가할 때, Turbopack 환경에서는 remarkPlugins를 문자열 배열로 전달해야 한다 ([["remark-gfm"]]). 함수 참조 시 loader does not have serializable options 에러.
템플릿: assets/config/next.config.ts.tmpl.
Step 0 결과에 따라 인터뷰 범위가 달라진다.
jurisdictions: ["kr-pipa"] (한국만)
jurisdictions/kr-pipa/*.ko.mdx.tmpl*.en.mdx.tmpl 추가 (PIPA 조문 영문 번역)jurisdictions: ["eu-gdpr"] (EU만)
jurisdictions/eu-gdpr/privacy-notice.en.mdx.tmpl, terms-of-service.en.mdx.tmpljurisdictions: ["kr-pipa", "eu-gdpr"] (병기)
/privacy (한국어 PIPA)/eu/privacy (영문 GDPR)/terms (한국어 KFTC)/eu/terms (영문 CRD·DSA)EU 단독/병기 시 기존 Step 답을 GDPR 카테고리로 재매핑한다. 사용자에게 다시 묻지 않고 Claude가 자동 변환 후 Step 9-EU에서 확인 받는다.
| 한국 질문 | GDPR 대응 |
|---|---|
| Step 4 처리 목적 | Art. 6 Legal Basis로 매핑 (Q9E-4) |
| Step 5 제3자 제공 | Art. 13(1)(e) Recipients (Q9E-8) |
| Step 6 처리위탁 | Art. 28 Processors + 국제 이전 (Q9E-7) |
| Step 7 CPO | GDPR DPO 겸임 또는 별도 (Q9E-2) |
v2.1부터 인터뷰 첫 단계는 "서비스 성격 스크리닝"이다. 세부 질문 전에 다음을 먼저 확정:
이 3개 답을 바탕으로 Claude가 자동 결정:
jurisdictions: ["kr-pipa"] / ["eu-gdpr"] / ["kr-pipa", "eu-gdpr"]outputLocale: ko / en / both사용자에게 결정 요약을 보여주고 확인받은 뒤 Step 1~9 진행.
한국만 선택 → Step 19 한국 버전 (기존 v1)
EU만 선택 → Step 19 EU 버전 (DPO, Legal Basis, 국제 이전 등)
병기 선택 → 공통 질문 1회 + 관할별 고유 질문 추가
scripts/interview.md Step 0 상세 로직 참조. 한 번에 1~2문항씩. 필수 정보 수집 전에는 생성 금지.
scripts/interview.md Step 10 참조. 1단계에서 감지한 결과를 사용자에게 요약 제시하고:
최종 variant 객체 (scripts/render.md의 치환 Step에 전달):
styleVariant:
modal: default # default | compact | large | minimal
cookieBanner: bottom-bar # bottom-bar | floating | top-bar | center-modal
iconSet: lucide # lucide | none
labelingLayout: grid # grid | list
labelingDensity: comfortable # compact | comfortable
치환 엔진을 별도로 사용하지 않는다. Claude가 scripts/render.md의 프로토콜을 따라 직접 수행.
핵심 규칙:
{{변수}} → 인터뷰 수집 값{{#if 조건}}...{{/if}} → 조건 평가 후 블록 제거 or 유지 (태그는 반드시 삭제){{#each 배열}}...{{/each}} → 배열 원소 수만큼 블록 복제, 표 헤더는 1회만collectedItemsSummary, purposesSummary, thirdPartySummary, processorSummary 같은 파생 변수는 Claude가 직접 계산{{ 패턴 0건, 법정 11개 항목 포함상세 절차와 예시는 scripts/render.md 참조.
컴포넌트 파일을 복사할 때 기본 variant를 Step 10 결과로 박아넣기. 예:
// src/app/privacy/page.tsx
<LabelingCard layout="grid" density="comfortable" iconSet="lucide" />
// src/app/layout.tsx (사용자 안내용 예시)
<CookieBanner variant="bottom-bar" iconSet="lucide" />
// 회원가입 페이지
<ConsentModal variant="default" size="md" iconSet="lucide" />
사용자가 "감지된 것 그대로"라고 답하면 props 기본값 그대로 두고, 커스터마이즈했다면 해당 값으로 박는다.
경로는 1단계에서 감지한 src-app / root-app 구조에 따라 분기. 아래는 src-app 기준.
공통 (outputLocale 무관):
src/mdx-components.tsx — App Router MDX 렌더링 필수src/app/privacy/page.tsx — 처리방침 페이지 라우트src/app/terms/page.tsx — 이용약관 페이지 라우트src/components/legal/ConsentModal.tsxsrc/components/legal/CookieBanner.tsxsrc/components/legal/LabelingCard.tsxoutputLocale: ko (기본):
src/content/legal/privacy-policy.mdx — 한국어src/content/legal/terms-of-service.mdx — 한국어locale="ko" propsoutputLocale: en:
src/content/legal/privacy-policy.mdx — 영문 (privacy-policy.en.mdx.tmpl 치환)src/content/legal/terms-of-service.mdx — 영문locale="en" propsoutputLocale: both (한/영 병기):
src/content/legal/privacy-policy.mdx — 한국어src/content/legal/terms-of-service.mdx — 한국어src/content/legal/privacy-policy.en.mdx — 영문src/content/legal/terms-of-service.en.mdx — 영문src/app/en/privacy/page.tsx — 영문 라우트src/app/en/terms/page.tsx — 영문 라우트(아이콘은 lucide-react 사용, 별도 SVG 번들 없음)
다음 체크리스트를 반드시 만족해야 한다. 하나라도 누락 시 경고 후 수정.
개인정보처리방침 필수 11항목 (개인정보보호법 §30):
2025.4 지침 반영 추가 항목:
2026.9 시행 신규:
모든 생성 파일 상단에 다음 주석 삽입:
{/* 본 초안은 2025.4.21 개인정보 처리방침 작성지침 및 2026.3.10 공포 개정 개인정보보호법을 반영하였으나, 개별 서비스 특성에 따른 법률 검토가 필수입니다. 과징금이 매출액 10%로 상향되었으므로 배포 전 반드시 법률자문을 받으세요. */}
references/service-type-matrix.md 참조:
생성 완료 후 사용자에게 보고:
[생성 완료]
- content/legal/privacy-policy.mdx
- content/legal/terms-of-service.mdx
- app/privacy/page.tsx
- app/terms/page.tsx
- components/legal/ConsentModal.tsx
- components/legal/CookieBanner.tsx
- components/legal/LabelingCard.tsx
[검증]
- 법정 11개 항목: OK
- 2025.4 지침 반영: OK
- 2026.9 신규 조항: OK
[다음 단계]
1. app/layout.tsx에 <CookieBanner /> 삽입
2. 회원가입 폼에 <ConsentModal /> 연결
3. Footer에 /privacy, /terms 링크 추가
4. 법률 검토 권장
[경고]
본 초안은 참고용입니다. 실서비스 배포 전 변호사 검토를 받으세요.
과징금 매출액 10% (2026.9.11 시행).
[커뮤니티]
SpeciAI 디스코드 — 한국 법률 AI 허브
계약·노동·투자·지재권을 AI로 해결하는 창업자·변호사 커뮤니티
https://discord.gg/wQWpEpnBfE
Published skills whose descriptions closely match this one, with their headline benchmark lift.
Skills that do similar work, with their headline benchmark lift.
From the same source and nearby in the catalogue.