
Change Management
- 92 installs
- 451 repo stars
- Updated July 21, 2026
- borghei/claude-skills
change-management is a skill that provides an ADKAR-based framework for rolling out organizational changes with communication templates and resistance playbooks.
About
This skill is a framework for rolling out organizational changes with minimal disruption. It uses a startup-adapted ADKAR model, communication templates, a resistance-response matrix, and change-fatigue management, plus playbooks for process changes, reorgs, strategy pivots, and culture changes. Leaders use it when announcing a reorg, switching tools, or pivoting strategy.
- Provides the ADKAR model adapted for startups to roll out organizational change
- Includes a resistance diagnostic matrix mapping pushback patterns to responses
- Ships playbooks for process changes, reorgs, strategy pivots, and culture changes
Change Management by the numbers
- 92 all-time installs (skills.sh)
- Ranked #1,400 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
change-management capabilities & compatibility
- Capabilities
- change planning · resistance management · adoption measurement
- Use cases
- planning · project management
- Pricing
- Free
What change-management says it does
Most changes fail at implementation, not design.
Covers the ADKAR model adapted for startups, communication templates, resistance patterns and responses, change fatigue management
Core Model: ADKAR (Startup-Adapted)
npx skills add https://github.com/borghei/claude-skills --skill change-managementAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 92 |
|---|---|
| repo stars | ★ 451 |
| Last updated | July 21, 2026 |
| Repository | borghei/claude-skills ↗ |
What it does
Plan and communicate an organizational change rollout using ADKAR and resistance-management playbooks.
Who is it for?
Leaders announcing reorgs, tool migrations, strategy pivots, or culture changes.
Skip if: Technical code migrations or software version control changes.
When should I use this skill?
You are announcing a reorg, switching tools, pivoting strategy, or managing change resistance.
What you get
A change rollout plan mapped to ADKAR phases with communication and resistance responses.
- change rollout plan
- communication templates
- resistance response plan
By the numbers
- 5-phase ADKAR model
- 4 change-type playbooks
- 7-row resistance diagnostic matrix
Files
Change Management Playbook
Most changes fail at implementation, not design. This skill provides the complete framework for rolling out organizational changes -- from process tweaks to full strategic pivots -- with minimal disruption and maximum adoption.
Keywords
change management, ADKAR, organizational change, reorg, process change, tool migration, strategy pivot, change resistance, change fatigue, change communication, stakeholder management, adoption, compliance, change rollout, transition
---
Change Type Selection
START: Change is needed
|
v
[What type of change?]
|
+-- Process Change (new tools, workflows)
| Timeline: 4-8 weeks
| Hardest phase: Ability
| See: Process Change Playbook
|
+-- Org Change (reorg, new leader, team restructure)
| Timeline: 3-6 months
| Hardest phase: Desire
| See: Org Change Playbook
|
+-- Strategy Pivot (new direction, killed products)
| Timeline: 3-12 months
| Hardest phase: Awareness
| See: Strategy Pivot Playbook
|
+-- Culture Change (values refresh, behavior expectations)
Timeline: 12-24 months
Hardest phase: Reinforcement
See: Culture Change Playbook---
Core Model: ADKAR (Startup-Adapted)
Overview
| Phase | What It Is | Failure Symptom |
|---|---|---|
| Awareness | People understand WHY the change is happening | "Nobody told me why" |
| Desire | People want to participate (or at least don't resist) | "I understand but I don't agree" |
| Knowledge | People know HOW to do things the new way | "I want to but I don't know how" |
| Ability | People have time, tools, and support to change | "I know how but I can't do it yet" |
| Reinforcement | The change sticks as the new default | "We tried but went back to the old way" |
ADKAR Diagnostic
When a change is struggling, identify which phase is broken:
| Symptom | Broken Phase | Fix |
|---|---|---|
| "Why are we doing this?" | Awareness | Re-communicate the WHY with data |
| "This is a bad idea" | Desire | Address concerns, involve in HOW |
| "I don't know how to do this" | Knowledge | Training, documentation, office hours |
| "I keep reverting to old habits" | Ability | Practice time, reduce workload, support |
| "We started but stopped" | Reinforcement | Measurement, recognition, remove old way |
ADKAR Implementation Timeline
| Week | Phase | Key Activities |
|---|---|---|
| -4 | Awareness prep | Identify stakeholders, draft communication |
| -2 | Awareness launch | CEO/leader video explaining WHY |
| -1 | Desire building | Concerns session, address fears, involve in HOW |
| 0 | Knowledge + Go-live | Training, documentation, launch |
| 1-2 | Ability support | Office hours, help desk, reduced load |
| 3-4 | Ability + early Reinforcement | Adoption check, public wins, feedback |
| 6-8 | Full Reinforcement | Old way deprecated, adoption measured, recognized |
---
Resistance Patterns and Responses
Resistance Diagnostic Matrix
| Pattern | What They Say | What It Signals | Response |
|---|---|---|---|
| Vocal opposition | "This won't work" | Awareness or credibility gap | Present evidence, acknowledge concern |
| Timing challenge | "Why now?" | Awareness gap | Explain urgency and cost of delay |
| Process complaint | "I wasn't consulted" | Desire gap | Acknowledge, involve in the HOW now |
| Capacity excuse | "I don't have time" | Ability gap | Reduce load or extend timeline |
| Historical reference | "We tried this before" | Trust gap | Name what is different this time |
| Silent non-compliance | [No verbal pushback, just doesn't change] | Could be any phase | 1:1 conversation to diagnose |
| Malicious compliance | [Does it technically but undermines] | Deep desire gap | Direct conversation about real concern |
Resistance Response Decision Tree
START: Resistance detected
|
v
[Is it vocal or silent?]
|
+-- VOCAL --> Good. They care enough to push back.
| |
| v
| [Is the concern valid?]
| |
| +-- YES --> Modify the change. Resistance is information.
| +-- NO --> Address with data and empathy. Do not dismiss.
|
+-- SILENT --> Dangerous. Could be any ADKAR phase.
|
v
[1:1 conversation with specific questions]
"What concerns you about this change?"
"What would need to be true for this to work for you?"
"What support would help?"The Worst Response to Resistance
"Some people are just resistant to change."
This treats resistance as a personality flaw rather than a signal. Every resistance pattern is information about which ADKAR phase is broken. Diagnose before responding.
---
Change Communication Framework
Communication Sequencing
| Audience | Order | Channel | Content |
|---|---|---|---|
| Leadership team | 1st | In-person/video meeting | Full context + their role in rollout |
| Directly affected employees | 2nd | Manager 1:1 or small group | Personal impact + support available |
| All employees | 3rd | All-hands or written + Q&A | WHY + WHAT + timeline + FAQ |
| External stakeholders | 4th (if applicable) | Appropriate channel | Need-to-know only |
Communication Template (CEO/Leader Announcement)
Structure:
1. What is changing (1-2 sentences, direct)
2. Why it is changing (the business reason -- honest)
3. What this means for you (practical impact)
4. What is NOT changing (stability anchor)
5. Timeline (specific dates)
6. How to ask questions (channel, person, office hours)
7. What happens next (first concrete step)Communication Cadence by Change Type
| Change Type | Pre-announcement | Launch Day | Week 1 | Month 1 | Month 3 |
|---|---|---|---|---|---|
| Process | Heads-up to leads | All-hands email | FAQ published | Adoption check | Old way removed |
| Org | 1:1s with affected | Synchronous meeting | FAQ + manager 1:1s | Retro | Health check |
| Strategy | Leadership alignment | All-hands with Q&A | Team-level "what does this mean" | Resource proof | First milestone |
| Culture | Input gathering | Story-based announcement | Behavior anchors | Reviews reflect it | Ongoing |
---
Change Fatigue
Fatigue Detection
| Signal | Severity | Response |
|---|---|---|
| Eye-rolls during announcements | Early | Acknowledge the pace, show results of previous changes |
| Low attendance at change sessions | Moderate | Make attendance optional but results visible |
| Fast paper compliance, slow real adoption | Significant | Pause non-critical changes |
| "Here we go again" comments | Significant | Audit change inventory, communicate stability |
| Complete disengagement | Critical | Freeze changes, rebuild trust |
Fatigue Prevention Rules
| Rule | Implementation |
|---|---|
| Finish what you start | Do not launch new change while previous is absorbing |
| One major change at a time | Space 2-3 months between significant changes |
| Announce stability | Explicitly state what is NOT changing |
| Show results | Publish what previous change achieved before launching next |
| Change budget | Treat organizational attention as a finite resource |
Change Inventory
Before launching any new change, inventory all active changes:
| Change | Phase | Start Date | Absorption % | Can It Pause? |
|---|---|---|---|---|
| New CRM rollout | Ability | 2 weeks ago | 60% | No |
| Engineering reorg | Desire | 1 month ago | 40% | Yes |
| Values refresh | Reinforcement | 3 months ago | 75% | No |
Rule: If 3+ changes are active and < 70% absorbed, do not add another.
---
Playbook 1: Process Change
Timeline: 4-8 weeks | Hardest Phase: Ability
| Week | Activity | Owner |
|---|---|---|
| -2 | Announce WHY + go-live date | Change sponsor |
| -1 | Training sessions available | Change team |
| 0 | Go-live + support person available | Change team |
| 2 | Adoption check: who is using it, who is not | Change team |
| 4 | Feedback collection + public wins | Change sponsor |
| 8 | Old system deprecated | IT + Change team |
---
Playbook 2: Org Change
Timeline: 3-6 months | Hardest Phase: Desire
| Timing | Activity | Owner |
|---|---|---|
| Day 0 | Announce with WHY -- synchronous, in-person preferred | CEO/leader |
| Day 1 | 1:1s with most affected by their manager | Managers |
| Week 1 | FAQ published with honest answers | HR + Change team |
| Week 2-4 | New structure operating (do not delay) | All leaders |
| Month 2 | First retrospective | Change team |
| Month 3-6 | Regular health check-ins | HR |
What to say about a leader departure: Be honest about what you can share. Never say "we can't share the reasons" without offering what you CAN say about what it means for the team.
---
Playbook 3: Strategy Pivot
Timeline: 3-12 months | Hardest Phase: Awareness
| Timing | Activity | Owner |
|---|---|---|
| Pre-announcement | Leadership alignment (everyone must be on same page) | CEO |
| Day 0 | Internal announcement first (employees BEFORE press) | CEO |
| Week 1 | Team-level "what does this mean for us" conversations | Team leads |
| Week 2 | Resource reallocation announced | CFO + COO |
| Month 1 | First milestone of new direction visible | Relevant leader |
| Ongoing | Regular updates on new direction progress | CEO |
What kills pivots: Announcing a new direction while still funding the old one at the same level. Move the resources or the pivot is not real.
---
Playbook 4: Culture Change
Timeline: 12-24 months | Hardest Phase: Reinforcement
| Phase | Activity | Timeline |
|---|---|---|
| Input | Involve representative sample in defining the change | Month 1-2 |
| Announce | Story-based announcement with observed behaviors | Month 2 |
| Anchor | Define observable behaviors for each culture change | Month 2-3 |
| Model | Leadership team visibly models new behavior first | Month 3+ |
| Integrate | New behaviors appear in performance reviews | Next review cycle |
| Celebrate | Publicly recognize new behavior when observed | Ongoing |
---
Adoption Measurement
Adoption vs. Compliance
| Dimension | Compliance | Adoption |
|---|---|---|
| Behavior | Does it when watched | Does it because it is better |
| Duration | Reverts when enforcement relaxes | Sustained without enforcement |
| Attitude | Reluctant | Willing or enthusiastic |
| Source | External pressure | Internal belief |
Only reinforcement creates adoption. Compliance is the result of enforcement. Aim for adoption.
Adoption Metrics
| Metric | How to Measure | Target |
|---|---|---|
| Usage rate | % of people actively using new process/tool | > 80% by week 8 |
| Reversion rate | % reverting to old way | < 10% |
| Satisfaction | Survey: "Is the new way better?" | > 60% agree |
| Speed | Time to complete task old way vs. new way | New way faster by week 4 |
| Support requests | Volume of help requests | Declining week over week |
---
Red Flags
- Change announced on Friday afternoon -- people stew over the weekend
- "This is final, questions are not welcome" framing -- creates underground resistance
- No published FAQ or way to ask questions safely -- concerns go unaddressed
- Old system still running 6 weeks after go-live -- change is not real
- Leaders exempt from the change they are asking everyone to make -- destroys credibility
- No measurement of adoption -- assuming go-live equals success
- Multiple major changes running simultaneously -- change fatigue guaranteed
- No post-change retrospective -- missing the feedback loop
- Change announced without a named owner -- nobody is accountable for success
---
Integration with C-Suite
| When... | Change Management Works With... | To... |
|---|---|---|
| Process change | COO (coo-advisor) | Design new process before announcing |
| Org restructure | CHRO + CEO | People impact assessment, communication |
| Strategy pivot | CEO (ceo-advisor) | Alignment and narrative |
| Culture change | Culture Architect (culture-architect) | Values-to-behaviors translation |
| Tool migration | CTO (cto-advisor) | Technical rollout plan |
| Operating system change | Company OS (company-os) | New rhythms and cadences |
| Alignment after change | Strategic Alignment (strategic-alignment) | Verify cascade post-change |
---
Output Artifacts
| Request | Deliverable |
|---|---|
| "Plan a change rollout" | ADKAR-based change plan with timeline and owners |
| "We're doing a reorg" | Org change playbook with communication plan |
| "Manage resistance to [change]" | Resistance diagnosis + targeted responses |
| "Are we in change fatigue?" | Change inventory + fatigue assessment + recommendations |
| "Communication plan for [change]" | Sequenced communication with templates |
| "Measure adoption of [change]" | Adoption metrics dashboard with targets |
---
Tool Reference
change_readiness_assessor.py
Assesses organizational readiness using ADKAR model, identifies resistance patterns, measures change fatigue, and generates intervention plans.
# Run with demo data
python scripts/change_readiness_assessor.py
# Specify change type
python scripts/change_readiness_assessor.py --type org
# From JSON assessment data
python scripts/change_readiness_assessor.py --input assessment.json
# JSON output
python scripts/change_readiness_assessor.py --jsonadoption_tracker.py
Tracks usage rates, reversion rates, satisfaction, and support requests to distinguish real adoption from surface compliance.
# Run with demo data
python scripts/adoption_tracker.py
# From JSON with weekly data
python scripts/adoption_tracker.py --input adoption_data.json
# JSON output
python scripts/adoption_tracker.py --jsoncommunication_planner.py
Generates audience-sequenced communication plans with templates, channel recommendations, and timing.
# Generate for process change
python scripts/communication_planner.py --type process --name "New CRM Rollout" --date 2026-04-15
# Generate for org change
python scripts/communication_planner.py --type org --name "Engineering Restructure"
# From JSON
python scripts/communication_planner.py --input comm_plan.json
# JSON output
python scripts/communication_planner.py --type strategy --json---
Troubleshooting
| Problem | Likely Cause | Fix |
|---|---|---|
| Usage rate high but satisfaction low | Compliance without adoption -- people use it because forced to | Investigate satisfaction drivers; don't rely on enforcement alone; improve the tool/process itself |
| Adoption plateaus at 60-70% | Remaining 30% have unaddressed ADKAR gaps (often Ability) | Segment non-adopters; run 1:1 diagnostics; provide targeted support |
| Change reverts within weeks of go-live | Reinforcement phase skipped; old system still accessible | Remove old system access; measure and recognize new behavior; embed in performance reviews |
| Leaders exempt themselves from the change | "Do as I say, not as I do" pattern | Leaders must go first and visibly. No exceptions. This is the #1 credibility destroyer |
| Multiple changes running and all struggling | Change fatigue -- organizational attention exhausted | Inventory active changes; pause non-critical ones; space major changes 2-3 months apart |
| Communication plan exists but concerns persist | Communication was broadcast-only with no feedback channel | Add Q&A sessions, named contact person, anonymous feedback channel |
---
Success Criteria
- ADKAR readiness score above 70/100 before go-live (measured via change_readiness_assessor.py)
- Adoption rate exceeds 80% within 8 weeks of go-live (usage, not just compliance)
- Reversion rate below 10% by week 8 (measured by system usage data)
- Satisfaction survey shows 60%+ agreement that "the new way is better" by week 8
- Support requests decline week-over-week after week 2 (ability phase resolving)
- No change announced on Friday afternoon (measured by communication log timestamps)
- Post-change retrospective conducted within 90 days with documented lessons learned
---
Scope & Limitations
In Scope: ADKAR-based readiness assessment, resistance diagnosis and response, change fatigue measurement, communication planning and sequencing, adoption tracking, playbooks for process/org/strategy/culture changes.
Out of Scope: Specific tool migration execution (CRM, ERP configuration), legal compliance for workforce reductions, union negotiation, employment law, individual coaching or therapy.
Limitations: ADKAR scores are based on assessment inputs -- they reflect perception, not objective measurement. Adoption tracker requires manual data collection for most metrics. Communication planner provides templates but cannot account for company-specific political dynamics. Change fatigue assessment is directional; actual organizational capacity varies by company culture.
---
Integration Points
| Skill | Integration |
|---|---|
coo-advisor | Process change design before announcing; operational readiness |
chro-advisor | People impact assessment; communication sequencing for reorgs |
ceo-advisor | Strategy pivot narrative alignment; CEO as primary communicator |
culture-architect | Culture change playbook; values-to-behaviors translation |
company-os | New OS rollout follows ADKAR model; meeting rhythm changes |
chief-of-staff | Routes change management questions; orchestrates cross-functional alignment |
strategic-alignment | Verifies goal cascade post-change; validates new direction is reflected in OKRs |
#!/usr/bin/env python3
"""
Adoption Tracker - Measure and track change adoption vs compliance.
Tracks usage rates, reversion rates, satisfaction, and support requests
to distinguish real adoption from surface compliance.
"""
import argparse
import json
import sys
from datetime import datetime
def track_adoption(data: dict) -> dict:
"""Track adoption metrics and generate report."""
change_name = data.get("change_name", "Change Initiative")
go_live_date = data.get("go_live_date", "")
weekly_data = data.get("weekly_data", [])
targets = data.get("targets", {})
results = {
"timestamp": datetime.now().isoformat(),
"change_name": change_name,
"go_live_date": go_live_date,
"current_week": len(weekly_data),
"metrics": {},
"trend_analysis": [],
"adoption_vs_compliance": {},
"at_risk_groups": [],
"recommendations": [],
}
# Default targets
usage_target = targets.get("usage_rate_pct", 80)
reversion_target = targets.get("reversion_rate_pct", 10)
satisfaction_target = targets.get("satisfaction_pct", 60)
target_week = targets.get("target_week", 8)
# Current state (latest week)
if weekly_data:
latest = weekly_data[-1]
results["metrics"] = {
"usage_rate_pct": latest.get("usage_rate_pct", 0),
"usage_target": usage_target,
"usage_on_track": latest.get("usage_rate_pct", 0) >= usage_target * (len(weekly_data) / target_week),
"reversion_rate_pct": latest.get("reversion_rate_pct", 0),
"reversion_target": reversion_target,
"reversion_ok": latest.get("reversion_rate_pct", 0) <= reversion_target,
"satisfaction_pct": latest.get("satisfaction_pct", 0),
"satisfaction_target": satisfaction_target,
"satisfaction_met": latest.get("satisfaction_pct", 0) >= satisfaction_target,
"support_requests": latest.get("support_requests", 0),
"support_trend": "Declining" if len(weekly_data) > 1 and latest.get("support_requests", 0) < weekly_data[-2].get("support_requests", 0) else "Increasing" if len(weekly_data) > 1 and latest.get("support_requests", 0) > weekly_data[-2].get("support_requests", 0) else "Flat",
"active_users": latest.get("active_users", 0),
"total_users": latest.get("total_users", 0),
}
# Trend analysis
for i, week in enumerate(weekly_data):
week_num = i + 1
results["trend_analysis"].append({
"week": week_num,
"usage_rate_pct": week.get("usage_rate_pct", 0),
"reversion_rate_pct": week.get("reversion_rate_pct", 0),
"satisfaction_pct": week.get("satisfaction_pct", 0),
"support_requests": week.get("support_requests", 0),
})
# Adoption vs compliance assessment
m = results["metrics"]
if m:
high_usage = m.get("usage_rate_pct", 0) >= 70
high_satisfaction = m.get("satisfaction_pct", 0) >= 60
low_reversion = m.get("reversion_rate_pct", 0) <= 15
declining_support = m.get("support_trend") == "Declining"
if high_usage and high_satisfaction and low_reversion:
adoption_type = "True Adoption"
description = "People use it because it is better. Sustained without enforcement."
elif high_usage and not high_satisfaction:
adoption_type = "Compliance Only"
description = "High usage but low satisfaction. Will revert when enforcement relaxes."
elif not high_usage and high_satisfaction:
adoption_type = "Partial Adoption"
description = "Those using it like it, but many haven't switched. Training/ability gap."
else:
adoption_type = "Failed Adoption"
description = "Low usage and low satisfaction. Reassess the change itself."
results["adoption_vs_compliance"] = {
"type": adoption_type,
"description": description,
"high_usage": high_usage,
"high_satisfaction": high_satisfaction,
"low_reversion": low_reversion,
"declining_support": declining_support,
}
# At-risk groups
groups = data.get("group_data", [])
for group in groups:
if group.get("usage_rate_pct", 100) < 50:
results["at_risk_groups"].append({
"group": group.get("name", "Unknown"),
"usage_rate_pct": group.get("usage_rate_pct", 0),
"primary_concern": group.get("primary_concern", "Unknown"),
"recommended_action": "1:1 with group lead to diagnose ADKAR gap",
})
# Recommendations
if results.get("adoption_vs_compliance", {}).get("type") == "Compliance Only":
results["recommendations"].append("Compliance without adoption detected. Investigate satisfaction drivers. Don't rely on enforcement alone.")
if results.get("adoption_vs_compliance", {}).get("type") == "Failed Adoption":
results["recommendations"].append("Consider rolling back or fundamentally redesigning the change.")
if m and not m.get("usage_on_track"):
gap = usage_target - m.get("usage_rate_pct", 0)
results["recommendations"].append(f"Usage {gap:.0f}pp below target trajectory. Increase training and support.")
if m and m.get("support_trend") == "Increasing":
results["recommendations"].append("Support requests increasing. Review training materials and common issues.")
if results["at_risk_groups"]:
results["recommendations"].append(f"{len(results['at_risk_groups'])} group(s) at risk of non-adoption. Targeted intervention needed.")
if len(weekly_data) >= target_week and m and m.get("usage_rate_pct", 0) >= usage_target:
results["recommendations"].append("Adoption target met. Consider deprecating the old system.")
return results
def format_text(results: dict) -> str:
"""Format as human-readable report."""
m = results["metrics"]
avc = results.get("adoption_vs_compliance", {})
lines = [
"=" * 60,
"ADOPTION TRACKER",
"=" * 60,
f"Change: {results['change_name']}",
f"Go-Live: {results['go_live_date']} | Current Week: {results['current_week']}",
"",
]
if m:
lines.extend([
"CURRENT METRICS:",
f" Usage Rate: {m.get('usage_rate_pct', 0):>5.0f}% (target: {m.get('usage_target', 0)}%) {'[OK]' if m.get('usage_on_track') else '[BEHIND]'}",
f" Reversion Rate: {m.get('reversion_rate_pct', 0):>5.0f}% (target: <{m.get('reversion_target', 0)}%) {'[OK]' if m.get('reversion_ok') else '[HIGH]'}",
f" Satisfaction: {m.get('satisfaction_pct', 0):>5.0f}% (target: {m.get('satisfaction_target', 0)}%) {'[OK]' if m.get('satisfaction_met') else '[LOW]'}",
f" Support Tickets: {m.get('support_requests', 0):>5} ({m.get('support_trend', 'N/A')})",
f" Active Users: {m.get('active_users', 0)}/{m.get('total_users', 0)}",
"",
])
if avc:
lines.extend([
f"ADOPTION TYPE: {avc.get('type', 'N/A')}",
f" {avc.get('description', '')}",
"",
])
if results["trend_analysis"]:
lines.extend(["WEEKLY TREND:", f"{'Week':>5} {'Usage':>7} {'Revert':>8} {'Satis':>7} {'Support':>8}"])
for t in results["trend_analysis"]:
lines.append(f" W{t['week']:>2} {t['usage_rate_pct']:>6.0f}% {t['reversion_rate_pct']:>7.0f}% {t['satisfaction_pct']:>6.0f}% {t['support_requests']:>8}")
lines.append("")
if results["at_risk_groups"]:
lines.append("AT-RISK GROUPS:")
for g in results["at_risk_groups"]:
lines.append(f" [!] {g['group']}: {g['usage_rate_pct']}% usage - {g['primary_concern']}")
lines.append("")
if results["recommendations"]:
lines.append("RECOMMENDATIONS:")
for r in results["recommendations"]:
lines.append(f" -> {r}")
lines.extend(["", "=" * 60])
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Track change adoption metrics")
parser.add_argument("--input", "-i", help="JSON file with adoption data")
parser.add_argument("--json", action="store_true", help="Output as JSON")
args = parser.parse_args()
if args.input:
with open(args.input) as f:
data = json.load(f)
else:
data = {
"change_name": "New CRM System",
"go_live_date": "2025-11-01",
"targets": {"usage_rate_pct": 80, "reversion_rate_pct": 10, "satisfaction_pct": 60, "target_week": 8},
"weekly_data": [
{"usage_rate_pct": 25, "reversion_rate_pct": 30, "satisfaction_pct": 40, "support_requests": 45, "active_users": 12, "total_users": 48},
{"usage_rate_pct": 40, "reversion_rate_pct": 22, "satisfaction_pct": 48, "support_requests": 38, "active_users": 19, "total_users": 48},
{"usage_rate_pct": 55, "reversion_rate_pct": 18, "satisfaction_pct": 52, "support_requests": 28, "active_users": 26, "total_users": 48},
{"usage_rate_pct": 62, "reversion_rate_pct": 14, "satisfaction_pct": 55, "support_requests": 20, "active_users": 30, "total_users": 48},
{"usage_rate_pct": 68, "reversion_rate_pct": 12, "satisfaction_pct": 58, "support_requests": 15, "active_users": 33, "total_users": 48},
],
"group_data": [
{"name": "Sales Team", "usage_rate_pct": 82, "primary_concern": "None"},
{"name": "Marketing", "usage_rate_pct": 65, "primary_concern": "Missing integrations"},
{"name": "Finance", "usage_rate_pct": 35, "primary_concern": "Reporting limitations"},
],
}
results = track_adoption(data)
if args.json:
print(json.dumps(results, indent=2))
else:
print(format_text(results))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Change Readiness Assessor - Assess organizational readiness for change using ADKAR.
Evaluates readiness across ADKAR phases, identifies resistance patterns,
measures change fatigue, and generates targeted intervention plans.
"""
import argparse
import json
import sys
from datetime import datetime
ADKAR_PHASES = {
"awareness": {"weight": 0.20, "failure_symptom": "Nobody told me why", "interventions": ["Re-communicate the WHY with data", "CEO video explaining the change", "FAQ document"]},
"desire": {"weight": 0.25, "failure_symptom": "I understand but I don't agree", "interventions": ["Address individual concerns in 1:1s", "Involve resisters in HOW", "Show personal benefits"]},
"knowledge": {"weight": 0.20, "failure_symptom": "I want to but I don't know how", "interventions": ["Training sessions", "Documentation and guides", "Office hours and help desk"]},
"ability": {"weight": 0.20, "failure_symptom": "I know how but I can't do it yet", "interventions": ["Practice time with reduced workload", "Buddy system", "Support desk"]},
"reinforcement": {"weight": 0.15, "failure_symptom": "We tried but went back to the old way", "interventions": ["Public wins and recognition", "Remove old system access", "Measure and report adoption"]},
}
RESISTANCE_PATTERNS = {
"vocal_opposition": {"signal": "I understand but disagree", "phase": "desire", "severity": "medium"},
"timing_challenge": {"signal": "Why now?", "phase": "awareness", "severity": "low"},
"process_complaint": {"signal": "I wasn't consulted", "phase": "desire", "severity": "medium"},
"capacity_excuse": {"signal": "I don't have time", "phase": "ability", "severity": "medium"},
"historical_reference": {"signal": "We tried this before", "phase": "desire", "severity": "high"},
"silent_noncompliance": {"signal": "No pushback but doesn't change", "phase": "unknown", "severity": "high"},
"malicious_compliance": {"signal": "Does it technically but undermines", "phase": "desire", "severity": "critical"},
}
CHANGE_TYPES = {
"process": {"timeline_weeks": "4-8", "hardest_phase": "ability"},
"org": {"timeline_weeks": "12-24", "hardest_phase": "desire"},
"strategy": {"timeline_weeks": "12-48", "hardest_phase": "awareness"},
"culture": {"timeline_weeks": "48-96", "hardest_phase": "reinforcement"},
}
def assess_readiness(data: dict) -> dict:
"""Assess organizational change readiness."""
change_type = data.get("change_type", "process")
adkar_scores = data.get("adkar_scores", {})
resistance_observed = data.get("resistance_patterns", [])
active_changes = data.get("active_changes", [])
stakeholder_count = data.get("affected_stakeholders", 0)
type_config = CHANGE_TYPES.get(change_type, CHANGE_TYPES["process"])
results = {
"timestamp": datetime.now().isoformat(),
"change_type": change_type,
"change_description": data.get("change_description", ""),
"timeline": type_config["timeline_weeks"],
"hardest_phase": type_config["hardest_phase"],
"overall_readiness": 0,
"readiness_label": "",
"adkar_assessment": {},
"weakest_phase": "",
"resistance_analysis": [],
"fatigue_assessment": {},
"intervention_plan": [],
"communication_plan": [],
"recommendations": [],
}
# ADKAR scoring
total_readiness = 0
weakest_score = 100
weakest_phase = ""
for phase, config in ADKAR_PHASES.items():
score = adkar_scores.get(phase, 50) # 0-100
weighted = score * config["weight"]
total_readiness += weighted
if score < weakest_score:
weakest_score = score
weakest_phase = phase
status = "Strong" if score >= 70 else "Adequate" if score >= 50 else "Weak" if score >= 30 else "Critical"
results["adkar_assessment"][phase] = {
"score": score,
"weighted": round(weighted, 1),
"status": status,
"failure_symptom": config["failure_symptom"],
"interventions": config["interventions"] if score < 70 else [],
}
results["overall_readiness"] = round(total_readiness, 1)
results["weakest_phase"] = weakest_phase
results["readiness_label"] = (
"Ready" if total_readiness >= 75 else
"Conditionally Ready" if total_readiness >= 55 else
"Not Ready" if total_readiness >= 35 else
"High Risk"
)
# Resistance analysis
for pattern_name in resistance_observed:
pattern = RESISTANCE_PATTERNS.get(pattern_name, {})
if pattern:
results["resistance_analysis"].append({
"pattern": pattern_name.replace("_", " ").title(),
"signal": pattern.get("signal", ""),
"broken_phase": pattern.get("phase", "unknown"),
"severity": pattern.get("severity", "medium"),
"recommended_response": ADKAR_PHASES.get(pattern.get("phase", ""), {}).get("interventions", ["Diagnose in 1:1 conversation"])[0],
})
# Fatigue assessment
active_count = len(active_changes)
avg_absorption = sum(c.get("absorption_pct", 50) for c in active_changes) / max(1, active_count)
fatigue_level = "Critical" if active_count >= 4 else "High" if active_count >= 3 and avg_absorption < 60 else "Moderate" if active_count >= 2 else "Low"
results["fatigue_assessment"] = {
"active_changes": active_count,
"avg_absorption_pct": round(avg_absorption, 1),
"fatigue_level": fatigue_level,
"can_add_change": fatigue_level in ["Low", "Moderate"],
"recommendation": (
"Safe to proceed" if fatigue_level == "Low" else
"Proceed with caution - communicate stability" if fatigue_level == "Moderate" else
"Pause non-critical changes first" if fatigue_level == "High" else
"Freeze all new changes. Rebuild trust."
),
"active_change_inventory": active_changes,
}
# Intervention plan for weakest phases
for phase, assessment in results["adkar_assessment"].items():
if assessment["status"] in ["Weak", "Critical"]:
for intervention in assessment["interventions"]:
results["intervention_plan"].append({
"phase": phase,
"intervention": intervention,
"priority": "Immediate" if assessment["status"] == "Critical" else "This week",
"owner": "Change sponsor" if phase in ["awareness", "desire"] else "Change team",
})
# Communication plan
results["communication_plan"] = [
{"audience": "Leadership team", "order": 1, "channel": "In-person meeting", "content": "Full context + their role in rollout"},
{"audience": "Directly affected employees", "order": 2, "channel": "Manager 1:1 or small group", "content": "Personal impact + support available"},
{"audience": "All employees", "order": 3, "channel": "All-hands + written Q&A", "content": "WHY + WHAT + timeline + FAQ"},
{"audience": "External stakeholders", "order": 4, "channel": "Appropriate channel", "content": "Need-to-know only"},
]
# Recommendations
if results["readiness_label"] == "High Risk":
results["recommendations"].append("Do not proceed. Address Critical ADKAR gaps first.")
if results["weakest_phase"]:
results["recommendations"].append(f"Focus on '{results['weakest_phase']}' phase - scored {weakest_score}/100.")
if not results["fatigue_assessment"]["can_add_change"]:
results["recommendations"].append("Change fatigue detected. Complete or pause existing changes before adding new ones.")
if resistance_observed:
critical = [r for r in results["resistance_analysis"] if r["severity"] == "critical"]
if critical:
results["recommendations"].append(f"URGENT: {len(critical)} critical resistance pattern(s) detected. Address immediately.")
return results
def format_text(results: dict) -> str:
"""Format as human-readable report."""
lines = [
"=" * 60,
"CHANGE READINESS ASSESSMENT",
"=" * 60,
f"Change: {results['change_description'] or results['change_type'].title()}",
f"Type: {results['change_type'].title()} | Timeline: {results['timeline']} weeks",
f"Overall Readiness: {results['overall_readiness']:.0f}/100 ({results['readiness_label']})",
f"Weakest Phase: {results['weakest_phase'].upper()}",
"",
"ADKAR ASSESSMENT:",
f"{'Phase':<16} {'Score':>6} {'Status':<12} {'Symptom'}",
"-" * 60,
]
for phase, a in results["adkar_assessment"].items():
icon = "[G]" if a["status"] == "Strong" else "[Y]" if a["status"] == "Adequate" else "[R]"
lines.append(f"{phase.title():<16} {a['score']:>5}/100 {icon} {a['status']:<9} {a['failure_symptom']}")
if results["resistance_analysis"]:
lines.extend(["", "RESISTANCE PATTERNS:"])
for r in results["resistance_analysis"]:
lines.append(f" [{r['severity'].upper()}] {r['pattern']}: '{r['signal']}' -> Fix: {r['recommended_response']}")
fa = results["fatigue_assessment"]
lines.extend([
"",
f"CHANGE FATIGUE: {fa['fatigue_level']} ({fa['active_changes']} active changes, {fa['avg_absorption_pct']:.0f}% avg absorption)",
f" {fa['recommendation']}",
])
if results["intervention_plan"]:
lines.extend(["", "INTERVENTION PLAN:"])
for ip in results["intervention_plan"][:6]:
lines.append(f" [{ip['priority']}] {ip['phase'].title()}: {ip['intervention']} (Owner: {ip['owner']})")
if results["recommendations"]:
lines.extend(["", "RECOMMENDATIONS:"])
for r in results["recommendations"]:
lines.append(f" -> {r}")
lines.extend(["", "=" * 60])
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Assess organizational change readiness")
parser.add_argument("--input", "-i", help="JSON file with assessment data")
parser.add_argument("--type", choices=["process", "org", "strategy", "culture"], default="process", help="Change type")
parser.add_argument("--json", action="store_true", help="Output as JSON")
args = parser.parse_args()
if args.input:
with open(args.input) as f:
data = json.load(f)
else:
data = {
"change_type": args.type,
"change_description": "New CRM system rollout",
"affected_stakeholders": 45,
"adkar_scores": {"awareness": 70, "desire": 45, "knowledge": 55, "ability": 35, "reinforcement": 60},
"resistance_patterns": ["process_complaint", "capacity_excuse", "historical_reference"],
"active_changes": [
{"name": "Engineering reorg", "absorption_pct": 65},
{"name": "Values refresh", "absorption_pct": 75},
],
}
results = assess_readiness(data)
if args.json:
print(json.dumps(results, indent=2))
else:
print(format_text(results))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Change Communication Planner - Generate sequenced communication plans.
Creates audience-sequenced communication plans with templates, channel
recommendations, and timing for organizational changes.
"""
import argparse
import json
import sys
from datetime import datetime, timedelta
CHANGE_COMM_TEMPLATES = {
"process": {
"phases": [
{"timing": "T-2 weeks", "audience": "Leadership team", "channel": "In-person meeting", "content_type": "Full context briefing"},
{"timing": "T-1 week", "audience": "Team leads", "channel": "Small group meeting", "content_type": "Heads-up with their role in rollout"},
{"timing": "T-0 (Go-live)", "audience": "All affected employees", "channel": "Email + all-hands", "content_type": "Announcement with FAQ"},
{"timing": "T+1 week", "audience": "All affected employees", "channel": "FAQ document + Slack", "content_type": "FAQ published, Q&A channel open"},
{"timing": "T+4 weeks", "audience": "All affected employees", "channel": "Team meeting", "content_type": "Adoption check + public wins"},
{"timing": "T+8 weeks", "audience": "All employees", "channel": "Email", "content_type": "Old system deprecated notice"},
],
},
"org": {
"phases": [
{"timing": "T-1 week", "audience": "Most affected individuals", "channel": "1:1 with manager", "content_type": "Personal impact conversation"},
{"timing": "T-0", "audience": "All affected employees", "channel": "Synchronous meeting (in-person preferred)", "content_type": "WHY announcement with Q&A"},
{"timing": "T+1 day", "audience": "Directly affected", "channel": "Manager 1:1s", "content_type": "Individual impact and support"},
{"timing": "T+1 week", "audience": "All employees", "channel": "Written FAQ", "content_type": "Honest FAQ with what you CAN share"},
{"timing": "T+2-4 weeks", "audience": "New structure", "channel": "Team meetings", "content_type": "New structure operating"},
{"timing": "T+2 months", "audience": "All affected", "channel": "Retrospective", "content_type": "First retrospective"},
{"timing": "T+3-6 months", "audience": "All", "channel": "HR check-ins", "content_type": "Regular health check-ins"},
],
},
"strategy": {
"phases": [
{"timing": "T-2 weeks", "audience": "Leadership team", "channel": "Off-site/meeting", "content_type": "Full alignment (everyone on same page)"},
{"timing": "T-0", "audience": "All employees", "channel": "All-hands (employees BEFORE press)", "content_type": "Internal announcement"},
{"timing": "T+1 week", "audience": "Each team", "channel": "Team-level meetings", "content_type": "'What does this mean for us' conversations"},
{"timing": "T+2 weeks", "audience": "All employees", "channel": "CEO update", "content_type": "Resource reallocation announced"},
{"timing": "T+1 month", "audience": "All employees", "channel": "Company update", "content_type": "First milestone of new direction visible"},
{"timing": "T+ ongoing", "audience": "All employees", "channel": "Regular updates", "content_type": "Progress on new direction"},
],
},
"culture": {
"phases": [
{"timing": "T-8 weeks", "audience": "Representative sample", "channel": "Workshops", "content_type": "Input gathering on culture change"},
{"timing": "T-4 weeks", "audience": "Leadership team", "channel": "Workshop", "content_type": "Define observable behaviors"},
{"timing": "T-0", "audience": "All employees", "channel": "Story-based all-hands", "content_type": "Story-based announcement"},
{"timing": "T+2 weeks", "audience": "All employees", "channel": "Written + examples", "content_type": "Behavioral anchors published"},
{"timing": "T+1 month", "audience": "Leadership team", "channel": "Visible modeling", "content_type": "Leaders visibly model new behavior"},
{"timing": "T+next review", "audience": "All employees", "channel": "Performance system", "content_type": "Behaviors in performance reviews"},
{"timing": "T+ ongoing", "audience": "All employees", "channel": "Recognition", "content_type": "Public recognition of new behaviors"},
],
},
}
MESSAGE_TEMPLATE = """
COMMUNICATION: {title}
1. WHAT IS CHANGING
{what_changing}
2. WHY IT IS CHANGING
{why_changing}
3. WHAT THIS MEANS FOR YOU
{impact}
4. WHAT IS NOT CHANGING
{not_changing}
5. TIMELINE
{timeline}
6. HOW TO ASK QUESTIONS
{questions_channel}
7. WHAT HAPPENS NEXT
{next_step}
"""
def generate_plan(data: dict) -> dict:
"""Generate a change communication plan."""
change_type = data.get("change_type", "process")
change_name = data.get("change_name", "Change Initiative")
go_live_date_str = data.get("go_live_date", "")
message_inputs = data.get("message", {})
try:
go_live = datetime.strptime(go_live_date_str, "%Y-%m-%d")
except (ValueError, TypeError):
go_live = datetime.now() + timedelta(weeks=2)
template = CHANGE_COMM_TEMPLATES.get(change_type, CHANGE_COMM_TEMPLATES["process"])
results = {
"timestamp": datetime.now().isoformat(),
"change_name": change_name,
"change_type": change_type,
"go_live_date": go_live.strftime("%Y-%m-%d"),
"communication_phases": [],
"message_draft": "",
"anti_patterns": [
"Do NOT announce on Friday afternoon - people stew over the weekend",
"Do NOT say 'this is final, questions are not welcome' - creates underground resistance",
"Do NOT skip the FAQ - concerns go unaddressed",
"Do NOT let leaders be exempt from the change - destroys credibility",
"Do NOT communicate via email only for org changes - requires synchronous delivery",
],
"quality_checklist": [
{"check": "Specific dates included (not 'soon')", "status": False},
{"check": "Named person for questions", "status": False},
{"check": "What is NOT changing explicitly stated", "status": False},
{"check": "FAQ prepared", "status": False},
{"check": "Leadership aligned before announcement", "status": False},
{"check": "Affected individuals told before general announcement", "status": False},
{"check": "Follow-up cadence defined", "status": False},
],
"recommendations": [],
}
# Build phases with actual dates
for phase in template["phases"]:
timing_str = phase["timing"]
# Parse timing to compute date
if timing_str.startswith("T-"):
parts = timing_str.replace("T-", "").strip()
if "week" in parts:
weeks = int(parts.split()[0])
phase_date = go_live - timedelta(weeks=weeks)
elif "day" in parts:
days = int(parts.split()[0])
phase_date = go_live - timedelta(days=days)
else:
phase_date = go_live
elif timing_str.startswith("T+"):
parts = timing_str.replace("T+", "").strip()
if "week" in parts:
weeks = int(parts.split()[0])
phase_date = go_live + timedelta(weeks=weeks)
elif "day" in parts:
days = int(parts.split()[0])
phase_date = go_live + timedelta(days=days)
elif "month" in parts:
months = int(parts.split()[0])
phase_date = go_live + timedelta(weeks=months * 4)
else:
phase_date = go_live + timedelta(weeks=4)
else:
phase_date = go_live
results["communication_phases"].append({
"timing": timing_str,
"date": phase_date.strftime("%Y-%m-%d"),
"audience": phase["audience"],
"channel": phase["channel"],
"content_type": phase["content_type"],
"is_past_due": datetime.now() > phase_date,
})
# Generate message draft
results["message_draft"] = MESSAGE_TEMPLATE.format(
title=change_name,
what_changing=message_inputs.get("what_changing", "[What is changing - 1-2 sentences, direct]"),
why_changing=message_inputs.get("why_changing", "[The business reason - be honest]"),
impact=message_inputs.get("impact", "[Practical impact on the audience]"),
not_changing=message_inputs.get("not_changing", "[Stability anchor - what stays the same]"),
timeline=message_inputs.get("timeline", "[Specific dates for key milestones]"),
questions_channel=message_inputs.get("questions_channel", "[Channel, named person, office hours schedule]"),
next_step=message_inputs.get("next_step", "[The very first concrete step]"),
).strip()
# Recommendations
past_due = [p for p in results["communication_phases"] if p["is_past_due"]]
if past_due:
results["recommendations"].append(f"{len(past_due)} communication phase(s) past due. Catch up immediately.")
return results
def format_text(results: dict) -> str:
"""Format as human-readable report."""
lines = [
"=" * 65,
"CHANGE COMMUNICATION PLAN",
"=" * 65,
f"Change: {results['change_name']}",
f"Type: {results['change_type'].title()} | Go-Live: {results['go_live_date']}",
"",
"COMMUNICATION SEQUENCE:",
f"{'Timing':<14} {'Date':<12} {'Audience':<25} {'Channel':<22}",
"-" * 65,
]
for p in results["communication_phases"]:
flag = " [PAST DUE]" if p["is_past_due"] else ""
lines.append(f"{p['timing']:<14} {p['date']:<12} {p['audience']:<25} {p['channel']:<22}{flag}")
lines.append(f"{'':>14} Content: {p['content_type']}")
lines.extend(["", "MESSAGE TEMPLATE:", "-" * 40, results["message_draft"], "-" * 40])
lines.extend(["", "ANTI-PATTERNS TO AVOID:"])
for ap in results["anti_patterns"]:
lines.append(f" [X] {ap}")
if results["recommendations"]:
lines.extend(["", "RECOMMENDATIONS:"])
for r in results["recommendations"]:
lines.append(f" -> {r}")
lines.extend(["", "=" * 65])
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Generate change communication plan")
parser.add_argument("--input", "-i", help="JSON file with communication data")
parser.add_argument("--type", choices=["process", "org", "strategy", "culture"], default="process", help="Change type")
parser.add_argument("--name", help="Change name")
parser.add_argument("--date", help="Go-live date (YYYY-MM-DD)")
parser.add_argument("--json", action="store_true", help="Output as JSON")
args = parser.parse_args()
if args.input:
with open(args.input) as f:
data = json.load(f)
else:
data = {
"change_type": args.type,
"change_name": args.name or "New CRM Rollout",
"go_live_date": args.date or (datetime.now() + timedelta(weeks=3)).strftime("%Y-%m-%d"),
}
results = generate_plan(data)
if args.json:
print(json.dumps(results, indent=2))
else:
print(format_text(results))
if __name__ == "__main__":
main()
Related skills
FAQ
What core model does it use?
A startup-adapted version of the ADKAR model with five phases: Awareness, Desire, Knowledge, Ability, and Reinforcement.
What change types does it cover?
Process changes, org changes/reorgs, strategy pivots, and culture changes, each with its own playbook and timeline.