
Company Os
- 97 installs
- 451 repo stars
- Updated July 21, 2026
- borghei/claude-skills
Company OS is a Claude skill that helps select and set up a company operating system covering accountability charts, scorecards, meeting cadence, issue resolution, and quarterly rocks.
About
Company OS is a meta-framework for how a company runs, connecting C-suite roles through operating-system selection, accountability charts, weekly scorecards, meeting-pulse design, IDS issue resolution, 90-day rocks, and communication cadence. A founder or operator uses it when setting up company operations, choosing a management framework like EOS or Scaling Up, or designing meeting rhythms. It provides decision trees, comparison matrices, and workshop protocols.
- Selects a company operating system (EOS, Scaling Up, OKR-native, Holacracy) via a size-based decision tree
- Builds accountability charts, weekly scorecards, meeting-pulse rhythms, and IDS issue resolution
- Covers 90-day rocks and communication cadence for company operations
Company Os by the numbers
- 97 all-time installs (skills.sh)
- Ranked #1,376 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
company-os capabilities & compatibility
- Capabilities
- okr planning · meeting cadence · accountability chart · scorecard design
- Use cases
- planning · project management
- Pricing
- Free
What company-os says it does
The operating system is the collection of tools, rhythms, and agreements that determine how the company functions.
5-15 metrics maximum | More than 15 = nothing gets attention
Not an org chart. An accountability chart answers: "Who owns this outcome?"
npx skills add https://github.com/borghei/claude-skills --skill company-osAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 97 |
|---|---|
| repo stars | ★ 451 |
| Last updated | July 21, 2026 |
| Repository | borghei/claude-skills ↗ |
What it does
Choose and set up a company operating system with accountability charts, scorecards, and meeting cadence.
Who is it for?
Founders and operators setting up company operating rhythms and management frameworks
Skip if: Product feature work or writing code
When should I use this skill?
Setting up company operations, selecting a management framework, or designing meeting rhythms
What you get
Makes the operating system explicit with a chosen framework, accountability chart, scorecard, and meeting pulse.
- operating-system selection
- accountability chart
- weekly scorecard
By the numbers
- Compares 4 frameworks: EOS, Scaling Up, OKR-Native, Holacracy
- Recommends 5-15 scorecard metrics maximum
- Defines six core operating-system components
Files
Company Operating System
The operating system is the collection of tools, rhythms, and agreements that determine how the company functions. Every company has one -- most just do not know what it is. Making it explicit makes it improvable.
Keywords
operating system, EOS, Entrepreneurial Operating System, Scaling Up, Rockefeller Habits, OKR, Holacracy, L10 meeting, rocks, scorecard, accountability chart, issues list, IDS, meeting pulse, quarterly planning, weekly scorecard, management framework, company rhythm, traction, annual planning, communication cadence
---
Operating System Selection
Decision Tree
START: "Which operating system?"
|
v
[Company size?]
|
+-- 10-50 people
| |
| v
| [Is the founder operational or visionary?]
| |
| +-- Operational --> EOS / Traction (structured, simple)
| +-- Visionary --> Scaling Up (ambitious, strategy-heavy)
|
+-- 50-200 people
| |
| v
| [Engineering-led or sales-led?]
| |
| +-- Engineering-led --> OKR-native (hypothesis-driven)
| +-- Sales-led --> Scaling Up or EOS (execution-focused)
|
+-- 200+ people
| |
| v
| [High autonomy or high alignment needed?]
| |
| +-- High autonomy --> Holacracy (only if patient)
| +-- High alignment --> Custom hybrid (best of EOS + OKR)
|
+-- Not sure --> Start with EOS. It is the simplest to implement.Framework Comparison Matrix
| Feature | EOS | Scaling Up | OKR-Native | Holacracy |
|---|---|---|---|---|
| Complexity | Low | Medium | Medium | High |
| Implementation time | 30-90 days | 90-180 days | 60-120 days | 6-12 months |
| Best company size | 10-250 | 50-500 | 20-500 | 50-300 |
| Goal framework | Rocks (binary) | OKRs + Priorities | OKRs (graded) | Roles + accountabilities |
| Meeting cadence | Weekly L10 | Daily huddle + weekly | Weekly + quarterly | Governance + tactical |
| Issue resolution | IDS | Keep/Kill/Combine | Retrospective | Governance process |
| Accountability | Accountability chart | Function accountability | OKR ownership | Role-based |
| Scorecard | Weekly numbers | Weekly KPIs | Quarterly KRs | Metrics per role |
| Strengths | Simple, fast to implement | Rigorous, strategy-heavy | Flexible, tech-friendly | Distributed authority |
| Weaknesses | Can feel rigid | Complex, requires discipline | Can drift without structure | Steep learning curve |
---
The Six Core Components
Every effective operating system has these six, regardless of framework:
Component 1: Accountability Chart
Not an org chart. An accountability chart answers: "Who owns this outcome?"
Design Principles
| Principle | Implementation |
|---|---|
| Single ownership | One person owns each function. Multiple may work in it. |
| Explicit gaps | Functions nobody owns are identified and assigned. |
| No overlap | If two people think they own it, neither does. Resolve immediately. |
| Stage-appropriate | One person can own multiple seats early. Be explicit about it. |
| Quarterly review | Ownership shifts as company grows. Review every quarter. |
Accountability Chart Template
CEO
|
+-- Revenue (CRO/VP Sales)
| +-- Inbound pipeline
| +-- Outbound pipeline
| +-- Customer success
|
+-- Product & Engineering (CTO/CPO)
| +-- Product roadmap
| +-- Engineering delivery
| +-- Technical operations
|
+-- Operations (COO)
| +-- Finance & legal
| +-- People operations
| +-- Business operations
|
+-- Marketing (CMO/VP Marketing)
+-- Demand generation
+-- Brand & content
+-- Product marketingWorkshop Protocol (2 hours)
Step 1: List all functions the company performs (30 min)
Step 2: Assign ONE owner per function (30 min)
Step 3: Identify gaps (functions nobody owns) (15 min)
Step 4: Identify overlaps (2+ people claiming ownership) (15 min)
Step 5: Resolve gaps and overlaps (20 min)
Step 6: Publish and communicate (10 min)Component 2: Scorecard
Weekly metrics that tell you if the company is on track. Not monthly. Not quarterly. Weekly.
Scorecard Rules
| Rule | Rationale |
|---|---|
| 5-15 metrics maximum | More than 15 = nothing gets attention |
| Each metric has an owner | Ownership drives accountability |
| Each metric has a weekly target | Not a range -- a specific number |
| Red/Yellow/Green status | Not paragraphs -- traffic lights |
| Only Red metrics get discussion | Green = no discussion needed in meeting |
Example Scorecard
| Metric | Owner | Target | Week | Status |
|---|---|---|---|---|
| New MRR | CRO | $50K | $43K | [R] |
| Logo churn | CS Lead | < 1% | 0.8% | [G] |
| Active users | CPO | 2,000 | 2,150 | [G] |
| Deployments | CTO | 3/week | 3 | [G] |
| Critical bugs open | CTO | 0 | 2 | [R] |
| Runway | CFO | > 18mo | 16mo | [Y] |
| Offer acceptance | CHRO | > 85% | 90% | [G] |
Component 3: Meeting Pulse
Full Meeting Rhythm
| Meeting | Frequency | Duration | Who | Purpose |
|---|---|---|---|---|
| Daily standup | Daily | 15 min | Each team | Blockers only |
| L10 / Leadership sync | Weekly | 90 min | Leadership team | Scorecard + issues |
| Department review | Monthly | 60 min | Dept + leadership | Deep dive on dept metrics |
| Quarterly planning | Quarterly | 1-2 days | Leadership | Set rocks, review strategy |
| Annual planning | Annual | 2-3 days | Leadership | 1-year + 3-year vision |
L10 Meeting Agenda (Weekly Leadership)
| Segment | Duration | Activity |
|---|---|---|
| Good news | 5 min | Personal + business wins |
| Scorecard review | 5 min | Flag red items only |
| Rock review | 5 min | On/off track for each rock |
| Customer/employee headlines | 5 min | Notable events |
| Issues list (IDS) | 60 min | Identify, Discuss, Solve |
| To-dos review | 5 min | Last week's commitments: done or not? |
| Conclude | 5 min | Rate meeting 1-10, what would make it 10 next time |
Component 4: Issue Resolution (IDS)
Maximum 15 minutes per issue. This is the core problem-solving loop.
IDENTIFY: What is the actual issue? (One sentence, root cause, not symptom)
|
DISCUSS: Relevant facts + perspectives. Time-boxed.
| When discussion starts repeating, STOP.
|
SOLVE: One owner. One action. One due date. Written down.IDS Anti-Patterns
| Anti-Pattern | Why It Fails | Fix |
|---|---|---|
| "Let's take this offline" | Things taken offline rarely get resolved | Solve it now or put it on next week's list |
| Discussing without deciding | Great discussion, no action item = wasted | Every discussion must end with a decision |
| Revisiting decided issues | Undermines the system | Once solved, off the list. Reopen only with new data. |
| Issue on list 3+ meetings | Either not real or too scary to address | Force it: address this week or remove it |
| Multiple issues conflated | Impossible to solve a bundled problem | One issue per entry. Separate if needed. |
Component 5: Rocks (90-Day Priorities)
Rock Rules
| Rule | Rationale |
|---|---|
| 3-7 per person maximum | More than 7 = none get done |
| 3-7 company-level rocks | Shared leadership priorities |
| Binary status: done or not done | No "60% complete" |
| Set at quarterly planning | Reviewed weekly (on/off track) |
| Not a to-do list | Rocks take 90 days of sustained work |
Good vs. Bad Rocks
| Bad Rock | Why | Good Rock |
|---|---|---|
| "Improve sales process" | Not measurable or specific | "Implement CRM with pipeline stages and reporting by Mar 31" |
| "Hire more engineers" | No target, no deadline | "Hire 3 senior engineers with offers accepted by Apr 15" |
| "Reduce churn" | No target | "Reduce monthly logo churn from 3% to 1.5% by end of Q2" |
| "Get better at communication" | Not observable | "Ship weekly company update every Friday for 12 weeks" |
Component 6: Communication Cadence
| Audience | What | When | Format |
|---|---|---|---|
| All employees | Company update | Monthly | Written + Q&A |
| All employees | Quarterly results + priorities | Quarterly | All-hands meeting |
| Leadership team | Scorecard | Weekly | Dashboard |
| Board | Company performance | Monthly or quarterly | Board memo/deck |
| Investors | Key metrics + narrative | Monthly or quarterly | Investor update |
| Customers | Product updates | Per release | Release notes |
Default rule: If deciding whether to share internally, share it. Under-communication always costs more than over-communication.
---
Implementation Roadmap
30-Day Quick Start
| Week | Activity | Time Investment |
|---|---|---|
| 1 | Build accountability chart | 2-hour workshop |
| 2 | Define 5-10 weekly scorecard metrics | 1-hour alignment session |
| 3 | Start weekly L10 meeting | 90 min/week (ongoing) |
| 4 | Set first round of 90-day rocks | Half-day planning session |
These four alone improve coordination more than most companies achieve in a year.
90-Day Full Implementation
| Month | Focus | Deliverables |
|---|---|---|
| 1 | Foundation | Accountability chart, scorecard, L10 meetings |
| 2 | Depth | Rocks defined, issues list active, daily standups |
| 3 | Cadence | Full meeting rhythm, communication cadence, first quarterly review |
---
Common Failure Modes
| Failure | Symptom | Fix |
|---|---|---|
| Partial implementation | "We do OKRs but skip check-ins" | Half an OS is worse than none. Commit to the full system. |
| Meeting fatigue | Added rhythm on top of existing meetings | Replace meetings, do not add them |
| Metric overload | 30 KPIs because "they all matter" | Start with 5. Add only when cadence is established. |
| Rock inflation | 12 rocks per person | Hard limit: 7 per person, 7 for the company. |
| Leader non-compliance | Leadership skips L10 or ignores IDS | The OS mirrors leadership respect. Leaders go first. |
| No quarterly review | Annual goals checked at year-end | Quarterly is the minimum review cycle. |
| Scorecard without targets | Tracking numbers without thresholds | Every metric needs a target to be actionable. |
---
Red Flags
- Five team leads give different answers when asked "What are the top 3 company priorities?" -- alignment failure
- Same issue on the issues list for 4+ weeks -- avoidance or structural problem
- No weekly scorecard exists -- flying blind
- Rocks set but never reviewed weekly -- goals without accountability
- Accountability chart has not been updated in 6+ months -- reality has drifted
- Meetings consistently end without decisions -- meeting design problem
- Communication is all top-down, never bottom-up -- feedback loop broken
---
Integration with C-Suite
| Role | OS Dependency |
|---|---|
CEO (ceo-advisor) | Sets vision that feeds 1-year plan and rocks |
COO (coo-advisor) | Owns meeting pulse and issue resolution cadence |
CFO (cfo-advisor) | Owns financial metrics in the scorecard |
CTO (cto-advisor) | Owns engineering rocks and tech scorecard metrics |
CHRO (chro-advisor) | Owns people metrics (attrition, hiring velocity) |
Culture Architect (culture-architect) | Culture rituals integrate into meeting pulse |
Strategic Alignment (strategic-alignment) | Validates team rocks cascade from company rocks |
Change Management (change-management) | New OS rollout follows ADKAR model |
---
Output Artifacts
| Request | Deliverable |
|---|---|
| "Set up our operating system" | Framework recommendation + 30-day implementation plan |
| "Design our meeting cadence" | Full meeting rhythm with agendas and owners |
| "Build our scorecard" | 5-15 metrics with owners, targets, and thresholds |
| "Help with quarterly planning" | Planning session agenda + rock-setting framework |
| "Fix our accountability" | Accountability chart workshop + gap/overlap analysis |
| "We keep discussing the same issues" | IDS training + issues list audit |
---
Tool Reference
scorecard_builder.py
Builds and tracks weekly company scorecards with RAG status, trend analysis, and IDS-ready issue lists for L10 meetings.
# Run with demo data
python scripts/scorecard_builder.py
# From JSON with metrics and rocks
python scripts/scorecard_builder.py --input scorecard.json
# JSON output
python scripts/scorecard_builder.py --jsonrocks_tracker.py
Tracks 90-day company and individual rocks with binary status, blocker identification, and owner accountability.
# Run with demo data
python scripts/rocks_tracker.py
# Specify quarter
python scripts/rocks_tracker.py --quarter Q2
# From JSON
python scripts/rocks_tracker.py --input rocks.json
# JSON output
python scripts/rocks_tracker.py --jsonmeeting_pulse_designer.py
Designs company meeting rhythms, validates meeting load, identifies redundancies and gaps, and generates L10 agenda templates.
# Run with demo meetings
python scripts/meeting_pulse_designer.py
# Specify team size
python scripts/meeting_pulse_designer.py --team-size 50
# From JSON with current meetings
python scripts/meeting_pulse_designer.py --input meetings.json
# JSON output
python scripts/meeting_pulse_designer.py --json---
Troubleshooting
| Problem | Likely Cause | Fix |
|---|---|---|
| Five team leads give different answers about top 3 priorities | Alignment failure -- rocks not cascaded or not reviewed weekly | Re-run quarterly planning; review rocks weekly in L10; publish company priorities visibly |
| Same issue on the issues list for 4+ weeks | Avoidance or structural problem too scary to address | Force it: address this week or permanently remove; escalate if needed |
| Scorecard has 30+ KPIs | Metric overload -- nothing gets attention | Cut to 5-10 metrics. Only the ones that tell you if the company is on track. |
| Rocks set but never reviewed | Goals without accountability; L10 meeting not happening | Weekly L10 is non-negotiable; 5 minutes on rocks review every week |
| Leadership team skips L10 or ignores IDS | Leader non-compliance destroys the OS | CEO must enforce: leaders go first. If CEO skips, the OS dies. |
| Meetings added on top of existing meetings | Meeting fatigue from accumulation | Replace meetings, don't add them. Audit meeting inventory; eliminate redundancies |
---
Success Criteria
- Weekly L10 meeting happens every week with 90%+ leadership attendance (no exceptions for 12+ consecutive weeks)
- Scorecard reviewed weekly with red metrics discussed using IDS format (zero red metrics ignored)
- 70%+ of quarterly rocks completed as binary done/not-done by end of quarter
- Issues list: average issue resolved within 2 meetings (no issue lingers 4+ weeks)
- All team leads can articulate top 3 company priorities identically (tested quarterly)
- Meeting hours per person per week below 10 hours (measured via meeting_pulse_designer.py)
- Accountability chart reviewed and updated quarterly with zero unowned functions
---
Scope & Limitations
In Scope: Operating system selection (EOS, Scaling Up, OKR, Holacracy), accountability charts, weekly scorecards, meeting pulse design, IDS issue resolution, 90-day rocks, communication cadence, implementation roadmap.
Out of Scope: OKR software configuration, project management tool setup, Agile/Scrum methodology, sprint planning, product backlog management, HR policy development.
Limitations: Scorecard builder calculates RAG from provided data but cannot source live metrics from business systems. Rocks tracker uses manual status updates -- it cannot automatically detect completion. Meeting pulse designer provides recommendations based on team size and meeting inventory but cannot account for company-specific cultural norms. Framework comparison is directional -- actual implementation success depends on leadership commitment.
---
Integration Points
| Skill | Integration |
|---|---|
ceo-advisor | CEO sets vision that feeds 1-year plan and rocks |
coo-advisor | Owns meeting pulse and issue resolution cadence |
cfo-advisor | Financial metrics in the weekly scorecard |
cto-advisor | Engineering rocks and tech scorecard metrics |
chro-advisor | People metrics (attrition, hiring velocity) in scorecard |
culture-architect | Culture rituals integrate into meeting pulse |
strategic-alignment | Validates team rocks cascade from company rocks |
change-management | New OS rollout follows ADKAR model for adoption |
chief-of-staff | Orchestrates quarterly planning sessions and L10 follow-up |
#!/usr/bin/env python3
"""
Meeting Pulse Designer - Design and validate company meeting rhythms.
Generates meeting cadence recommendations, validates meeting load,
identifies redundancies, and produces L10 agenda templates.
"""
import argparse
import json
import sys
from datetime import datetime
RECOMMENDED_PULSE = {
"daily_standup": {"frequency": "Daily", "duration_min": 15, "who": "Each team", "purpose": "Blockers only", "required": True},
"l10_leadership": {"frequency": "Weekly", "duration_min": 90, "who": "Leadership team", "purpose": "Scorecard + IDS", "required": True},
"department_review": {"frequency": "Monthly", "duration_min": 60, "who": "Dept + leadership", "purpose": "Deep dive", "required": True},
"quarterly_planning": {"frequency": "Quarterly", "duration_min": 480, "who": "Leadership", "purpose": "Set rocks, review strategy", "required": True},
"annual_planning": {"frequency": "Annual", "duration_min": 960, "who": "Leadership", "purpose": "1-year + 3-year vision", "required": True},
"all_hands": {"frequency": "Monthly", "duration_min": 60, "who": "All employees", "purpose": "Company update + Q&A", "required": False},
"one_on_ones": {"frequency": "Weekly", "duration_min": 30, "who": "Manager + report", "purpose": "Coaching + blockers", "required": True},
}
L10_AGENDA = [
{"segment": "Good news", "duration_min": 5, "activity": "Personal + business wins"},
{"segment": "Scorecard review", "duration_min": 5, "activity": "Flag red items only"},
{"segment": "Rock review", "duration_min": 5, "activity": "On/off track for each rock"},
{"segment": "Customer/employee headlines", "duration_min": 5, "activity": "Notable events"},
{"segment": "Issues list (IDS)", "duration_min": 60, "activity": "Identify, Discuss, Solve"},
{"segment": "To-dos review", "duration_min": 5, "activity": "Last week done or not?"},
{"segment": "Conclude", "duration_min": 5, "activity": "Rate 1-10, improve next time"},
]
def design_pulse(data: dict) -> dict:
"""Design and validate meeting pulse."""
current_meetings = data.get("current_meetings", [])
team_size = data.get("team_size", 20)
leadership_count = data.get("leadership_team_size", 6)
results = {
"timestamp": datetime.now().isoformat(),
"team_size": team_size,
"recommended_pulse": [],
"current_analysis": [],
"l10_agenda": L10_AGENDA,
"meeting_load": {},
"redundancies": [],
"gaps": [],
"recommendations": [],
}
# Recommended pulse
for meeting_id, config in RECOMMENDED_PULSE.items():
results["recommended_pulse"].append({
"meeting": meeting_id.replace("_", " ").title(),
"frequency": config["frequency"],
"duration": f"{config['duration_min']} min",
"who": config["who"],
"purpose": config["purpose"],
"required": config["required"],
})
# Analyze current meetings
total_weekly_hours = 0
meeting_purposes = set()
for meeting in current_meetings:
name = meeting.get("name", "")
freq = meeting.get("frequency", "weekly")
duration = meeting.get("duration_min", 60)
attendees = meeting.get("attendees", 0)
purpose = meeting.get("purpose", "")
has_agenda = meeting.get("has_agenda", False)
produces_decisions = meeting.get("produces_decisions", False)
# Weekly equivalent hours
freq_multiplier = {"daily": 5, "weekly": 1, "biweekly": 0.5, "monthly": 0.25, "quarterly": 0.02}
weekly_hours = (duration / 60) * freq_multiplier.get(freq, 1) * attendees
meeting_purposes.add(purpose.lower())
analysis = {
"name": name,
"frequency": freq,
"duration_min": duration,
"attendees": attendees,
"weekly_person_hours": round(weekly_hours, 1),
"has_agenda": has_agenda,
"produces_decisions": produces_decisions,
"purpose": purpose,
"issues": [],
}
if not has_agenda:
analysis["issues"].append("No agenda - meetings without agendas waste time")
if not produces_decisions and duration > 30:
analysis["issues"].append("No decisions produced - consider if this meeting is needed")
if duration > 90 and freq in ["daily", "weekly"]:
analysis["issues"].append("Over 90 min for recurring meeting - energy drops after 90")
results["current_analysis"].append(analysis)
total_weekly_hours += weekly_hours
# Meeting load
hours_per_person = total_weekly_hours / team_size if team_size > 0 else 0
results["meeting_load"] = {
"total_weekly_person_hours": round(total_weekly_hours, 1),
"avg_hours_per_person": round(hours_per_person, 1),
"meeting_pct_of_week": round(hours_per_person / 40 * 100, 1),
"assessment": "Healthy" if hours_per_person <= 8 else "Heavy" if hours_per_person <= 15 else "Excessive",
}
# Find redundancies
purpose_groups = {}
for meeting in current_meetings:
p = meeting.get("purpose", "").lower()
if p not in purpose_groups:
purpose_groups[p] = []
purpose_groups[p].append(meeting.get("name", ""))
for purpose, meetings in purpose_groups.items():
if len(meetings) > 1 and purpose:
results["redundancies"].append({
"purpose": purpose,
"meetings": meetings,
"recommendation": "Consolidate into one meeting or differentiate purposes",
})
# Find gaps
essential = {"scorecard": False, "ids": False, "rocks": False, "standup": False, "planning": False}
for meeting in current_meetings:
purpose = meeting.get("purpose", "").lower()
if "scorecard" in purpose or "metrics" in purpose:
essential["scorecard"] = True
if "ids" in purpose or "issues" in purpose or "problem" in purpose:
essential["ids"] = True
if "rock" in purpose or "quarterly" in purpose:
essential["rocks"] = True
if "standup" in purpose or "daily" in purpose:
essential["standup"] = True
if "planning" in purpose or "strategy" in purpose:
essential["planning"] = True
for meeting_type, present in essential.items():
if not present:
results["gaps"].append({
"missing": meeting_type,
"impact": f"No {meeting_type} meeting detected. This is a core OS component.",
})
# Recommendations
if results["meeting_load"]["assessment"] == "Excessive":
results["recommendations"].append("Meeting load is excessive. Audit and cut meetings that don't produce decisions.")
if results["redundancies"]:
results["recommendations"].append(f"{len(results['redundancies'])} redundant meeting group(s). Consolidate.")
if results["gaps"]:
results["recommendations"].append(f"{len(results['gaps'])} missing meeting type(s). Implement to complete your OS.")
no_agenda = [m for m in results["current_analysis"] if not m["has_agenda"]]
if no_agenda:
results["recommendations"].append(f"{len(no_agenda)} meeting(s) without agendas. Add agendas or cancel.")
return results
def format_text(results: dict) -> str:
"""Format as human-readable report."""
ml = results["meeting_load"]
lines = [
"=" * 65,
"MEETING PULSE DESIGN",
"=" * 65,
f"Team Size: {results['team_size']} | Meeting Load: {ml['avg_hours_per_person']:.1f} hrs/person/week ({ml['assessment']})",
"",
"RECOMMENDED PULSE:",
f"{'Meeting':<25} {'Freq':<12} {'Duration':<10} {'Who':<18}",
"-" * 65,
]
for m in results["recommended_pulse"]:
req = "*" if m["required"] else " "
lines.append(f"{req}{m['meeting']:<24} {m['frequency']:<12} {m['duration']:<10} {m['who']:<18}")
if results["current_analysis"]:
lines.extend(["", "CURRENT MEETINGS:"])
for m in results["current_analysis"]:
issues_flag = " [!]" if m["issues"] else ""
lines.append(f" {m['name']:<25} {m['frequency']:<10} {m['duration_min']:>3}min {m['weekly_person_hours']:>5.1f}hrs/wk{issues_flag}")
for issue in m["issues"]:
lines.append(f" -> {issue}")
if results["gaps"]:
lines.extend(["", "GAPS:"])
for g in results["gaps"]:
lines.append(f" [!] Missing: {g['missing']} - {g['impact']}")
if results["redundancies"]:
lines.extend(["", "REDUNDANCIES:"])
for r in results["redundancies"]:
lines.append(f" [!] '{r['purpose']}' covered by: {', '.join(r['meetings'])}")
lines.extend(["", "L10 MEETING AGENDA (90 min):"])
for segment in L10_AGENDA:
lines.append(f" {segment['duration_min']:>2} min | {segment['segment']:<30} | {segment['activity']}")
if results["recommendations"]:
lines.extend(["", "RECOMMENDATIONS:"])
for r in results["recommendations"]:
lines.append(f" -> {r}")
lines.extend(["", "* = required for effective OS", "=" * 65])
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Design and validate meeting pulse")
parser.add_argument("--input", "-i", help="JSON file with meeting data")
parser.add_argument("--team-size", type=int, default=35, help="Company team size")
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 = {
"team_size": args.team_size,
"leadership_team_size": 6,
"current_meetings": [
{"name": "Engineering standup", "frequency": "daily", "duration_min": 15, "attendees": 12, "purpose": "daily standup", "has_agenda": True, "produces_decisions": False},
{"name": "Leadership sync", "frequency": "weekly", "duration_min": 60, "attendees": 6, "purpose": "scorecard and updates", "has_agenda": True, "produces_decisions": True},
{"name": "Product review", "frequency": "weekly", "duration_min": 60, "attendees": 8, "purpose": "product updates", "has_agenda": True, "produces_decisions": True},
{"name": "Sales pipeline", "frequency": "weekly", "duration_min": 45, "attendees": 5, "purpose": "pipeline review", "has_agenda": False, "produces_decisions": False},
{"name": "All hands", "frequency": "monthly", "duration_min": 60, "attendees": 35, "purpose": "company update", "has_agenda": True, "produces_decisions": False},
{"name": "Status update", "frequency": "weekly", "duration_min": 30, "attendees": 6, "purpose": "scorecard and updates", "has_agenda": False, "produces_decisions": False},
],
}
results = design_pulse(data)
if args.json:
print(json.dumps(results, indent=2))
else:
print(format_text(results))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
90-Day Rocks Tracker - Track quarterly rocks with binary status and accountability.
Manages company and individual rocks with on/off track status,
accountability assignments, and quarterly review preparation.
"""
import argparse
import json
import sys
from datetime import datetime
def track_rocks(data: dict) -> dict:
"""Track 90-day rocks status."""
company_rocks = data.get("company_rocks", [])
individual_rocks = data.get("individual_rocks", [])
quarter = data.get("quarter", "Q1")
results = {
"timestamp": datetime.now().isoformat(),
"quarter": quarter,
"company_rocks": {"total": 0, "on_track": 0, "off_track": 0, "complete": 0, "rocks": []},
"individual_summary": {},
"individual_rocks": [],
"issues": [],
"recommendations": [],
}
for rock in company_rocks:
status = rock.get("status", "on_track")
result = {
"description": rock.get("description", ""),
"owner": rock.get("owner", ""),
"status": status,
"due_date": rock.get("due_date", ""),
"progress_note": rock.get("progress_note", ""),
"blocker": rock.get("blocker", ""),
}
results["company_rocks"]["rocks"].append(result)
results["company_rocks"]["total"] += 1
if status == "complete":
results["company_rocks"]["complete"] += 1
elif status == "on_track":
results["company_rocks"]["on_track"] += 1
else:
results["company_rocks"]["off_track"] += 1
if result["blocker"]:
results["issues"].append({
"rock": result["description"][:50],
"owner": result["owner"],
"blocker": result["blocker"],
"type": "company_rock",
})
for rock in individual_rocks:
owner = rock.get("owner", "")
status = rock.get("status", "on_track")
result = {
"description": rock.get("description", ""),
"owner": owner,
"status": status,
"due_date": rock.get("due_date", ""),
}
results["individual_rocks"].append(result)
if owner not in results["individual_summary"]:
results["individual_summary"][owner] = {"total": 0, "on_track": 0, "off_track": 0, "complete": 0}
results["individual_summary"][owner]["total"] += 1
if status == "complete":
results["individual_summary"][owner]["complete"] += 1
elif status == "on_track":
results["individual_summary"][owner]["on_track"] += 1
else:
results["individual_summary"][owner]["off_track"] += 1
# Recommendations
cr = results["company_rocks"]
if cr["total"] > 7:
results["recommendations"].append(f"Too many company rocks ({cr['total']}). Max 7. Prioritize ruthlessly.")
if cr["off_track"] > 0:
results["recommendations"].append(f"{cr['off_track']} company rock(s) off track. Address in L10.")
for owner, summary in results["individual_summary"].items():
if summary["total"] > 7:
results["recommendations"].append(f"{owner} has {summary['total']} rocks (max 7). Reduce or delegate.")
if summary["off_track"] >= 2:
results["recommendations"].append(f"{owner} has {summary['off_track']} rocks off track. Capacity issue.")
return results
def format_text(results: dict) -> str:
"""Format as L10-ready rocks review."""
cr = results["company_rocks"]
lines = [
"=" * 65,
f"90-DAY ROCKS TRACKER - {results['quarter']}",
"=" * 65,
f"Company: {cr['complete']} done / {cr['on_track']} on track / {cr['off_track']} off track (of {cr['total']})",
"",
"COMPANY ROCKS:",
]
for r in cr["rocks"]:
icon = "[x]" if r["status"] == "complete" else "[~]" if r["status"] == "on_track" else "[!]"
lines.append(f" {icon} {r['description']} ({r['owner']}, due: {r['due_date']})")
if r["blocker"]:
lines.append(f" Blocker: {r['blocker']}")
lines.extend(["", "INDIVIDUAL ROCKS BY OWNER:"])
for owner, summary in results["individual_summary"].items():
lines.append(f" {owner}: {summary['complete']}x / {summary['on_track']}~ / {summary['off_track']}! (of {summary['total']})")
if results["issues"]:
lines.extend(["", "ISSUES FOR IDS:"])
for issue in results["issues"]:
lines.append(f" >> {issue['rock']}... ({issue['owner']}): {issue['blocker']}")
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="Track 90-day rocks")
parser.add_argument("--input", "-i", help="JSON file with rocks data")
parser.add_argument("--quarter", default="Q1", help="Quarter label")
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 = {
"quarter": args.quarter,
"company_rocks": [
{"description": "Hit $3M ARR", "owner": "CRO", "status": "on_track", "due_date": "2026-03-31"},
{"description": "Launch enterprise tier", "owner": "CPO", "status": "off_track", "due_date": "2026-03-31", "blocker": "API redesign delayed by 3 weeks"},
{"description": "Achieve SOC 2 Type I", "owner": "CISO", "status": "on_track", "due_date": "2026-03-31"},
{"description": "Hire 5 key roles", "owner": "CHRO", "status": "off_track", "due_date": "2026-03-31", "blocker": "2 offers declined, comp bands may need refresh"},
],
"individual_rocks": [
{"description": "Close 3 enterprise deals", "owner": "CRO", "status": "on_track", "due_date": "2026-03-31"},
{"description": "Reduce MTTR to < 4 hours", "owner": "CTO", "status": "complete", "due_date": "2026-03-31"},
{"description": "Launch content hub", "owner": "CMO", "status": "on_track", "due_date": "2026-03-31"},
{"description": "Implement weekly L10", "owner": "COO", "status": "complete", "due_date": "2026-02-28"},
{"description": "Build hiring scorecard v2", "owner": "CHRO", "status": "off_track", "due_date": "2026-03-31"},
],
}
results = track_rocks(data)
if args.json:
print(json.dumps(results, indent=2))
else:
print(format_text(results))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Company Scorecard Builder - Build and track weekly company scorecards.
Manages 5-15 weekly metrics with owners, targets, and RAG status.
Identifies trends, flags issues for L10 discussion, and generates
IDS-ready issue lists.
"""
import argparse
import json
import sys
from datetime import datetime
def build_scorecard(data: dict) -> dict:
"""Build company scorecard with status and trends."""
metrics = data.get("metrics", [])
weeks_of_data = data.get("weeks", 1)
results = {
"timestamp": datetime.now().isoformat(),
"metrics_count": len(metrics),
"summary": {"green": 0, "yellow": 0, "red": 0},
"scorecard": [],
"issues_for_ids": [],
"rocks_status": [],
"recommendations": [],
}
if len(metrics) > 15:
results["recommendations"].append(f"Too many metrics ({len(metrics)}). Maximum 15. Cut to focus attention.")
elif len(metrics) < 5:
results["recommendations"].append(f"Only {len(metrics)} metrics. Consider adding to cover blind spots.")
for m in metrics:
name = m.get("name", "")
owner = m.get("owner", "Unassigned")
target = m.get("target", 0)
current = m.get("current", 0)
previous = m.get("previous", None)
direction = m.get("direction", "higher_is_better")
fmt = m.get("format", "number")
weeks_red = m.get("consecutive_weeks_red", 0)
# RAG calculation
if target == 0:
status = "N/A"
elif direction == "higher_is_better":
ratio = current / target
status = "G" if ratio >= 0.95 else "Y" if ratio >= 0.85 else "R"
elif direction == "lower_is_better":
ratio = current / target
status = "G" if ratio <= 1.05 else "Y" if ratio <= 1.15 else "R"
else:
status = "G" if abs(current - target) / target < 0.05 else "Y" if abs(current - target) / target < 0.10 else "R"
# Trend
if previous is not None:
if direction == "higher_is_better":
trend = "Improving" if current > previous else "Declining" if current < previous else "Flat"
else:
trend = "Improving" if current < previous else "Declining" if current > previous else "Flat"
else:
trend = "N/A"
metric_result = {
"name": name,
"owner": owner,
"target": target,
"current": current,
"previous": previous,
"status": status,
"trend": trend,
"consecutive_weeks_red": weeks_red + (1 if status == "R" else 0),
"needs_discussion": status == "R",
}
results["scorecard"].append(metric_result)
if status == "G":
results["summary"]["green"] += 1
elif status == "Y":
results["summary"]["yellow"] += 1
elif status == "R":
results["summary"]["red"] += 1
results["issues_for_ids"].append({
"metric": name,
"owner": owner,
"current_value": current,
"target": target,
"weeks_red": metric_result["consecutive_weeks_red"],
"suggested_ids_format": f"IDENTIFY: {name} is below target ({current} vs {target}). Root cause?",
})
# Rocks status
rocks = data.get("rocks", [])
for rock in rocks:
results["rocks_status"].append({
"rock": rock.get("description", ""),
"owner": rock.get("owner", ""),
"status": rock.get("status", "on_track"),
"due": rock.get("due_date", ""),
})
# Recommendations
red_count = results["summary"]["red"]
if red_count >= 3:
results["recommendations"].append(f"{red_count} metrics in RED. Prioritize in L10 IDS discussion.")
chronic_red = [m for m in results["scorecard"] if m["consecutive_weeks_red"] >= 3]
if chronic_red:
results["recommendations"].append(
f"{len(chronic_red)} metric(s) red for 3+ weeks: {', '.join(m['name'] for m in chronic_red)}. "
"Either the target is wrong or the plan isn't working. Force resolution."
)
off_track_rocks = [r for r in results["rocks_status"] if r["status"] == "off_track"]
if off_track_rocks:
results["recommendations"].append(f"{len(off_track_rocks)} rock(s) off track. Address in L10.")
return results
def format_text(results: dict) -> str:
"""Format as L10-ready scorecard."""
s = results["summary"]
lines = [
"=" * 70,
"WEEKLY SCORECARD",
"=" * 70,
f"Date: {results['timestamp'][:10]} | {s['green']}G / {s['yellow']}Y / {s['red']}R",
"",
f"{'Metric':<22} {'Owner':<10} {'Current':>10} {'Target':>10} {'RAG':>5} {'Trend':<12}",
"-" * 70,
]
for m in results["scorecard"]:
rag = f"[{m['status']}]"
discuss = " <<" if m["needs_discussion"] else ""
lines.append(
f"{m['name']:<22} {m['owner']:<10} {m['current']:>10} {m['target']:>10} "
f"{rag:>5} {m['trend']:<12}{discuss}"
)
if results["issues_for_ids"]:
lines.extend(["", "IDS ISSUES (discuss in L10):"])
for issue in results["issues_for_ids"]:
lines.append(f" >> {issue['suggested_ids_format']} ({issue['owner']}, {issue['weeks_red']}w red)")
if results["rocks_status"]:
lines.extend(["", "ROCKS:"])
for r in results["rocks_status"]:
icon = "[x]" if r["status"] == "complete" else "[~]" if r["status"] == "on_track" else "[!]"
lines.append(f" {icon} {r['rock']} ({r['owner']}, due: {r['due']})")
if results["recommendations"]:
lines.extend(["", "RECOMMENDATIONS:"])
for r in results["recommendations"]:
lines.append(f" -> {r}")
lines.extend(["", "<< = needs L10 discussion", "=" * 70])
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Build and track weekly company scorecard")
parser.add_argument("--input", "-i", help="JSON file with scorecard 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 = {
"metrics": [
{"name": "New MRR", "owner": "CRO", "target": 50000, "current": 43000, "previous": 47000, "direction": "higher_is_better", "consecutive_weeks_red": 1},
{"name": "Logo Churn", "owner": "CS Lead", "target": 1.0, "current": 0.8, "previous": 0.9, "direction": "lower_is_better", "consecutive_weeks_red": 0},
{"name": "Active Users", "owner": "CPO", "target": 2000, "current": 2150, "previous": 2050, "direction": "higher_is_better", "consecutive_weeks_red": 0},
{"name": "Deployments/wk", "owner": "CTO", "target": 3, "current": 3, "previous": 3, "direction": "higher_is_better", "consecutive_weeks_red": 0},
{"name": "Critical Bugs", "owner": "CTO", "target": 0, "current": 2, "previous": 1, "direction": "lower_is_better", "consecutive_weeks_red": 2},
{"name": "Runway (mo)", "owner": "CFO", "target": 18, "current": 16, "previous": 17, "direction": "higher_is_better", "consecutive_weeks_red": 3},
{"name": "Offer Accept %", "owner": "CHRO", "target": 85, "current": 90, "previous": 80, "direction": "higher_is_better", "consecutive_weeks_red": 0},
],
"rocks": [
{"description": "Implement CRM with pipeline stages", "owner": "CRO", "status": "on_track", "due_date": "2026-03-31"},
{"description": "Hire 3 senior engineers", "owner": "CTO", "status": "off_track", "due_date": "2026-04-15"},
{"description": "Reduce churn from 3% to 1.5%", "owner": "CS Lead", "status": "on_track", "due_date": "2026-06-30"},
],
}
results = build_scorecard(data)
if args.json:
print(json.dumps(results, indent=2))
else:
print(format_text(results))
if __name__ == "__main__":
main()
Related skills
FAQ
Which frameworks does it compare?
EOS, Scaling Up, OKR-Native, and Holacracy.
How many scorecard metrics does it recommend?
5 to 15 metrics maximum, each with an owner and a weekly target.