Manages the full goal lifecycle: creation, milestone tracking, progress updates, and closure. Activates when the user wants to set, create, update, or close a goal, log a milestone, or asks 'add a new goal for [objective].' Handles CRUD operations, progress calculation, and Notion database management.
From founder-osnpx claudepluginhub thecloudtips/founder-os --plugin founder-osThis skill uses the workspace's default tool permissions.
references/milestone-progress-formula.mdreferences/status-lifecycle.mdDesigns and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Manage the full lifecycle of founder goals — creation, milestone tracking, progress calculation, and closure — with Notion as the persistent backend. Operate on a dual-database design: a Goals DB stores top-level goal records with progress metadata, and a Milestones DB stores ordered sub-tasks linked to their parent goal via a Notion relation property. Calculate progress automatically from milestone completion state, enforce idempotent upserts to prevent duplicates, and maintain an append-only audit trail in the Notes field.
Store each goal as a single page with 14 properties:
| Property | Type | Purpose |
|---|---|---|
| Title | title | Goal name (primary key for upsert matching) |
| Description | rich_text | Expanded description of the goal |
| Status | select | Current lifecycle state: Not Started, In Progress, On Hold, Completed, Archived |
| Progress | number (percent) | Computed progress 0-100, updated on every milestone change or manual override |
| Target Date | date | Intended completion date |
| Start Date | date | Date goal moved to In Progress (auto-set on first progress update) |
| Category | select | One of 8 categories (see Category Taxonomy below) |
| RAG Status | select | Red, Amber, Green — derived from progress vs. target date trajectory |
| Projected Completion | date | Estimated completion based on velocity from Progress Snapshots |
| Milestone Count | number | Total milestones linked to this goal (excluding Skipped) |
| Completed Milestones | number | Count of milestones with Status = Done |
| Progress Snapshots | rich_text | JSON array of {"date": "YYYY-MM-DD", "progress": N} entries for velocity calculation |
| Notes | rich_text | Append-only log of updates, context, and decisions |
| Created At | date | Timestamp of initial goal creation |
Store each milestone as a page with 8 properties:
| Property | Type | Purpose |
|---|---|---|
| Title | title | Milestone name (verb-first format) |
| Goal | relation | Relation to Goals DB (parent goal link) |
| Status | select | Not Started, In Progress, Done, Skipped |
| Due Date | date | Target completion date for this milestone |
| Completed At | date | Actual completion timestamp (set when Status moves to Done) |
| Order | number | Sequential position within the goal (1-based) |
| Notes | rich_text | Append-only context for this milestone |
| Created At | date | Timestamp of milestone creation |
Create the Goals DB before the Milestones DB. The Milestones DB depends on the Goals DB existing first because the Goal relation property references it by database ID. Attempting to create the Milestones DB first will fail or produce an orphaned relation.
Follow this sequence every time a command needs to read or write goal data:
Manage status transitions according to these rules:
| From | To | Trigger |
|---|---|---|
| Not Started | In Progress | First progress update, first milestone started, or manual status change |
| In Progress | On Hold | Manual via /founder-os:goal:update --status=on-hold |
| In Progress | Completed | Progress reaches 100%, all milestones Done, or manual close via /founder-os:goal:close |
| On Hold | In Progress | Manual resume via /founder-os:goal:update --status=in-progress |
| Any | Archived | Manual via /founder-os:goal:close --archive |
Auto-set Start Date to today when a goal transitions from Not Started to In Progress for the first time. Never overwrite an existing Start Date on subsequent transitions.
Prevent invalid transitions: a goal cannot move from Completed back to In Progress (require unarchive or re-open as a new goal). A goal cannot move from Archived to any state without explicit --reopen confirmation.
Reference ${CLAUDE_PLUGIN_ROOT}/skills/goal/goal-tracking/references/status-lifecycle.md for the full transition matrix, guard conditions, and error messages for each invalid transition.
Calculate goal progress from milestone completion state using:
progress = (completed_count + in_progress_count * 0.5) / total_active * 100
Define the variables:
completed_count — milestones with Status = Donein_progress_count — milestones with Status = In Progresstotal_active — all milestones except those with Status = SkippedApply partial credit: each In Progress milestone contributes 0.5 to the numerator. This prevents progress from stalling at 0% when work has begun but no milestone is fully complete.
Round the result to the nearest integer. Clamp to the range 0-100.
After every progress recalculation, append a new entry to the Progress Snapshots field: {"date": "YYYY-MM-DD", "progress": N}. Use these snapshots for velocity calculation and projected completion estimation.
Reference ${CLAUDE_PLUGIN_ROOT}/skills/goal/goal-tracking/references/milestone-progress-formula.md for edge cases, division-by-zero handling, and worked examples.
Assign each goal to one of 8 categories:
| Category | Auto-Detection Signals |
|---|---|
| Revenue | "revenue", "sales", "ARR", "MRR", "pricing", "deal", "close", "pipeline" |
| Product | "launch", "ship", "feature", "release", "MVP", "beta", "roadmap", "build" |
| Operations | "process", "workflow", "SOP", "efficiency", "automate", "streamline" |
| Team | "hire", "onboard", "culture", "team", "recruit", "retain", "1:1" |
| Personal | "health", "fitness", "learn", "read", "habit", "meditation", "balance" |
| Technical | "infrastructure", "migrate", "deploy", "refactor", "API", "database", "security" |
| Marketing | "content", "SEO", "social", "brand", "campaign", "awareness", "funnel" |
| Other | Fallback when no signals match |
Apply auto-detection by scanning the goal title and description for keyword matches. Use case-insensitive matching. When multiple categories match, select the one with the highest keyword hit count. When the user explicitly provides a category via --category, always use the explicit value and skip auto-detection.
Match existing goals by Title using case-insensitive comparison. When a goal with the same title already exists:
Match existing milestones by Title + Goal relation. When a milestone with the same title already exists under the same parent goal:
Never overwrite or replace the Notes field on any goal or milestone. Always prepend new entries at the top of the existing content using the format:
[YYYY-MM-DD] New note content here.
[previous entries preserved below]
Preserve all existing Notes content verbatim. This creates a reverse-chronological audit trail of all changes, decisions, and context updates for each goal and milestone.
Apply these rules when creating or renaming goals:
Apply these rules when creating milestones:
When a goal has no milestones, progress cannot be calculated from the milestone formula. Instead:
/founder-os:goal:update --progress=N.When every milestone under a goal has Status = Skipped, total_active equals zero. Handle this case:
When the user attempts to close a goal via /founder-os:goal:close and one or more milestones remain with Status = Not Started or In Progress:
--force flag to proceed.[YYYY-MM-DD] Goal closed with N incomplete milestone(s).When a user attempts to create a goal with a title that matches an existing goal (case-insensitive):
When a user creates or updates a goal with a Target Date that has already passed:
[YYYY-MM-DD] Target date is in the past. RAG set to Red.When the last active milestone transitions to Done and progress reaches 100%:
[YYYY-MM-DD] All milestones completed. Goal auto-closed.Consult these reference files for detailed algorithms and worked examples:
${CLAUDE_PLUGIN_ROOT}/skills/goal/goal-tracking/references/milestone-progress-formula.md — Full formula specification with division-by-zero guards, partial credit rules, rounding behavior, and step-by-step worked examples for common and edge-case scenarios.${CLAUDE_PLUGIN_ROOT}/skills/goal/goal-tracking/references/status-lifecycle.md — Complete transition matrix covering all valid and invalid status changes, guard conditions for each transition, auto-trigger rules, and error messages to display for blocked transitions.