Skip to main content

skill-timeline

Research timeline planning for medical research projects. Invoke for timeline tasks.

Jump to install

Source facts

Repository
benbrastmckie/nvim
Last source activity
August 10, 2026 at 06:39
Detected SKILL.md language
English
Stars
444
Forks
459

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
skill-timeline
description
Research timeline planning for medical research projects. Invoke for timeline tasks.
allowed-tools
Agent, Bash, Edit, Read, Write
# Timeline Skill Thin wrapper that delegates timeline research to `timeline-agent` subagent. **IMPORTANT**: This skill implements the skill-internal postflight pattern. After the subagent returns, this skill handles all postflight operations (status update, artifact linking, git commit) before returning. ## Context References Reference (do not load eagerly): - Path: `.claude/context/formats/return-metadata-file.md` - Metadata file schema - Path: `.claude/context/patterns/postflight-control.md` - Marker file protocol - Path: `.claude/context/patterns/file-metadata-exchange.md` - File I/O helpers - Path: `.claude/context/patterns/jq-escaping-workarounds.md` - jq escaping patterns (Issue #1132) Note: This skill is a thin wrapper with internal postflight. Context is loaded by the delegated agent. ## Trigger Conditions This skill activates when: - Task type is "present" and task_type is "timeline" - Timeline workflow requested via /timeline command or /research routing - Present extension is available --- ## Workflow Type Routing This skill routes to timeline-agent with one of two workflow types: | Workflow Type | Preflight Status | Success Status | TODO.md Markers | |---------------|-----------------|----------------|-----------------| | timeline_research | researching | researched | [RESEARCHING] -> [RESEARCHED] | | timeline_plan | planning | planned | [PLANNING] -> [PLANNED] | --- ## Input Parameters ### Required Parameters - `task_number` - Task number (must exist in state.json with language="present" and task_type="timeline") - `workflow_type` - One of: timeline_research, timeline_plan - `session_id` - Session ID from orchestrator ### Optional Parameters - `forcing_data` - Pre-gathered forcing question responses from /timeline command --- ## Execution Flow ### Stage 1: Input Validation Validate required inputs: - `task_number` - Must be provided and exist in state.json - `workflow_type` - Must be one of: timeline_research, timeline_plan ```bash # Lookup task task_data=$(jq -r --argjson num "$task_number" \ '.active_projects[] | select(.project_number == $num)' \ specs/state.json) # Validate exists if [ -z "$task_data" ]; then return error "Task $task_number not found" fi # Extract fields task_type=$(echo "$task_data" | jq -r '.task_type // "present"') status=$(echo "$task_data" | jq -r '.status') project_name=$(echo "$task_data" | jq -r '.project_name') description=$(echo "$task_data" | jq -r '.description // ""') # Extract pre-gathered forcing_data (if present from Stage 0) forcing_data=$(echo "$task_data" | jq -r '.forcing_data // null') # Validate language is "present" if [ "$task_type" != "present" ]; then return error "Task $task_number has language '$task_type', expected 'present'" fi ``` --- ### Stage 2 + Stage 3: Preflight Status Update and Postflight Marker Map `workflow_type` onto `update-task-status.sh`'s `research`/`plan` vocabulary, then source `skill-base.sh` once and follow `@.claude/context/patterns/skill-preflight-flow.md` in full for Stage 2 (preflight status update) and Stage 3 (marker creation): ```bash source .claude/scripts/skill-base.sh padded_num=$(printf "%03d" "$task_number") skill_name="skill-timeline" case "$workflow_type" in timeline_research) operation="research" ;; timeline_plan) operation="plan" ;; esac ``` `operation` (not the raw `"${workflow_type}"`) is required here: `update-task-status.sh`'s `target_status` vocabulary has no `timeline_research`/`timeline_plan` values, so this skill maps onto the plain `research`/`plan` operations. The marker's `operation` field now reads `"research"` or `"plan"` rather than the raw workflow-type string. --- ### Stage 3a: Artifact Number Calculation Calculate the artifact sequence number following the same pattern as skill-reviser: ```bash padded_num=$(printf "%03d" "$task_number") task_dir="specs/${padded_num}_${project_name}" # Get current artifact number from state.json artifact_num=$(jq -r --argjson num "$task_number" \ '(.active_projects[] | select(.project_number == $num)).next_artifact_number // 1' \ specs/state.json) # For research: use current number (advances it) # For plan: use current round (artifact_num - 1) case "$workflow_type" in timeline_research) current_mm=$(printf "%02d" "$artifact_num") # Increment next_artifact_number bash .claude/scripts/state-write.sh \ '(.active_projects[] | select(.project_number == $num)).next_artifact_number = ($cur + 1)' \ --session-id "$session_id" \ --argjson num "$task_number" \ --argjson cur "$artifact_num" ;; timeline_plan) current_mm=$(printf "%02d" "$((artifact_num - 1))") if [ "$current_mm" = "00" ]; then current_mm="01"; fi ;; esac ``` --- ### Stage 4: Prepare Delegation Context ```json { "session_id": "sess_{timestamp}_{random}", "delegation_depth": 1, "delegation_path": ["orchestrator", "timeline", "skill-timeline"], "timeout": 3600, "task_context": { "task_number": N, "task_name": "{project_name}", "description": "{description}", "task_type": "present", "task_type": "timeline" }, "workflow_type": "timeline_research", "forcing_data": { "...pre-gathered data if available..." }, "artifact_number": "{MM}", "metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json" } ``` --- ### Stage 5: Invoke Subagent **CRITICAL**: Use the **Agent** tool to spawn the subagent. ``` Tool: Agent (NOT Skill, NOT Plan) Parameters: - subagent_type: "timeline-agent" - prompt: [Include task_context, delegation_context, workflow_type, forcing_data, artifact_number, metadata_file_path] - description: "Execute {workflow_type} workflow for task {N}" ``` **DO NOT** use `Skill(timeline-agent)` - this will FAIL. --- ### Stage 5b: Self-Execution Fallback **CRITICAL**: If you performed the work above WITHOUT using the Agent tool (i.e., you read files, wrote artifacts, or updated metadata directly instead of spawning a subagent), you MUST write a `.return-meta.json` file now before proceeding to postflight. Use the schema from `return-metadata-file.md` with the appropriate status value for this operation. If you DID use the Agent tool, skip this stage -- the subagent already wrote the metadata. --- ## Postflight (ALWAYS EXECUTE) The following stages MUST execute after work is complete, whether the work was done by a subagent or inline (Stage 5b). Do NOT skip these stages for any reason. ### Stage 6: Read Metadata File ```bash metadata_file="specs/${padded_num}_${project_name}/.return-meta.json" if [ -f "$metadata_file" ] && jq empty "$metadata_file" 2>/dev/null; then meta_status=$(jq -r '.status' "$metadata_file") artifact_path=$(jq -r '.artifacts[0].path // ""' "$metadata_file") artifact_type=$(jq -r '.artifacts[0].type // ""' "$metadata_file") artifact_summary=$(jq -r '.artifacts[0].summary // ""' "$metadata_file") else echo "Error: Invalid or missing metadata file" meta_status="failed" fi ``` --- ### Stage 7: Update Task Status (Postflight) | Workflow Type | Meta Status | Final state.json | Final TODO.md | |---------------|-------------|-----------------|---------------| | timeline_research | researched | researched | [RESEARCHED] | | timeline_research | partial | researching | [RESEARCHING] | | timeline_plan | planned | planned | [PLANNED] | | timeline_plan | partial | planning | [PLANNING] | | any | failed | (keep preflight) | (keep preflight marker) | ```bash case "$workflow_type" in timeline_research) if [ "$meta_status" = "researched" ]; then postflight_status="researched" postflight_marker="[RESEARCHED]" fi ;; timeline_plan) if [ "$meta_status" = "planned" ]; then postflight_status="planned" postflight_marker="[PLANNED]" fi ;; esac if [ -n "$postflight_status" ]; then bash .claude/scripts/state-write.sh \ '(.active_projects[] | select(.project_number == $num)) |= . + { status: $status, last_updated: $ts }' \ --session-id "$session_id" \ --argjson num "$task_number" \ --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --arg status "$postflight_status" fi ``` **Update TODO.md**: Use Edit tool to change status marker to the final success state. --- ### Stage 8: Link Artifacts ```bash if [ -n "$artifact_path" ]; then # Step 1: Filter out existing artifacts of same type bash .claude/scripts/state-write.sh \ '(.active_projects[] | select(.project_number == $num)).artifacts = [(.active_projects[] | select(.project_number == $num)).artifacts // [] | .[] | select(.type == "report" | not)]' \ --session-id "$session_id" \ --argjson num "$task_number" # Step 2: Add new artifact bash .claude/scripts/state-write.sh \ '(.active_projects[] | select(.project_number == $num)).artifacts += [{"path": $path, "type": $type, "summary": $summary}]' \ --session-id "$session_id" \ --argjson num "$task_number" \ --arg path "$artifact_path" \ --arg type "$artifact_type" \ --arg summary "$artifact_summary" fi ``` **Update TODO.md**: Link artifact using count-aware format. Apply the four-case Edit logic from `@.claude/context/patterns/artifact-linking-todo.md` with `field_name=**Research**`, `next_field=**Plan**`. --- ### Stage 9: Git Commit ```bash case "$workflow_type" in timeline_research) commit_action="complete timeline research" ;; timeline_plan) commit_action="create timeline plan" ;; esac # Targeted staging per .claude/context/standards/git-staging-scope.md — never a repo-wide add bash .claude/scripts/git-commit-scoped.sh \
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub