Session-orchestrator session-start
git clone https://github.com/Kanevry/session-orchestrator
T=$(mktemp -d) && git clone --depth=1 https://github.com/Kanevry/session-orchestrator "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/session-start" ~/.claude/skills/kanevry-session-orchestrator-session-start && rm -rf "$T"
skills/session-start/SKILL.mdSession Start Skill
Soul
Before anything else, read and internalize
soul.md in this skill directory. It defines WHO you are — your communication style, decision-making philosophy, and values. Every interaction in this session should reflect this identity. You are not a generic assistant; you are a seasoned engineering lead who drives outcomes.
Phase 0: Bootstrap Gate
Read
skills/_shared/bootstrap-gate.md and execute the gate check. If the gate is CLOSED, invoke skills/bootstrap/SKILL.md and wait for completion before proceeding. If the gate is OPEN, continue to Phase 1.
<HARD-GATE>
Do NOT proceed past Phase 0 if GATE_CLOSED. There is no bypass. Refer to `skills/_shared/bootstrap-gate.md` for the full HARD-GATE constraints.
</HARD-GATE>
Phase 1: Read Session Config
Read and parse Session Config per
skills/_shared/config-reading.md. Store result as $CONFIG.
Phase 1.5: Session Continuity
Skip this phase if
config ispersistence.false
Check for
<state-dir>/STATE.md in the project root:
Where
is<state-dir>under Claude Code or.claude/under Codex CLI. See.codex/for details.skills/_shared/platform-tools.md
Ownership Reference: See
for the STATE.md ownership contract, schema, and guards.skills/_shared/state-ownership.md
Before reading STATE.md contents, validate the branch field:
- If STATE.md's
does not matchbranch
, log: "⚠ STATE.md from branch [X], current branch is [Y] — treating as stale." Skip to step 2 (treat as if STATE.md does not exist).git rev-parse --abbrev-ref HEAD
- STATE.md exists — read it and inspect the
field:status
— previous session crashed or was interrupted. Use the AskUserQuestion tool to present: "Found unfinished session from [started_at]. [N] waves completed. Resume or start fresh?" with options to resume the previous plan or start a new session.status: active
— session was intentionally paused. Use AskUserQuestion to offer resuming from the pause point or starting fresh.status: paused
— previous session ended cleanly. Note the summary for context (what was done, what was deferred), then reset STATE.md to idle before any new session state is written (see "Idle Reset" below). Continue with normal initialization.status: completed
- STATE.md does not exist — first session or persistence was previously off. Continue normally.
Idle Reset (completed-branch only)
When (and only when) the prior
status is completed, rewrite STATE.md to a clean idle state before Phase 1b (Initialize STATE.md) runs. This prevents the next agent from reading a stale "completed" banner at session-start, while preserving the prior session's record in a demoted archive block.
Reset rules — applies ONLY on the
completed branch. Do NOT perform this reset on active or paused; those paths stay user-interactive via AskUserQuestion.
- Set frontmatter
.status: idle - Clear
(set tocurrent-wave
).0 - Move the existing
body into a new## Wave History
archive section (retain the record, but demote it below the new session's live state). Remove the original## Previous Session
section — wave-executor will recreate it on the next wave.## Wave History - Clear
(leave the heading with an empty body so the schema is preserved).## Deviations - Leave other frontmatter fields (
,schema-version
,session-type
,branch
,issues
,started_at
) intact until Phase 1b overwrites them with the new session's values.total-waves
Rationale:
/close intentionally keeps STATE.md as a record so the next session-start can read it. This reset completes that contract by demoting the record before new session state is written, so a fresh session never appears "already completed".
Current-Task Banner (#184)
After the continuity checks above, render a one-line banner showing the current task from STATE.md. This gives the user an immediate "where am I" signal before the rest of the session overview loads.
node --input-type=module -e " import {readFileSync} from 'node:fs'; import {readCurrentTask} from '${PLUGIN_ROOT}/scripts/lib/state-md.mjs'; try { const t = readCurrentTask(readFileSync('<state-dir>/STATE.md', 'utf8')); if (t) console.log('Current task: ' + t.description); } catch {} "
Skip silently when STATE.md is absent or unreadable. The banner is informational, not load-bearing.
Also read
<state-dir>/STATUS.md if it exists for additional project-level context.
Phase 1.6: Metrics Initialization
Skip if
config ispersistence.false
- Ensure '.orchestrator/metrics/' directory exists in the project root (create if missing). For backward compatibility with pre-v2.0 sessions, also check the platform's legacy metrics directory (
where<state-dir>/metrics/
is<state-dir>
,.claude/
, or.codex/
per platform)..cursor/ - If '.orchestrator/metrics/sessions.jsonl' exists, count lines to determine number of previous sessions. If not found, check
as a platform-specific legacy fallback.<state-dir>/metrics/sessions.jsonl - Store the count for display in Phase 7 — this feeds the Historical Trends section
Phase 2: Git Analysis (parallel)
Run these checks in parallel using Bash:
- Branch state:
, current branch, ahead/behind origingit branch -a - Recent commits:
where N is read fromgit log --oneline -N
config (default: 20) — identify last session's work by commit patternsrecent-commits - Unpushed/uncommitted:
+git status --shortgit log origin/main..HEAD --oneline - Open branches: list all local branches, identify which are mergeable to develop/main
- Stale branches: branches with no commits in more than
(default: 7) daysstale-branch-days
Phase 3: VCS Deep Dive (parallel)
VCS Reference: Detect the VCS platform per the "VCS Auto-Detection" section of the gitlab-ops skill. Use CLI commands per the "Common CLI Commands" section. For cross-project queries, see "Dynamic Project Resolution."
Using the detected VCS CLI, query (reading
issue-limit from Session Config, default: 50):
- Open issues — categorize by priority and status labels
- Recently closed — what was done since last session
- Milestones — active sprint status
- Open MRs/PRs — anything waiting for review/merge
- Pipeline/CI status — is CI green?
Group issues by:
/priority:critical
— must-addresspriority:high
— ready to work onstatus:ready- Session-type relevance (housekeeping tasks vs feature tasks vs deep-work tasks)
Phase 4: SSOT & Environment Check
-
SSOT freshness: for each file in
config, check last modified date. Flag if older thanssot-files
(default: 5) days.ssot-freshness-days -
Quality baseline: Run Baseline quality checks per the quality-gates skill. Commands are resolved in this order (issue #183): a.
— preferred source when present. b. Session Config.orchestrator/policy/quality-gates.json
/test-command
/typecheck-command
— fallback. c. Hardcoded defaults:lint-command
,pnpm test --run
,tsgo --noEmit
. Before running, perform a command-availability check: for each resolved command, extract the binary (first token) and runpnpm lint
. If absent, skip that check and logcommand -v <binary>
. Report results but do not block the session.⚠ Quality baseline: <binary> not found — skipping <variant> -
Pencil design status: if
is configured, verify thepencil
file exists at the configured path. Report: "Pencil design configured at [path] — design-code alignment reviews will run after Impl-Core and Impl-Polish waves." If file not found, warn: "Pencil path configured but file not found at [path].".pen -
Plugin freshness: Determine the session-orchestrator plugin directory (navigate up from this skill's base directory to the plugin root). Run
to get the last commit date. If older thangit -C <plugin-dir> log -1 --format="%ci"
(default: 30) days, flag a warning in the Session Overview:plugin-freshness-days
Non-blocking — present in overview, don't halt."⚠ Session Orchestrator plugin last updated [N] days ago — consider pulling the latest version."Additionally, if
exists in the current repo, invoke the bootstrap-lock-freshness probe (.orchestrator/bootstrap.lock
) to check lock age and plugin-version drift. When severity isscripts/lib/bootstrap-lock-freshness.mjs
orwarn
, render an additional banner alongside the plugin-freshness warning:alert- warn (age 30–89d or version mismatch):
"⚠ bootstrap.lock: age=<N>d, plugin-version=<lock-ver> (current=<plugin-ver>) — consider re-running /bootstrap --retroactive to refresh." - alert (age ≥90d, unparseable, or missing):
"⚠ bootstrap.lock: <message> — re-run /bootstrap --retroactive is strongly recommended."
Both banners are non-blocking — display in the Session Overview, do not halt the session. If
is absent (pre-#186 plugin install), skip silently.bootstrap-lock-freshness.mjs - warn (age 30–89d or version mismatch):
Phase 5: Cross-Repo Status (if configured)
For each repo in
cross-repos:
cd ~/Projects/<repo> && git log --oneline -5 && git status --short- Check for open issues that reference this repo
- Note any branches that should be merged
Phase 6: Pattern Recognition
Look across the gathered data for:
- Recurring patterns: same types of issues appearing repeatedly → suggest standardization
- Blocking chains: issues blocked by other issues across repos
- Quick wins: low-effort issues that could be closed alongside main work
- Staleness: issues open longer than
(default: 30) days without progress → flag for triagestale-issue-days - Synergies: issues that share code paths and can be combined
Phase 6.5: Memory Recall
Skip this phase if
config ispersistence.false
Platform Note: Session memory files at
are a Claude Code feature. On Codex CLI and Cursor IDE, skip this phase — per-project memory persistence is not available on those platforms.~/.claude/projects/
Surface context from previous sessions:
- Look for session memory files at
~/.claude/projects/<project>/memory/session-*.md - Read the 2–3 most recent files (by filename date, newest first)
- Extract relevant context: what was accomplished, what was carried over as unfinished, what patterns or warnings were noted
- If the
has been reached (number of session-*.md files >= threshold), include a note in the Session Overview: "Consider runningmemory-cleanup-threshold
— [N] session memory files accumulated."/memory-cleanup - Incorporate surfaced context into the Session Overview under a Previous Sessions subsection (e.g., recent accomplishments, deferred items, recurring patterns)
Phase 6.6: Project Intelligence
Skip if
config ispersistenceorfalsedoes not exist. If the canonical file is absent and a legacy.orchestrator/metrics/learnings.jsonlstill exists, do not read it — direct the user to run<state-dir>/metrics/learnings.jsonlonce to migrate.scripts/migrate-legacy-learnings.sh
Read
.orchestrator/metrics/learnings.jsonl and surface active learnings (confidence > 0.3, not expired):
- Apply cap + rank (#88): sort active learnings by
DESC, thenconfidence
DESC as tiebreaker. Slice to the firstcreated_at
entries (default 15). Only the surfaced subset is used for the grouping below. Record the full pre-cap active countlearnings-surface-top-n
(confidence > 0.3, not expired) and the surfaced countM
for the Surface Health section.N - Group learnings by type:
- Fragile files: "These files have been problematic: [list with confidence scores]"
- Effective sizing: "Previous sessions suggest [N] agents for [scope type]"
- Recurring issues: "Watch for: [issue patterns with frequency]"
- Scope guidance: "Sessions with [N] issues typically [outcome]"
Surface health
Present a Surface Health block immediately after the per-type grouping, before the Project Intelligence section. Use the values computed in step 1 (
M = active count pre-cap, N = surfaced count = learnings-surface-top-n):
-
Compute confidence buckets across the full active set (M entries, confidence > 0.3, not expired):
- High (≥ 0.7): count entries with
confidence >= 0.7 - Medium (0.5–0.69): count entries with
confidence >= 0.5 and < 0.7 - Low (< 0.5, above filter threshold): count entries with
confidence > 0.3 and < 0.5
- High (≥ 0.7): count entries with
-
Present the block using this template (substitute
,{M}
,{N}
, bucket counts, oldest values, and paths):{M - N}**Project Intelligence — Surface Health** Active learnings: {M} (high: {high-count} / medium: {med-count} / low: {low-count}) Surfaced this session: {N} | Suppressed: {M - N} Oldest surfaced: {oldest-created_at ISO 8601} ({relative-age} days ago) Source file: .orchestrator/metrics/learnings.jsonl Vault mirror: {vault-dir value from Session Config, or "not enabled" if absent/empty} -
Oldest surfaced entry: find the entry among the top-N surfaced learnings with the smallest
value. Display the raw ISO 8601 timestamp and compute relative age ascreated_at
days.floor((current_date - created_at) / 86400) -
Vault mirror: read
from Session Config (vault-integration.vault-dir
). If the value is absent or empty, printecho "$CONFIG" | jq -r '."vault-integration"."vault-dir" // empty'
."not enabled" -
Conditional advisory — print the following line only when
(i.e., suppressed count exceeds surfaced count):{M - N} > {N}⚠ More learnings are suppressed ({M - N}) than surfaced ({N}). Consider raising
in Session Config or runninglearnings-surface-top-n
to prune low-value entries. Do NOT print the advisory when/evolve review
.{M - N} <= {N} -
Include a Project Intelligence section in the Phase 7 presentation:
## Project Intelligence (from [N] learnings) - Fragile: [files] (confidence: [X]) - Sizing: [recommendation] - Watch: [recurring issues] - Scope: [guidance]If no active learnings exist, display: "No project intelligence yet — learnings accumulate after 2+ sessions."
-
Effectiveness analysis (requires 5+ sessions in
):sessions.jsonlSkip if
does not exist or has fewer than 5 entries..orchestrator/metrics/sessions.jsonlRead
and compute:.orchestrator/metrics/sessions.jsonl- Completion rate trend: average
over last 5 sessionseffectiveness.completion_rate- If < 0.6: "Completion rate is [X]%. Consider reducing scope or using deep sessions."
- If > 0.9: "Consistently high completion. Current scope sizing works well."
- Discovery probe value: for sessions with
, check each category indiscovery_stats
:by_category- If
across 3+ sessions: "Probe category '[X]' has produced no findings in [N] sessions. Consider excluding viafindings == 0
config."discovery-probes - If
consistently but issues are rarely created from that category: "Probe category '[X]' generates many findings ([avg]) but few lead to issues. Consider raisingfindings > 5
ordiscovery-severity-threshold
."discovery-confidence-threshold
- If
- Carryover pattern: if
across 3+ sessions: "High carryover rate ([X]%). Consider: smaller scope, longer sessions (deep), or splitting across sessions."effectiveness.carryover / planned_issues > 0.3
If fewer than 5 sessions exist: "Effectiveness analysis: not enough data yet ([N]/5 sessions)."
Include effectiveness insights in the Project Intelligence section of the Phase 7 presentation:
## Project Intelligence (from [N] learnings, [M] sessions) - Fragile: [files] (confidence: [X]) - Sizing: [recommendation] - Watch: [recurring issues] - Scope: [guidance] - Effectiveness: [completion rate trend, probe value, carryover pattern] - Completion rate trend: average
Phase 7: Research (session type dependent)
Note: Implementation-specific research (library APIs, best practices for specific code changes) is deferred to session-plan, which knows the exact scope. Session-start focuses on state analysis.
For
and feature
sessions:deep
- Check SSOT files for established patterns relevant to the recommended focus
- Review any tech stack changes since last session (dependency updates, new tooling)
- ALWAYS verify current state in actual code — never assume based on memory or SSOT alone
For
sessions:housekeeping
- Focus on git cleanup, documentation currency, CI health
- Skip deep research — prioritize operational tasks
- Run token efficiency check:
and include findings in Session Overview. Flag any HIGH/WARN items as recommended housekeeping tasks.bash "${CLAUDE_PLUGIN_ROOT:-${CODEX_PLUGIN_ROOT:-$PLUGIN_ROOT}}/scripts/token-audit.sh"
Phase 8: Structured Presentation & Q&A
Read
presentation-format.md in this skill directory for the output structure, templates, and AskUserQuestion examples.
Present your findings following that structure. Key rules:
- MANDATORY: Use a structured choice flow — AskUserQuestion on Claude Code, numbered Markdown options on Codex/Cursor
- Always include your recommendation as the first option with "(Recommended)" in the label
Phase 9: Handoff to Session Plan
After user alignment:
- Invoke the session-plan skill with the agreed scope
- The session-plan skill will decompose tasks into waves and present the execution plan
Anti-Patterns
- DO NOT skip Phase 1 and jump straight to analysis — Session Config drives everything, missing it means wrong defaults
- DO NOT present raw data dumps without recommendations — the user expects opinionated analysis, not a wall of text
- DO NOT assume issue status from titles or labels alone — always check the actual VCS API for current state
- DO NOT run blocking quality gates (Full Gate) during session-start — that's the Quality wave's job. Baseline checks (non-blocking, informational) in Phase 4 are fine.
Critical Rules
- NEVER make assumptions about code state based on memory or docs — always verify in actual files
- NEVER skip the Q&A phase — the user MUST confirm direction before wave planning
- ALWAYS use
for parallel subagent work — wait for completionrun_in_background: false - ALWAYS check
or.env
for VCS host, API keys, and service URLs.env.local - ALWAYS present options with pros/cons and a clear recommendation — never just list facts
- ALWAYS update VCS issue status when claiming work — use the issue update command per the "Common CLI Commands" section of the gitlab-ops skill
- For Pencil designs: use the
parameter, work only on new designs, treat completed ones as donefilePath - For cross-repo work: always check the actual state of related repos, don't assume from memory
Sub-File Reference
| File | Purpose |
|---|---|
| Identity and communication principles |
| Phase 7 output templates and AskUserQuestion examples |