- name
- initiative-tracker
- description
- |
- allowed-tools
- Read, Write, Edit, Glob, Grep, Bash(python:*)
Initiative Tracker Skill - Complete Documentation
Overview
Conversational interface for managing product initiatives as Logseq-compatible markdown files. This skill enables natural language commands to create, update, and track initiatives, epics, and stakeholders with automatic completeness calculation and history tracking.
Data Storage: Logseq-compatible markdown files with YAML frontmatter Output: Structured markdown files in initiatives/ directory
Available Commands
This skill provides natural language commands for managing product initiatives. All commands can be invoked using the / prefix.
Repository Setup
/init_repository- Create folder structure in current directory/help- List available commands
Initiative Management
/create_initiative <id> <title> [jira_id]- Create new initiative/list_initiatives [--status=X] [--completeness<N]- List all with completeness/show_initiative <id|jira_id>- Display full details/update_initiative <id> <field> <value>- Modify field/what_missing <id>- Show incomplete fields
Epic Management
/create_epic <id> <title> <initiative_id> [jira_id]- Create new epic/list_epics [--initiative=X] [--status=X]- List epics/show_epic <id|jira_id>- Display full details
Entity Management
/create_person <id> <name>- Create person/create_team <id> <name>- Create team/create_partner <id> <name>- Create partner/create_product_area <id> <name>- Create product area/list_product_areas- List all product areas/show_product_area <id>- Show product area details/update_product_area <id> <field> <value>- Update product area field
Data Location
All data stored in initiatives/ directory:
initiatives/
├── _schema/schema-v1.md # Schema definition
├── _index/jira-mapping.md # Jira ID lookup
├── initiatives/*.md # Initiative files
├── epics/*.md # Epic files
├── people/*.md # Person files
├── teams/*.md # Team files
├── partners/*.md # Partner files
└── product-areas/*.md # Product area filesFile Format
All entities use YAML frontmatter + markdown body + history log:
---
id: device-onboarding
title: Device Onboarding Simplification
status: Draft
completeness: 45
created_at: 2026-01-21T10:00:00+01:00
updated_at: 2026-01-21T10:00:00+01:00
---
# Device Onboarding Simplification
## Expected Outcome
(content here)
## History
H-a1b2c3 | 2026-01-21T10:00:00+01:00 | created | | | | user | Initial creationWikilinks
Reference other entities with [[path/id]] syntax:
- People:
[[people/anna-andersson]] - Teams:
[[teams/platform-team]] - Partners:
[[partners/partner-alpha]] - ProductAreas:
[[product-areas/customer-management]] - Epics:
[[epics/qr-scanner]]
Completeness Calculation
Auto-calculated percentage based on filled recommended fields:
- 90-100%: Complete
- 70-89%: Mostly complete
- 50-69%: Partially complete
- 0-49%: Incomplete
Display format: 92% ████████░░
Status Workflow
Initiative Status
Draft → Defined → Planned → In Progress → Finished or Abandoned
Each transition has required fields - see status-transitions.md.
Epic Status
Not Started → In Progress → Done or Abandoned
History Tracking
Every change creates a history entry:
ID | TIMESTAMP | ACTION | FIELD | OLD_VALUE | NEW_VALUE | ACTOR | NOTEHistory ID format: H-xxxxxx (6 alphanumeric characters)
Actions: created, field_updated, status_changed, stakeholder_added, etc.
Implementation Instructions
CRITICAL REQUIREMENTS:
- This skill MUST persist all data to disk using the Python scripts
- Never simulate operations - always write actual files
- Always build and use the index for queries
- Always get user approval before writing data
Skill Initialization
ALWAYS do this when the skill is first invoked:
- Build/load the search index for fast querying:
python .claude/skills/initiative-tracker/scripts/build_index.py- Read the index into memory:
Read tool: initiatives/_index/index.json- Parse and store the index JSON in memory for the session
This enables instant queries even with hundreds of entities.
Approval Workflow
⚠️ CRITICAL: User Approval Required
BEFORE writing any data to disk, you MUST:
- Show a preview of what will be written:
- Display the complete file content (frontmatter + body + history) - Show the file path where it will be saved - Show the completeness percentage
- Ask for user approval using one of these methods:
- Use AskUserQuestion tool with options: "Approve", "Modify", "Cancel" - Wait for explicit user confirmation
- Only proceed if user approves:
- If "Approve": Write the file as shown - If "Modify": Ask what changes are needed, update preview, ask again - If "Cancel": Abort the operation, don't write anything
- After writing: Confirm success and show the actual file path created
This applies to ALL commands that write data: /create_initiative, /update_initiative, /create_epic, /create_person, /create_team, /create_partner
Path Conventions
- Python scripts are in:
.claude/skills/initiative-tracker/scripts/ - Data files are in:
initiatives/(at project root) - Always use relative paths from project root
- Use forward slashes in paths for cross-platform compatibility
Index System for Fast Querying
⚠️ CRITICAL: Performance Requirement
For performance at scale, this skill uses an in-memory index for fast queries.
Index Location
The index is stored at: initiatives/_index/index.json
It contains metadata for all entities (initiatives, epics, people, teams, partners, product areas) extracted from their markdown files.
Build/Rebuild the Index
At skill startup, ALWAYS build/load the index:
- Build the index from all markdown files:
python .claude/skills/initiative-tracker/scripts/build_index.pyThis creates/updates initiatives/_index/index.json
- Load the index into memory using Read tool:
Read tool: initiatives/_index/index.json- Parse the JSON and keep it in memory for the session
Rebuild the index AFTER every write operation:
- After creating/updating initiatives, epics, people, teams, partners, or product areas
- Run the build_index.py script again
- Reload the updated index
Using the Index for Queries
ALWAYS prefer index-based queries over file globbing/reading:
For /list_initiatives:
- Use the index instead of globbing files
- Filter initiatives array by status/completeness in memory
- Much faster, especially with 100+ initiatives
For /list_epics:
- Use the epics array from index
- Filter by initiative_id or status in memory
For searches:
- Find all initiatives where a person is initiator: filter index by initiator field
- Find all initiatives with a specific stakeholder: filter by stakeholders array
- Find all epics for an initiative: filter epics by initiative_id
- Find all open actions assigned to a person: filter initiatives by actions array
- Find initiatives with overdue actions: filter by actions with due_date < today
- Find initiatives with >3 open questions: filter by open_question_count > 3
Action queries (using index):
# Example: Get all my open actions
my_actions = []
for initiative in index['initiatives']:
for action in initiative.get('actions', []):
if action.get('assigned_to') == 'my-id' and action['status'] == 'Open':
my_actions.append({
'initiative': initiative['id'],
'action_id': action['id'],
'description': action['description'],
'due_date': action.get('due_date'),
})When to read actual files:
/show_initiative- need full body content and history/update_initiative- need to modify and write back/add_action,/complete_action- need to modify body sections- Any operation requiring full markdown content or full action descriptions
Index Structure
IMPORTANT: The index contains ONLY small metadata fields, NOT large text content.
Indexed fields (small):
- IDs, titles, status, completeness, jira_id
- References (initiator, stakeholders, team members as ID lists)
- Small metadata (timestamps, affected_systems, planned_quarter)
- Flags (deleted)
- Embedded actions (id, description, status, assigned_to, due_date)
- Embedded questions (id, status)
- Counts (action_count, open_action_count, open_question_count)
NOT indexed (large text):
- expected_outcome, outcome_validation (initiatives)
- description, acceptance_criteria (epics)
- notes (all entities)
- Body content, history entries
- Full question text, answers
- Solution details, pros/cons
This keeps the index small (<100KB even with 500+ entities) for fast loading.
{
"metadata": {
"generated_at": "2026-01-21 22:00",
"total_entities": 10
},
"initiatives": [
{
"id": "app-management",
"type": "initiative",
"file_path": "initiatives/initiatives/app-management.md",
"title": "Application Management",
"status": "Draft",
"completeness": 25,
"jira_id": "PROJ-100",
"initiator": ["olle-jansson"],
"stakeholders": ["acme-inc"],
"intended_users": [],
"affected_systems": ["agent"],
"epics": [],
"actions": [
{
"id": "ACT-001",
"description": "Review security requirements",
"status": "Open",
"assigned_to": "olle-jansson",
"due_date": "2026-01-25"
},
{
"id": "ACT-002",
"description": "Schedule kickoff meeting",
"status": "Done"
}
],
"questions": [
{
"id": "Q-001",
"status": "Open"
}
],
"action_count": 2,
"open_action_count": 1,
"open_question_count": 1,
"created_at": "2026-01-21 22:32",
"updated_at": "2026-01-21 22:35",
"deleted": false
}
],
"epics": [...],
"people": [...],
"teams": [...],
"partners": [...],
"product_areas": [...]
}Performance Benefits
- Listing 500 epics: ~1ms (index) vs ~5 seconds (file globbing)
- Complex searches: Instant (filter in memory) vs very slow (scan all files)
- Finding relationships: Fast array operations vs nested file reads
Command: /create_initiative <id> <title> [jira_id]
Step 1: Prepare the initiative
- Generate history ID:
python .claude/skills/initiative-tracker/scripts/generate_history_id.py- Calculate completeness (will be 0 for new Draft initiative)
- Build JSON frontmatter with required fields:
{
"id": "<id>",
"title": "<title>",
"status": "Draft",
"jira_id": "<jira_id or empty>",
"initiator": "",
"expected_outcome": "",
"outcome_validation": "",
"intended_users": [],
"stakeholders": [],
"source_document": "",
"source_jira_id": "",
"solution_design": "",
"epics": [],
"user_journey": "",
"ui_design": "",
"affected_systems": []
}- Build initial body content (markdown):
# <title>
## Expected Outcome
(Describe what success looks like for this initiative)
## Outcome Validation
(How will we measure/verify the outcome was achieved?)
## Intended Users
(Who benefits from this initiative?)
## Solutions
(Proposed approaches - add solutions as subsections)
## Actions
(Action items - use checkbox format)
## Open Questions
(Unresolved questions - use checkbox format)Step 2: Show preview and get approval
- Display the complete file preview to user:
📄 Preview: initiatives/initiatives/<id>.md
Completeness: 0% (Draft status)
---
[Show complete YAML frontmatter]
---
[Show complete body content]
## History
[Show history entry]- Ask for user approval using AskUserQuestion:
- Options: "Approve and create", "Modify content", "Cancel"
Step 3: Write if approved
- If user approves, write the file using Write tool to
initiatives/initiatives/<id>.md:
- Combine frontmatter (YAML between ---), body, and history - Ensure proper formatting
- Confirm file was created by reading back:
initiatives/initiatives/<id>.md - Rebuild the index to include the new initiative:
python .claude/skills/initiative-tracker/scripts/build_index.py- Reload the index into memory for subsequent queries
- Report success to user: "✓ Initiative <id> created at initiatives/initiatives/<id>.md (0% complete)"
Command: /update_initiative <id> <field> <value>
Step 1: Read and prepare update
- Read the initiative file using Read tool:
initiatives/initiatives/<id>.md - Parse YAML frontmatter and body content
- Identify the change:
- If field is in frontmatter: update frontmatter - If field is in body (expected_outcome, outcome_validation): update markdown section
- Generate new history ID:
python .claude/skills/initiative-tracker/scripts/generate_history_id.py- Create history entry with old/new values
- Update
updated_attimestamp to current time - Recalculate completeness using the completeness script
Step 2: Show preview of changes
- Display a diff preview to user:
📄 Updating: initiatives/initiatives/<id>.md
CHANGES:
- <field>: "<old_value>" → "<new_value>"
- updated_at: "<old_timestamp>" → "<new_timestamp>"
- completeness: <old_%> → <new_%>
NEW HISTORY ENTRY:
<history_id> | <timestamp> | field_updated | <field> | <old> | <new> | <actor> | <note>
[Optionally show full file preview if major change]- Ask for user approval using AskUserQuestion:
- Options: "Approve changes", "Modify", "Cancel"
Step 3: Write if approved
- If approved, write complete updated file using Write tool to
initiatives/initiatives/<id>.md - Confirm update by reading file back
- Rebuild the index to reflect the changes:
python .claude/skills/initiative-tracker/scripts/build_index.py- Reload the index into memory
- Report success: "✓ Updated <field> in <id> (completeness: <new_%>)"
Command: /list_initiatives [--status=X] [--completeness<N] [--product-area=X]
Use the index for fast querying (see Index System section above)
- Ensure index is loaded in memory (if not, load it from
initiatives/_index/index.json) - Filter the
initiativesarray from index:
- If --status=X provided: filter where status === X - If --completeness<N provided: filter where completeness < N - If --product-area=X provided: filter where product_area contains X
- Format as table:
| ID | Title | Status | Product Area | Completeness |
|---|---|---|---|---|
| <id> | <title> | <status> | <product_area> | <completeness>% <bar> |Where <bar> is a visual bar like ████████░░ (10 characters, filled proportional to percentage).
- Display table to user with total count.
Performance: This is instant even with 100+ initiatives (no file I/O required).
Command: /show_initiative <id|jira_id>
- If jira_id provided, read
initiatives/_index/jira-mapping.mdto map to id. - Read initiative file:
initiatives/initiatives/<id>.md - Parse frontmatter, body, and history.
- Display formatted output:
- Title and basic info - All frontmatter fields - Body content sections - History entries (last 5) - Completeness percentage with bar
Command: /what_missing <id>
- Read initiative file:
initiatives/initiatives/<id>.md - Parse frontmatter.
- Call:
python scripts/calculate_completeness.py initiative '<json_frontmatter>' - Check which recommended fields are empty:
- intended_users - stakeholders - source_document - affected_systems
- Check required fields for current status (see references/status-transitions.md).
- Display missing fields grouped by category:
- Missing required fields (blocks status transition) - Missing recommended fields (reduces completeness)
Command: /init_repository
- Run Python script from project root:
python .claude/skills/initiative-tracker/scripts/init_repository.py- This creates the directory structure in
initiatives/at project root. - Confirm directories exist using Glob or Bash ls.
- Report success to user.
Command: /create_epic <id> <title> <initiative_id> [jira_id]
- Generate history ID:
python .claude/skills/initiative-tracker/scripts/generate_history_id.py- Build JSON frontmatter:
{
"id": "<id>",
"title": "<title>",
"initiative_id": "<initiative_id>",
"status": "Not Started",
"jira_id": "<jira_id or empty>",
"assigned_team": "",
"planned_quarter": "",
"description": "",
"acceptance_criteria": [],
"dependencies": []
}- Build body content:
# <title>
## Description
(What this epic delivers)
## Acceptance Criteria
- [ ] Criterion 1
- [ ] Criterion 2- Call write_entity.py to create
initiatives/epics/<id>.md:
python .claude/skills/initiative-tracker/scripts/write_entity.py "initiatives/epics/<id>.md" "epic" '<json>' '<body>'- Update parent initiative to add epic wikilink reference:
[[epics/<id>]] - Report success.
Command: /list_epics [--initiative=X] [--status=X] [--product-area=X]
Use the index for fast querying (see Index System section above)
- Ensure index is loaded in memory (if not, load it from
initiatives/_index/index.json) - Filter the
epicsarray from index:
- If --initiative=X provided: filter where initiative_id === X - If --status=X provided: filter where status === X - If --product-area=X provided: filter where product_area contains X
- Format as table showing: id, title, initiative_id, product_area, status, completeness
- Display table to user with total count.
Performance: Instant even with 500+ epics.
Command: /create_person <id> <name>
- Build frontmatter with id, name.
- Create file at
initiatives/people/<id>.md. - Use write_entity.py script.
Command: /create_team <id> <name>
- Build frontmatter with id, name.
- Create file at
initiatives/teams/<id>.md. - Use write_entity.py script.
Command: /create_partner <id> <name>
- Build frontmatter with id, name.
- Create file at
initiatives/partners/<id>.md. - Use write_entity.py script.
Command: /create_product_area <id> <name>
- Build frontmatter with id, name.
- Create file at
initiatives/product-areas/<id>.md. - Use write_entity.py script.
Command: /list_product_areas
Use the index for fast querying
- Ensure index is loaded in memory (if not, load it from
initiatives/_index/index.json) - Get all product areas from the
product_areasarray in index - Format as table showing: id, name, product_manager, line_manager, completeness
- Display table to user with total count.
Performance: Instant even with 100+ product areas.
Command: /show_product_area <id>
- Read product area file:
initiatives/product-areas/<id>.md - Parse frontmatter, body, and history.
- Display formatted output:
- Name and basic info - All team roles (product_manager, line_manager, product_owner, architect, ux_designer) - Focus area - Body content sections - History entries (last 5) - Completeness percentage with bar - List of initiatives assigned to this product area (from index) - List of epics assigned to this product area (from index)
Command: /update_product_area <id> <field> <value>
Follow the same pattern as /update_initiative:
- Read the product area file
- Parse YAML frontmatter and body
- Update the specified field
- Generate new history entry
- Recalculate completeness
- Show preview and get user approval
- Write updated file if approved
- Rebuild index
Embedded Entity Commands
These commands manage actions, questions, and solutions within initiatives.
Command: /add_action <initiative_id> <description> [--assigned=person_id] [--due=YYYY-MM-DD]
Add an action item to an initiative.
Step 1: Prepare the action
- Read initiative file:
initiatives/initiatives/<initiative_id>.md - Parse current content (frontmatter, body, history)
- Generate unique action ID (auto-increment: ACT-001, ACT-002, etc.)
- Generate history ID for this change
- Build action entry:
- [ ] ACT-XXX: <description>
assigned:: [[people/<person_id>]]
due:: YYYY-MM-DD
status:: Open
created_at:: YYYY-MM-DD HH:MMStep 2: Show preview
- Display preview of the action to be added:
📄 Adding action to: <initiative_id>
NEW ACTION:
- [ ] ACT-003: Schedule UX review session with design team
assigned:: [[people/anna-andersson]]
due:: 2026-01-28
status:: Open
created_at:: 2026-01-21 23:15
This will be added to the "## Actions" section.
Completeness will change: 45% → 50%- Ask for approval: "Add this action?", "Modify", "Cancel"
Step 3: Write if approved
- Insert action into "## Actions" section of body
- Add history entry:
action_added | ACT-XXX | | | <actor> | <description> - Update
updated_attimestamp - Recalculate completeness (actions with assignee and due_date improve score)
- Write updated file
- Rebuild index
- Report success: "✓ Added action ACT-003 to <initiative_id>"
Command: /complete_action <initiative_id> <action_id>
Mark an action as complete.
Step 1: Prepare completion
- Read initiative file
- Find action by ID in "## Actions" section
- Generate history ID
- Update action:
- Change checkbox: - [ ] → - [x] - Update status: status:: Open → status:: Done - Add completed_at:: YYYY-MM-DD HH:MM
Step 2: Show preview
- Display change preview:
📄 Completing action in: <initiative_id>
ACTION: ACT-003
Status: Open → Done
Completed: 2026-01-22 10:30
- [x] ACT-003: Schedule UX review session
status:: Done
completed_at:: 2026-01-22 10:30- Ask for approval
Step 3: Write if approved
- Update action in body
- Add history entry:
action_completed | ACT-XXX | Open | Done | <actor> | - Update timestamps, recalculate completeness
- Write, rebuild index, report success
Command: /list_actions [--initiative=X] [--assigned=person_id] [--status=Open|Done] [--overdue]
List actions using the index for instant results.
Use the index for fast querying:
- Ensure index is loaded in memory
- Filter initiatives and extract actions:
results = []
for initiative in index['initiatives']:
for action in initiative.get('actions', []):
# Apply filters
if initiative_filter and initiative['id'] != initiative_filter:
continue
if assigned_filter and action.get('assigned_to') != assigned_filter:
continue
if status_filter and action['status'] != status_filter:
continue
if overdue_flag:
due = action.get('due_date')
if not due or due >= today:
continue
results.append({
'initiative': initiative['id'],
'initiative_title': initiative['title'],
'action_id': action['id'],
'description': action['description'],
'status': action['status'],
'assigned_to': action.get('assigned_to', ''),
'due_date': action.get('due_date', ''),
})- Format as table:
| Initiative | Action | Description | Assigned | Due | Status |
|------------|--------|-------------|----------|-----|--------|
| device-onboarding | ACT-001 | Review security... | olle-jansson | 2026-01-25 | Open |- Display table with total count
Performance: Instant even with 1000+ actions across hundreds of initiatives (no file I/O).
Examples:
/list_actions --assigned=anna-andersson --status=Open
/list_actions --initiative=device-onboarding
/list_actions --overdueCommand: /add_question <initiative_id> <question> [--asked_by=person_id]
Add an open question to an initiative.
Step 1: Prepare question
- Read initiative file
- Generate question ID (Q-001, Q-002, etc.)
- Generate history ID
- Build question entry:
- [ ] Q-003: What's the fallback if Bluetooth is disabled?
asked_by:: [[people/anna-andersson]]
asked_at:: 2026-01-21 23:20
status:: OpenStep 2: Show preview and get approval
- Display preview:
📄 Adding question to: <initiative_id>
NEW QUESTION:
- [ ] Q-003: What's the fallback if Bluetooth is disabled?
asked_by:: [[people/anna-andersson]]
asked_at:: 2026-01-21 23:20
status:: Open
This will be added to "## Open Questions" section.
Note: >3 open questions will trigger warning on "In Progress" status transition.- Ask for approval
Step 3: Write if approved
- Insert into "## Open Questions" section
- Add history entry:
question_added | Q-XXX | | | <actor> | <question_text> - Update timestamps
- Write, rebuild index, report success
Command: /answer_question <initiative_id> <question_id> <answer> [--answered_by=person_id]
Resolve an open question.
Step 1: Prepare answer
- Read initiative file
- Find question by ID
- Generate history ID
- Update question:
- Change checkbox: - [ ] → - [x] - Add answer:: <answer_text> - Add answered_by:: [[people/<person_id>]] - Add answered_at:: YYYY-MM-DD HH:MM - Update status:: Open → status:: Answered
Step 2: Show preview
- Display change:
📄 Answering question in: <initiative_id>
QUESTION: Q-002
Status: Open → Answered
- [x] Q-002: What's the fallback if Bluetooth is disabled?
answer:: Manual entry via QR code or NFC tag
answered_by:: [[people/erik-svensson]]
answered_at:: 2026-01-22 11:00
status:: Answered- Ask for approval
Step 3: Write if approved
- Update question in body
- Add history entry:
question_answered | Q-XXX | Open | Answered | <actor> | - Update timestamps
- Write, rebuild index, report success
Command: /add_solution <initiative_id> <solution_id> <title> <description>
Add a solution proposal to an initiative.
Step 1: Prepare solution
- Read initiative file
- Generate history ID
- Build solution subsection:
### <solution_id>: <title>
status:: Proposed
proposed_by:: [[people/<current_user>]]
proposed_at:: YYYY-MM-DD HH:MM
<description>
**Pros:**
- (add pros here)
**Cons:**
- (add cons here)Step 2: Show preview
- Display preview:
📄 Adding solution to: <initiative_id>
NEW SOLUTION:
### bluetooth-discovery: Bluetooth Auto-Discovery
status:: Proposed
proposed_by:: [[people/anna-andersson]]
proposed_at:: 2026-01-21 23:30
Automatic device discovery via Bluetooth Low Energy.
**Pros:**
- (to be filled)
**Cons:**
- (to be filled)
This will be added to "## Solutions" section.
Note: Complete pros/cons to improve completeness.- Ask for approval
Step 3: Write if approved
- Insert into "## Solutions" section
- Add history entry:
solution_added | <solution_id> | | | <actor> | <title> - Update timestamps, recalculate completeness
- Write, rebuild index, report success
Command: /decide_solution <initiative_id> <solution_id> <decision>
Accept or reject a solution proposal.
Where <decision> is "accept" or "reject".
Step 1: Prepare decision
- Read initiative file
- Find solution by ID in "## Solutions" section
- Generate history ID
- Update solution:
- Change status:: Proposed → status:: Accepted or status:: Rejected - Add decided_at:: YYYY-MM-DD HH:MM
Step 2: Show preview
- Display change:
📄 Deciding on solution in: <initiative_id>
SOLUTION: qr-code-approach
Decision: Proposed → Accepted
### qr-code-approach: QR Code Based
status:: Accepted
decided_at:: 2026-01-22 12:00
Selected as primary approach after team review.- Ask for approval
Step 3: Write if approved
- Update solution status in body
- Add history entry:
solution_decided | <solution_id> | Proposed | <Accepted|Rejected> | <actor> | <note> - Update timestamps
- Write, rebuild index, report success
Planning and Query Commands
These commands provide high-level views and queries across initiatives, epics, and actions.
Command: /prepare_meeting <person_id|partner_id>
Prepare context for a meeting with a person or partner. Uses index for instant results.
Implementation:
- Identify entity type (person or partner) from ID
- Query index for all initiatives where this entity is involved:
relevant_initiatives = []
for initiative in index['initiatives']:
# Check if person/partner is involved
if entity_id in initiative.get('initiator', []):
relevant_initiatives.append(initiative)
elif entity_id in initiative.get('stakeholders', []):
relevant_initiatives.append(initiative)
elif entity_id in initiative.get('intended_users', []):
relevant_initiatives.append(initiative)
# Also check if assigned to any actions
for action in initiative.get('actions', []):
if action.get('assigned_to') == entity_id:
relevant_initiatives.append(initiative)
break- For each initiative, extract:
- Current status and completeness - Recent changes (last 7 days from updated_at) - Open questions - Actions assigned to this person - Incomplete recommended fields
- Format output:
📋 Meeting Preparation: <Name>
Role: <role> at <organization>
INITIATIVES (<count>)
1. <title> (Status: <status>, <completeness>%)
- Your role: <Initiator|Stakeholder|Intended User>
- Last updated: <days> ago
- Open actions assigned to you: <count>
- Open questions: <count>
- ⚠️ Missing: <list if completeness < 80%>
ACTIONS ASSIGNED (<count>)
- ACT-001 in <initiative>: <description> (Due: <date>)
- ACT-002 in <initiative>: <description> (⚠️ Overdue)
OPEN QUESTIONS TO DISCUSS
- Q-001 in <initiative>: <first 50 chars>...
TALKING POINTS
- <initiative> needs stakeholder input on <field>
- <initiative> has 3 open questions- Performance: Instant (all data from index)
Example:
/prepare_meeting anna-anderssonCommand: /my_work [person_id]
Show all work items for a person (defaults to current user).
Implementation:
- Query index for all open actions assigned to person:
my_actions = []
for initiative in index['initiatives']:
for action in initiative.get('actions', []):
if action.get('assigned_to') == person_id and action['status'] == 'Open':
my_actions.append({
'initiative': initiative,
'action': action,
})- Group by due date:
- Overdue (due_date < today) - This week (due_date within 7 days) - Later (due_date > 7 days) - No due date
- Also show initiatives where person is initiator
- Format output:
📊 My Work: <Name>
OVERDUE ACTIONS (2)
⚠️ ACT-001: Review security requirements (device-onboarding)
Due: 2026-01-20 (2 days ago)
⚠️ ACT-003: Schedule kickoff (app-management)
Due: 2026-01-19 (3 days ago)
THIS WEEK (3)
- ACT-005: Finalize design (device-onboarding) - Due: 2026-01-24
- ACT-007: Update docs (reduce-resource) - Due: 2026-01-26
- ACT-009: Review proposal (app-management) - Due: 2026-01-27
LATER (1)
- ACT-012: Q2 planning (roadmap-2026) - Due: 2026-02-15
NO DUE DATE (2)
- ACT-002: Research alternatives (device-onboarding)
- ACT-008: Gather feedback (app-management)
MY INITIATIVES AS INITIATOR (2)
- device-onboarding (In Progress, 85%)
- app-management (Draft, 25% - needs attention)Performance: Instant
Command: /overdue
Show all overdue actions across all initiatives.
Implementation:
- Get current date
- Query index for actions with due_date < today and status = Open:
import datetime
today = datetime.date.today().isoformat()
overdue = []
for initiative in index['initiatives']:
for action in initiative.get('actions', []):
if action['status'] == 'Open' and action.get('due_date'):
if action['due_date'] < today:
overdue.append({
'initiative': initiative,
'action': action,
'days_overdue': calculate_days(action['due_date'], today),
})
# Sort by days overdue (most overdue first)
overdue.sort(key=lambda x: x['days_overdue'], reverse=True)- Format output:
⚠️ OVERDUE ACTIONS (5)
5 days overdue:
- ACT-001: Review security requirements
Initiative: device-onboarding
Assigned: anna-andersson
Due: 2026-01-16
3 days overdue:
- ACT-003: Schedule kickoff meeting
Initiative: app-management
Assigned: olle-jansson
Due: 2026-01-18
[... more ...]
Total: 5 overdue actions across 3 initiativesPerformance: Instant
Command: /quarter_plan <quarter> [--team=team_id]
Show work planned for a specific quarter.
Implementation:
- Parse quarter (e.g., "2026-Q1")
- Query index for epics with planned_quarter matching:
epics_in_quarter = [
epic for epic in index['epics']
if epic.get('planned_quarter') == quarter
]
# Optional: filter by team
if team_filter:
epics_in_quarter = [
epic for epic in epics_in_quarter
if team_filter in epic.get('assigned_team', [])
]- Group by initiative and status
- Calculate totals:
- Total epics in quarter - By status (Not Started, In Progress, Done) - By team (if multiple teams)
- Format output:
📅 Quarter Plan: 2026-Q1
SUMMARY
- Total epics: 12
- Not Started: 5
- In Progress: 4
- Done: 3
BY INITIATIVE
device-onboarding (3 epics)
✓ qr-scanner (Done, platform-team)
→ backend-preregistration (In Progress, platform-team)
- mobile-integration (Not Started, mobile-team)
app-management (2 epics)
→ api-refactor (In Progress, platform-team)
- security-hardening (Not Started, platform-team)
[... more ...]
TEAM WORKLOAD
- platform-team: 8 epics
- mobile-team: 3 epics
- backend-team: 1 epicPerformance: Instant
Example:
/quarter_plan 2026-Q1
/quarter_plan 2026-Q2 --team=platform-teamCommand: /roadmap <start_quarter> <end_quarter> [--team=team_id]
Multi-quarter roadmap view.
Implementation:
- Parse quarter range (e.g., "2026-Q1" to "2026-Q4")
- Query all epics in range
- Group by quarter and initiative
- Format as timeline:
🗺️ Roadmap: 2026-Q1 to 2026-Q4
2026-Q1 (12 epics)
├─ device-onboarding: 3 epics
├─ app-management: 2 epics
└─ reduce-resource: 1 epic
2026-Q2 (8 epics)
├─ device-onboarding: 1 epic
├─ api-v2: 4 epics
└─ security-initiative: 2 epics
2026-Q3 (6 epics)
└─ [...]
2026-Q4 (4 epics)
└─ [...]
TOTAL: 30 epics across 4 quartersPerformance: Instant
Command: /incomplete [entity_type] [--threshold=N]
Show entities below completeness threshold.
Implementation:
- Default threshold = 70%
- Filter index by completeness:
incomplete = []
for entity in index[entity_type]:
if entity['completeness'] < threshold:
incomplete.append(entity)
# Sort by completeness (lowest first)
incomplete.sort(key=lambda x: x['completeness'])- Format output:
📉 Incomplete Initiatives (threshold: 70%)
25% - app-management (Draft)
Missing: stakeholders, affected_systems, source_document
45% - reduce-resource (Draft)
Missing: intended_users, source_document
65% - auth-refactor (Defined)
Missing: stakeholders, 1 solution missing pros/cons
Total: 3 initiatives below 70% completenessPerformance: Instant
Examples:
/incomplete
/incomplete initiative --threshold=80
/incomplete epic --threshold=90Reference Documentation
Embedded Entity Format Reference
These formats are used in the body content of initiative markdown files.
Actions Format
## Actions
- [ ] ACT-001: Finalize QR code payload format specification
assigned:: [[people/erik-svensson]]
due:: 2026-01-25
status:: In Progress
created_at:: 2026-01-19 11:00
- [x] ACT-002: Get sign-off from Partner Alpha on timeline
assigned:: [[people/anna-andersson]]
status:: Done
created_at:: 2026-01-16 14:00
completed_at:: 2026-01-20 16:45Questions Format
## Open Questions
- [x] Q-001: Can we use existing QR code format?
asked_by:: [[people/anna-andersson]]
asked_at:: 2026-01-15 14:00
answered_by:: [[people/erik-svensson]]
answered_at:: 2026-01-18 11:20
answer:: Use existing format with extended payload
status:: Answered
- [ ] Q-002: What's the fallback if Bluetooth is disabled?
asked_by:: [[people/anna-andersson]]
asked_at:: 2026-01-20 10:30
status:: OpenSolutions Format
## Solutions
### qr-code-approach: QR Code Based
status:: Accepted
proposed_by:: [[people/erik-svensson]]
proposed_at:: 2026-01-16 10:00
decided_at:: 2026-01-18 15:30
Use QR codes on device packaging that link directly to pre-configured setup flows.
**Pros:**
- Familiar pattern for users
- Low implementation cost
**Cons:**
- Requires packaging changes
- QR codes can be damaged
### bluetooth-discovery: Bluetooth Auto-Discovery
status:: Rejected
proposed_by:: [[people/anna-andersson]]
proposed_at:: 2026-01-16 10:00
decided_at:: 2026-01-18 15:30
Automatic device discovery via Bluetooth Low Energy.
**Pros:**
- No physical artifacts needed
**Cons:**
- Battery drain concerns
- Platform permission complexityHelper Functions
Utility functions for formatting and data processing.
Format Completeness Bar
def format_bar(percentage):
filled = int(percentage / 10)
empty = 10 - filled
return '█' * filled + '░' * emptyEscape JSON for Bash
When passing JSON to bash commands, escape quotes properly:
- Single quotes around JSON
- Escape single quotes in content as '\''
Additional Resources
Reference Documentation
- Schema Definitions - All entity fields and requirement levels
- Status Transitions - Workflow rules and required fields
- Command Reference - Detailed command documentation
Templates
Templates for new entities are in assets/templates/.