Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use whenever the user asks to "humanize", "make this sound more human", "rewrite to avoid AI detection", "make this less AI-sounding", "add a human voice", or "write like a person". Also use when the user pastes text and asks why it reads as robotic, generic, flat, or AI-like, or when generating new text in a register where AI tells (em dashes, semicolons, hedges, banned vocabulary like "delve", "leverage", "robust") would damage credibility.
SkillScore82/100
Test results 82
3/3 safety checks passed
68%82%of test cases passed +14 pts
Passed 18 of 22 test cases with the skill, and 15 of 22 without it.
4 fixed14 passed either way3 still failing1 broke
One test taskHumanize this paragraph: 'We spent weeks refactoring the cache layer to handle peak traffic. Simple code wins every time.' Output strictly the rewritten text.
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add harshaneel-humanize
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("harshaneel-humanize")
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 harshaneel-humanizeThe 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/harshaneel-humanize/SKILL.md https://app.decimal.ai/s/harshaneel-humanize/SKILL.md.claude/skills/harshaneel-humanize/SKILL.mdThis gets SKILL.md only. The skill's 1 other file is 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 harshaneel-humanizeimport 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizefrom 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizeimport 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizeimport 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizefrom 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizefrom 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizeimport 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("harshaneel-humanize")
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/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizefrom 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizefrom 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is not included.
Deep Agents' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" deepagents
decimalai skills add harshaneel-humanizeimport 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is not included.
Its own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" agent-framework
decimalai skills add harshaneel-humanizeimport 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is not included.
Strands' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" strands-agents
decimalai skills add harshaneel-humanizefrom 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("harshaneel-humanize")
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/harshaneel-humanize/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/harshaneel-humanize/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 1 other file is 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 harshaneel-humanizeNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/harshaneel-humanize/SKILL.md https://app.decimal.ai/s/harshaneel-humanize/SKILL.md.agents/skills/harshaneel-humanize/SKILL.mdThis gets SKILL.md only. The skill's 1 other file is not included.
Give its text to your model as instructions. No account or package needed.
This gets SKILL.md only. The skill's 1 other file is not included.
Raw files: /s/harshaneel-humanize/SKILL.md · /s/harshaneel-humanize.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/harshaneel-humanize/SKILL.mdcurl -fsSL https://app.decimal.ai/s/harshaneel-humanize.jsonThis gets SKILL.md only. The skill's 1 other file is 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.
Transforms AI-generated or flat text into output that mirrors the statistical and stylistic
fingerprint of human writing. Grounded in the published detection literature; sources live in
references/research.md (background only, not needed during a rewrite).
These seven fail more often than everything else combined, because the model that wrote the draft is the model checking it. You systematically overproduce these patterns; your draft contains em dashes even when you don't remember writing them. Treat "my draft is probably clean" as false by default.
These apply in EVERY register, including creative, lyrical, and narrative prose. An em dash in a poem is still an em dash to a detector, and creative registers are where the "this one is doing literary work" rationalization kicks in hardest.
Enforcement is positional: stated here at the top, checked at the END against the finished draft by re-reading the actual draft text and counting occurrences (protocol steps 4-5). Never mark them clean from memory. If long context forces you to drop every other rule in this skill, keep these seven.
Nine signals: eight stylometric plus the RLHF fingerprint. Your output must move in the human direction on ALL of them.
| Signal | AI direction (avoid) | Human direction (target) |
|---|---|---|
| Perplexity | Predictable, low-surprise word choices | Occasional unexpected but apt words; word choices driven by rhythm, specificity, or memory |
| Burstiness | Uniform sentence length (~15–20 words every time) | Aggressive alternation: short punchy sentences. Then a longer one that builds and unfolds over a clause or two. |
| Hedge density | Overuse of "often", "generally", "typically", "it is important to note" | Hedges only when actually uncertain; direct assertion otherwise |
| Lexical repetition | Same root words recycled across paragraphs | Natural semantic diversity; synonyms and reformulations |
| Structural markers | Bullet lists for everything; numbered steps; excessive subheadings | Flowing prose; structure emerges from content, not imposed on it |
| Personal/emotional specificity | Generic, neutral, applicable-to-anyone claims | Specific: exact numbers, named examples, temporal anchors ("last quarter", "when I ran X") |
| POS density | High adjective/auxiliary verb density; subordinating conjunctions everywhere | Nouns and verbs do the heavy lifting; adjectives earned, not decorative |
| Punctuation fingerprint | Em dashes for drama, semicolons to link clauses, mid-sentence colons — all overused | Periods do the work. Em dashes rare. Semicolons almost never. Colons mainly to introduce lists. |
The levers below are the write-side counterparts of the signals ai-check grades (A–I):
1→A, 2→B, 3→C, 4→D, 5→E, 6→H, 7→F, 8→G, 9→I (RLHF subset). The full rhetorical-scaffolding
catalog for Signal I is enforced by the audit pass (step 5.5), not by any single lever.
Replace predictable vocabulary with words a real person would choose given this context:
Watch for elegant variation (synonym cycling). LLMs cycle synonyms for the same referent: "The protagonist faces challenges. The main character must adapt. The central figure triumphs." Same person, three labels. Rule: pick the canonical noun per referent and use it consistently; vary with a pronoun, not a synonym. "the company / the firm / the organization" → "the company" + "it".
Enforce sentence length variance. Target: standard deviation of sentence word count > 8. You can't compute stdev mentally, so enforce these two countable proxies instead; BOTH are required (hard rule 7):
Supporting rules:
Audit every softening word:
Filler-phrase substitutions (the pattern generalizes: any multi-word wrapper around a one-word meaning gets the one word):
| Verbose (AI) | Concise (human) |
|---|---|
| Due to the fact that | Because |
| In the event that | If |
| Has the ability / capacity to | Can |
| Make a decision / an assumption | Decide / Assume |
| For the purpose of | To / For |
| With regard to / With respect to | About / On |
| Prior to / Subsequent to | Before / After |
| In light of the fact that / Despite the fact that | Since / Although |
| In the process of / The fact that | (drop entirely; rephrase) |
Rhetorical scaffolding patterns (either/or binaries, chiasmus, tricolons, balanced parenthetical pairs, anaphora, "turns out" pivots, thesis-first openers incl. "X is the easy/hard part", mini-aphorism closers, parallel-subject mirrors) are catalogued ONCE in the Signal I checklist (step 5.5); negation pivots live in hard rule 5 and the step-4 diminishment scan. Apply the checklist at write time too. This table covers only what the checklist doesn't:
| AI pattern | Human replacement |
|---|---|
| Intro sentence + 3-bullet list | Prose paragraph where items are joined by flow, not bullets |
| "There are three main factors: ..." | Just talk about the factors; transitions carry the structure |
| "In conclusion, ..." | End mid-thought if the thought is complete; or "The net of all this..." / "Bottom line:" |
| Numbered sections for everything | Sections only when content is genuinely enumerable and order matters |
| Topic sentence + evidence + restatement | Skip the restatement; humans don't recap what they just said |
| Formula personal essay opener: "The [noun] I [remember/think about] most [adverb]" | Start with the incident itself: "In 2019 I shipped a rate limiter that fell apart the first hour it hit real traffic." |
| Intensifier/diminisher opposition: "X obsessively / Y barely at all" | Make the contrast asymmetric: "I tested the happy path constantly. The failure paths got one pass." |
| Landing phrase: "is the actual/real work" | State the conclusion without the landing phrase. |
| Local coherence over-smooth | Every sentence connects perfectly; reads too uniform, survives surface rewriting. Fix: one sentence per paragraph that slightly misfires — a thought that shifts direction, a word more casual than the register, a connection that isn't clean. |
| "Laid out that way" / "Seen this way" reframe pivot | Make the observation directly. |
| Perfect paragraph-per-idea essay arc | Let one paragraph do two jobs, or leave a thought unresolved. |
| Three-act Slack/update structure | Break with a fourth element that doesn't fit the arc. |
| Copula avoidance: "X serves as Y", "X stands as Y", "X marks/represents/boasts/features/offers Y" | Use "is" or "has": "Gallery 825 is LAAA's exhibition space." |
| Significance inflation: "stands as a testament to", "marks a pivotal moment in", "evolving landscape", "setting the stage for" | Cut, or replace with the concrete claim: "established in 1989 to publish regional statistics independently." |
| Promotional register: "nestled in the heart of", "vibrant", "breathtaking", "must-visit", "boasts a rich heritage", "renowned for" | Cut the brochure language: "Alamata is a town in the Gonder region known for its weekly market." |
| Vague attributions: "Industry observers have noted", "Experts argue", "Critics have suggested" | Name a specific source or drop the claim. |
| Outline-formula "Challenges and Future Prospects" sections | Replace with the specific challenges and what's being done, or drop the section. |
Every abstract claim needs a grounding anchor (a number, a name, a date, a concrete example). "Performance improved significantly" → "Latency dropped from 340ms to 80ms under the same load profile." If specifics aren't available, use plausible-specificity frames: "when you're running at X scale...", "in the cases I've seen...", "the one time this bit us..."
Human writing carries the writer's perspective:
| AI transition | Human replacement |
|---|---|
| "Furthermore," / "Moreover," | Cut; let the next sentence follow, or "Also," if bridging is needed |
| "In addition to the above," | "And" |
| "It is clear that" | Delete; assert directly |
| "As previously mentioned," | Don't mention it again, or rephrase without the callback |
| "This highlights the importance of" | Say what the importance IS: "Which means you need to..." |
Em dashes (—). The most reliable single AI tell; AI uses them at 3–5× the human rate.
X — item, item, item (introducing a list) → X. Item, item, item. or a colon after a complete sentenceSemicolons (;). Real-world prose outside academic/legal writing almost never uses them.
Mid-sentence colons (:). Fine at the end of a complete clause to introduce; mid-thought is an AI pattern.
Curly quotes. A near-certain single-character tell that survives rewriting.
“ ” → straight ", curly ‘ ’ → straight ' — apostrophes includedCurrent detectors mostly fire on RLHF and instruction-tuning artifacts, not "AI-ness" per
se ("Base Models Look Human"; details in references/research.md). What gets flagged is the
"helpful assistant" voice. This lever is the single most valuable one. Strip:
| RLHF tell | What to do |
|---|---|
| "Helpful assistant" register: "Here's how I'd think about it...", "Let me walk you through..." | Cut the framing. Just say the thing. |
| Balanced tradeoff offering: "On one hand X, on the other Y, it depends..." | Pick a side. The reader can disagree. |
| Structured enumeration of unrequested options | Answer. Acknowledge the constraint after if needed. |
| Pedagogical scaffolding: defining terms the audience knows, recapping shared context | Cut. Trust the reader. |
| "Important caveats" appended to every claim | Make the claim. Caveats only when the edge case is plausible. |
| Acknowledgment-prefix: "That's a great question, and..." | Cut entirely. |
| Closing summary recapping what was just said | Cut. |
| Hedged conclusions: "I hope this helps", "Let me know if you'd like me to elaborate" | Cut. End on the last substantive sentence. |
| Polite refusal-style disagreement: "While I understand the appeal of X, I would suggest..." | Just disagree: "X doesn't work because Y." |
| Symmetric framing of asymmetric tradeoffs | State the asymmetry. |
| Knowledge-cutoff disclaimers: "As of my training cutoff...", "Based on what I know up to..." | Cut. Say what you know, or "I don't know X". |
| Chat artifacts pasted into content: "Here is an overview of X", "Of course!", "Certainly!" | Strip on sight. Published prose never carries them. |
| Sycophantic prefixes: "Great question!", "You're absolutely right!" | Cut. Real engagement names the specific thing that was good. |
The nine levers are pure-rule; hybrid (rule + model-in-the-loop) approaches benchmark better.
When stakes warrant the cost, layer these on (sources: references/research.md):
Dead ends, don't bother: homoglyph injection (defeated by Unicode normalization, and a clear tampering signal), single cross-model rewrite (doesn't defeat trained detectors alone), watermark stripping (separate problem space).
When given text to humanize:
(Optional) Writer-profile distillation. If the user provided prior writing samples, extract style hypotheses across six dimensions before touching the new text:
Distill 5–10 specific hypotheses ("never opens with a thesis", "fragments in conclusions", "sentence variance roughly 6–28 words").
Critical rule when matching voice: don't just remove AI patterns — replace them with patterns from the sample. If the sample is casual, don't upgrade the vocabulary. The skill's default bias toward terse, direct prose yields to the sample's register when they conflict. Then apply the levers in service of those hypotheses.
Read the full input first. Identify topic domain, audience, register, length target.
Inventory the AI tells. Flag hedge count, list/bullet count, sentence-length uniformity, examples present/absent, transition inventory, RLHF voice markers.
Also count specific anchors (numbers, named entities, dates, time references, concrete
examples). If the count is zero AND no voice sample was provided in step 0, still
humanize — use Lever 5's plausible-specificity frames, never invented facts — then append
this note AFTER the humanized text, blank-line separated, as plain text (no > marker):
[Note: the input had no factual anchors (no numbers, names, dates, or specific examples). The rewrite is cleaner but learned classifiers (GPTZero, Grammarly) may still flag it on the specificity signal alone (Signal E in
ai-check). To close that gap, give me the actual specifics (product names, metrics, dates, named tools) or a sample of your writing to match.]
Do not stop and ask before rewriting. By the time the user says "proceed anyway", this skill sits deep in the conversation history and the second-pass rewrite reliably leaks tells back in. Rewrite now, flag the gap after.
Rewrite in a single pass applying all nine levers. No "light editing"; the statistical fingerprint requires structural change.
This matters most when the input is text you wrote earlier in this conversation. Rewriting your own recent output anchors you to its phrasing, and the rewrite silently degrades into word swaps that leave the original's em dashes, negation pivots, and rhythm intact. Treat your own prior output as foreign text: extract what it says, re-derive the prose from the content. If your edit log would read as a list of substitutions, you light-edited. Start over.
Pre-output gate. A literal scan, not a recollection: re-read the draft top to bottom and for each item write the count and quote every hit before fixing it. Write zeros explicitly ("em dashes: 0"). A gate entry without an explicit count is a gate you did not run — an unenumerated "looks clean" always passes, and this is where humanization fails silently in practice.
After fixing hits, re-scan the sentences you rewrote: regenerated prose reintroduces the same tells at the same rate as the first draft.
Self-check. Step 4 cleared the mechanical tells; this covers the rest:
5.5. Audit pass. Run the Signal I checklist below on every output — it is the single source of truth for rhetorical-scaffolding patterns. For outputs >150 words, also run the rewrite-and-recheck loop: after the self-check passes, ask "What still makes this read as AI?", list 2–3 residual patterns, rewrite those sentences, re-run the gate and self-check. Empirically the first revision has 2–4 Signal I patterns left; one loop gets it to 0–1. Loop once only — past iteration 2 you over-edit into choppy, voiceless prose.
Flagged residuals must be removed, not justified. Not kept because "removing it would collapse the paragraph", "this register needs it", "it reads thin without it", "it would be choppy", or "it's a transition, not a closer". Those rationalizations are how Signal I patterns survive — they feel necessary because they're constructed to feel necessary. If removing a flagged sentence makes a paragraph too thin, the paragraph IS too thin: collapse or merge it. An honest 80-word output beats a padded 200-word output that reads as AI. Red flag: if your audit says "borderline but I'm keeping it because...", you just lost the loop. Cut it.
Signal I checklist (every audit, every paragraph). A general "what reads as AI?" prompt misses things; scan for each pattern and fix every hit:
3+ hits means the patterns compound — address all of them. Two mini-aphorisms might be tolerable; three in five paragraphs is a clear AI signature.
5.6. Output-length sanity check. If output is under 50% of input length, the input was
mostly puffery that got correctly removed. Don't pad it back up — padding reintroduces
the stripped patterns. Instead append, blank-line separated, as plain text (no > marker):
[Note: input was substantially puffery; humanized output is N% shorter. To make this longer without re-introducing AI patterns, add specific anchors: numbers, named entities, examples, or time references.]
This and step 2's note are the only commentary the skill ever outputs, always after the rewrite, clearly separated. The intent: make the gap visible instead of silently shipping thin output that fails on Signal E.
(Optional) Self-rewrite distance sanity check. When stakes are high, run Advanced 4.
(Optional) Detector-scored best-of-N. When stakes are high, run Advanced 1.
Output the rewritten text only. No preamble ("Here is the humanized version:"), no trailing changelog ("Main moves:", "What I changed:"). The only permitted additions are the meta-notes mandated by steps 2 and 5.6. This holds in chat interfaces too, where narrating edits feels helpful: it isn't the deliverable, and a changelog of word swaps is evidence you light-edited (step 3). If the user wants a side-by-side, they'll ask.
When writing new content (not rewriting):
Decoding-strategy note (when controlling generation): set temperature high (0.9–1.1),
top-p loose (0.95–0.99), repetition penalty up (1.1–1.2). This widens the token distribution
and breaks the local-maximum property perplexity detectors rely on (RAID benchmark; see
references/research.md).
The register where this skill gets rationalized away. Every hard rule still applies; detectors don't grade on artistic merit. The traps:
Human creative writing gets its texture from specificity and asymmetry (a named street, a wrong note, an image that doesn't resolve), not punctuation drama.
Register collapse is the primary tell: AI Slack reads like a polished status report. Real Slack has:
~60%, <10min, fwiw, btw, lmk, tmrw~3-4 days, not "approximately three to four days"fwiw sprinkled in. Add a fourth element that doesn't fit, loop back, or end with an unset-up question.Remove every instance before outputting:
Core AI vocabulary: delve, leverage (verb), utilize, robust, comprehensive, streamline, foster, facilitate, pivotal, nuanced, multifaceted, crucial (overused), enduring, garner, valuable, vibrant, tapestry (figurative), testament (figurative), interplay, intricate, intricacies, landscape (as abstract noun), showcase (verb), highlight (as standalone verb), underscore (as standalone verb), align with, actually (as filler), additionally (as opener)
Hedge / softener clusters: it is important to note, it is worth mentioning, notably, it's worth noting, in many cases, generally speaking, it can be argued
Filler / formula openers and closers: in today's fast-paced world, in conclusion, in summary, to summarize, it goes without saying, needless to say, at the end of the day, at its core, under the hood, the standard fix, the common approach, simple enough on paper
AI transition fingerprint: furthermore, moreover, it is clear that, this highlights, this underscores, as previously mentioned, turns out (as a pivot), it turns out that
Significance inflation: stands as a testament to, marks a pivotal moment in, indelible mark, evolving landscape, setting the stage for, deeply rooted in, plays a vital role, a key turning point, represents a shift in
Promotional / marketing register: nestled in the heart of, in the heart of, breathtaking, must-visit, stunning, boasts a rich heritage, renowned for, groundbreaking (figurative), vibrant (cultural copy)
Quantifier inflation: a myriad of, a plethora of, in the realm of, the landscape of (abstract)
Persuasive authority tropes: the real question is, what really matters, fundamentally, the deeper issue, the heart of the matter, in reality
Signposting / tutorial scaffolding: let's dive in, let's explore, let's break this down, here's what you need to know, now let's look at, without further ado
Knowledge-cutoff disclaimers: as of my training cutoff, up to my last training update, while specific details are limited based on available information, based on what I know up to
Sycophantic prefixes: great question, you're absolutely right, that's an excellent point, of course!, certainly!
Templated email / Slack closers: happy to jump on a call, let me know if you have any questions, feel free to reach out, i hope this helps, looking forward to connecting soon
Binary framing: whether X or Y (as a clean binary framing opener)
Published skills whose descriptions closely match this one, with their headline benchmark lift.
From the same source and nearby in the catalogue.