Good Morning
The morning bookend to /save-progress. That command pins state at the end of a session;
this one rehydrates it at the start — it locates or creates the session worktree, reads
the plan and everything it points to so a fresh Claude (after /clear) is genuinely caught
up, surfaces what's due, then catches the user up if they want it.
This command reads, orients, and sets up / cleans the workspace — but it does not start doing the plan's work. That waits for the user's go-ahead once you're both oriented.
Bookend sibling:
/save-progressis the session-end mirror. They share the durable-docs manifest (.meta/durable-docs.md) and the worktree lifecycle (good-morning creates/resumes; save-progress disposes via merge / keep / discard). When you change one bookend's structure, the manifest, or the worktree scheme, check the other.
Workspace model (git-by-default, worktree-always)
Yggdrasil's work is git-backed, so every session runs in its own worktree under
.worktrees/, on a session-YYYY-MM-DD branch off main — never editing main directly.
good-morning owns worktree creation/resume via raw git worktree; /save-progress owns
disposition. This is Yggdrasil's concrete default, not the planning skill's softer
"worktree or at least a branch" floor. Use bare git commands from the repo/worktree cwd
(not git -C) for these same-repo operations.
Branch-prefix detection (read from git, no registry): session-* = this command's
same-repo session worktrees, ours to resume. xrepo-* (cross-repo reach-in) and native
worktree-* (subagent isolation: worktree) are reserved — not session-resumes;
leave them alone (no active cross-repo logic yet).
Steps
-
Parse the invocation. Anything typed after
/good-morningis two things, either of which may be absent:- A briefing preference — if it says to skip ("no briefing," "jump straight in"), don't ask in step 7; orient silently and stand ready.
- Context or a loose note — where the user wants to pick up, or a stray idea they sat down to jot before forgetting it.
-
Safe-capture any loose note first. If the invocation carried an idea/note (not just direction), surface it back immediately and, if it's idea-shaped, recommend
/bookmarkingso it lands durably — before the slower work below. The user may have opened the session only to drop a thought and then leave; never let a "didn't want to forget this" note ride only in conversation. -
Locate & resume the session worktree (before orienting — the freshest pinned handoff may live on a kept session branch, not
main). Rungit worktree listand read the landscape by branch prefix:- One kept
session-*worktree → resume it (work against its paths) — that's where the last session's pinned handoff lives if it was "kept." - More than one
session-*→ disambiguate withAskUserQuestion: list each with a short derived summary of what it's about (from recentgit logmessages / its branch checkpoint) + its last-commit date, plus a "start fresh" option. - None → the handoff is on
main; you'll create a fresh worktree in step 5. - Ignore
xrepo-*/worktree-*— not session-resumes.
- One kept
-
Orient. Read
working/current-plan.mdfrom the resumed location (the freshest handoff), in full — the## Current Checkpointis the "you are here" pin. Then follow the trail enough to pick up, not just skim:- The Checkpoint's References and Next step — open the files, repos, source paths.
- The skill(s) in play for the active build — read their
SKILL.md. - Anything the Next step says to read from source — read it from source (source-fidelity).
- If the session will touch architecture/foundations, skim the relevant durable docs
from the manifest (
.meta/durable-docs.md).current-plan.mdis usually enough for routine pickups; reach for the manifest when the work needs the foundational picture.
-
Finish workspace setup (now that you're oriented). Worktree-always:
- If step 3 resumed a worktree, you're already settled in it — done.
- If step 3 found none (or the user chose "start fresh"), create
git worktree add .worktrees/session-YYYY-MM-DD -b session-YYYY-MM-DD HEAD(today's date, branched from localHEADso no remote is needed). If today's name already exists, append an incrementing suffix (-2,-3). - Necessity-only cleanup — surfaced/announced, never a silent tidy-sweep (that proactive
prune is
/save-progress's job):- an empty, same-day worktree (clean tree, no commits beyond base) is reused silently;
- an empty, stale-dated one is nuked (
git worktree remove) and you tell the user you did so, then create today's; - a broken / half-made one in the way is cleared.
- Work against the worktree's absolute paths from here on (raw git doesn't auto-relocate the session).
-
Surface what's due — entirely from the ledger stamps + in-context docs; never load the out-of-context stores (
bookmarks.md,backburner.md,archive/):- Ledger (
.meta/ledger.yaml): the bookmark count + a high-count flag (bloat bands fromconfig.bloat), items aged pastconfig.aging_days, and which cadence-gated reviews are due (compare eachlast_*againstconfig.cadence_days). working/hygiene.mdopen items, if any (the drift scratchpad — surfaced here so it survives/clear).- Ripe deferrals from
current-plan.md's## Deferred(in-context, so reading it is fine): a hard trigger that fired (by condition) or a soft trigger aged pastconfig.aging_days(by age) — an informational offer to pick it up, never forced. - Active-build progress: if a sub-plan is in flight (a plan with unchecked
## Progressboxes), surface "you're at Task X of plan Y; next is …" — making good-morning the resume point for a/clear'd mid-build.
- Ledger (
-
Offer the briefing (unless declined in step 1).
AskUserQuestion: "Want a briefing to get up to speed, or jump straight in?"- Briefing → a short, conversational playback: where you left off, what's in progress, the immediate next step.
- Skip → straight to step 8.
-
State where you're picking up, and stand ready. Name the immediate next step in plain language (not a bare phase number), folding in any direction from step 1. Then stop and wait — do not start executing the work until the user says go.
What this command does NOT do
- No work execution. It sets up the workspace and orients; picking up the actual next task waits for an explicit go-ahead.
- No pin, no plan edits, no auto-commit. Pinning the checkpoint is
/save-progress's job. The only writes good-morning makes are workspace ones (creating/removing a worktree) and, if asked, bookmarking a loose note (via/bookmarking, which prompts). - No loading the out-of-context stores. It surfaces bookmark / backburner / archive signals from the ledger stamps only, respecting the context-load boundary.
- No silent briefing, no silent cleanup. The briefing is offered (skipped if declined on entry); worktree cleanup is announced, never a silent tidy.