syntaur 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/README.md +2 -2
  2. package/dist/dashboard/server.js +10 -1
  3. package/dist/dashboard/server.js.map +1 -1
  4. package/dist/index.js +81 -46
  5. package/dist/index.js.map +1 -1
  6. package/package.json +1 -1
  7. package/platforms/claude-code/README.md +3 -3
  8. package/platforms/claude-code/agents/syntaur-expert.md +12 -4
  9. package/platforms/claude-code/commands/save-session-summary/save-session-summary.md +24 -0
  10. package/platforms/claude-code/hooks/hooks.json +10 -0
  11. package/platforms/claude-code/hooks/session-start.sh +26 -1
  12. package/platforms/claude-code/references/file-ownership.md +2 -1
  13. package/platforms/claude-code/references/protocol-summary.md +6 -1
  14. package/platforms/claude-code/skills/track-session/SKILL.md +86 -0
  15. package/platforms/codex/README.md +2 -2
  16. package/platforms/codex/agents/syntaur-operator.md +6 -4
  17. package/platforms/codex/commands/save-session-summary.md +23 -0
  18. package/platforms/codex/references/file-ownership.md +2 -1
  19. package/platforms/codex/references/protocol-summary.md +6 -1
  20. package/vendor/syntaur-skills/skills/complete-assignment/SKILL.md +2 -0
  21. package/vendor/syntaur-skills/skills/grab-assignment/SKILL.md +7 -2
  22. package/vendor/syntaur-skills/skills/plan-assignment/SKILL.md +3 -1
  23. package/vendor/syntaur-skills/skills/save-session-summary/SKILL.md +113 -0
  24. package/vendor/syntaur-skills/skills/syntaur-protocol/SKILL.md +23 -4
  25. package/vendor/syntaur-skills/skills/syntaur-protocol/references/file-ownership.md +2 -1
  26. package/vendor/syntaur-skills/skills/syntaur-protocol/references/protocol-summary.md +6 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "syntaur",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Project workflow CLI with dashboard, Claude Code plugin, and Codex plugin",
5
5
  "homepage": "https://github.com/prong-horn/syntaur#readme",
6
6
  "repository": {
@@ -4,10 +4,10 @@ Syntaur plugin for Claude Code. Installed automatically during `syntaur setup`.
4
4
 
5
5
  ## What's included
6
6
 
7
- - **Skills:** grab-assignment, plan-assignment, complete-assignment, create-project, create-assignment, syntaur-protocol
7
+ - **Skills:** grab-assignment, plan-assignment, complete-assignment, create-project, create-assignment, syntaur-protocol, save-session-summary
8
8
  - **Agents:** syntaur-protocol (background)
9
- - **Hooks:** write boundary enforcement (PreToolUse)
10
- - **Commands:** track-session
9
+ - **Hooks:** write boundary enforcement (PreToolUse), session-start, session-end, **PreCompact** (prompts the agent to `/save-session-summary` before context is compacted)
10
+ - **Commands:** track-session, save-session-summary
11
11
  - **References:** protocol docs
12
12
 
13
13
  ## Manual install
@@ -59,8 +59,11 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
59
59
  progress.md # Agent-writable, append-only: timestamped progress log
60
60
  comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
61
61
  scratchpad.md # Agent-writable: working notes
62
- handoff.md # Agent-writable: append-only handoff log
62
+ handoff.md # Agent-writable: append-only cross-ticket outbound at completion
63
63
  decision-record.md # Agent-writable: append-only decision log
64
+ sessions/
65
+ <session-id>/
66
+ summary.md # Agent-writable: per-session continuity (single doc, overwritten)
64
67
  resources/
65
68
  _index.md # Derived
66
69
  <resource-slug>.md # Shared-writable
@@ -76,6 +79,7 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
76
79
  scratchpad.md
77
80
  handoff.md
78
81
  decision-record.md
82
+ sessions/<session-id>/summary.md # Per-session continuity (same as project-nested)
79
83
  ```
80
84
 
81
85
  ---
@@ -90,8 +94,9 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
90
94
  - `plan*.md` — versioned implementation plans (optional, one per `## Todos` entry: `plan.md`, `plan-v2.md`, ...)
91
95
  - `progress.md` — append-only timestamped progress log (newest first). Replaces the old `## Progress` body section.
92
96
  - `scratchpad.md` — unstructured working notes
93
- - `handoff.md` — append-only handoff log
97
+ - `handoff.md` — append-only **assignment-level cross-ticket outbound** at completion (written by `complete-assignment`)
94
98
  - `decision-record.md` — append-only decision log
99
+ - `sessions/<session-id>/summary.md` — **per-session continuity** for resume across sessions of the same agent on this assignment (written by `/save-session-summary`). Single document per session id, overwritten on each save. Distinct from `handoff.md`. Older summaries accumulate as immutable history; never delete.
95
100
 
96
101
  Only the assigned agent may write to its own assignment folder.
97
102
 
@@ -415,8 +420,11 @@ A: No. Single-writer guarantee — one agent per assignment folder. Use separate
415
420
  **Q: What if I need to ask the human a question?**
416
421
  A: Run `syntaur comment <slug> "question text" --type question`. It appends to `comments.md`, which replaces the old `## Questions & Answers` body section. The question rolls up into `_status.md`'s `openQuestions` counter and shows on the dashboard. Do NOT set status to `blocked` for questions — `blocked` is for runtime obstacles only.
417
422
 
418
- **Q: What goes in `progress.md` vs `handoff.md`?**
419
- A: `progress.md` is a continuous reverse-chron log of what you've done — append an entry per meaningful work unit. `handoff.md` is only written when you hand off work (to another agent or human), and summarizes the state at that transition.
423
+ **Q: What goes in `progress.md` vs `handoff.md` vs `sessions/<sid>/summary.md`?**
424
+ A: Three distinct artifacts.
425
+ - `progress.md`: continuous reverse-chron log of what you've done — one entry per meaningful work unit, append-only.
426
+ - `handoff.md`: **assignment-level cross-ticket outbound**, written at completion (via `complete-assignment`) for the next ticket / agent / human reviewer. Append-only.
427
+ - `sessions/<session-id>/summary.md`: **session-scoped mid-assignment continuity**, written via `/save-session-summary` before compaction or session end so a future session of the same agent can resume cleanly. Single doc per session id, overwritten on save. The Claude Code `PreCompact` hook reminds you to invoke this; the SessionStart hook surfaces the latest one as `latestSessionSummaryPath` in `.syntaur/context.json`.
420
428
 
421
429
  **Q: How do I route work to another assignment without breaking the single-writer rule?**
422
430
  A: Run `syntaur request <target> "text"` — it appends a todo to the target's `## Todos` annotated `(from: <source>)`. This is a CLI-mediated exception to the single-writer rule.
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: save-session-summary
3
+ description: Write a per-session continuity summary so a future session can resume this assignment cleanly
4
+ arguments:
5
+ - name: args
6
+ description: "(none) — the skill reads .syntaur/context.json and the current session"
7
+ required: false
8
+ ---
9
+
10
+ # /save-session-summary
11
+
12
+ Thin wrapper that invokes the `save-session-summary` skill. The skill lives in `~/.claude/skills/save-session-summary/` (installed by `syntaur setup` / `syntaur install-plugin`) and contains the full protocol — writing `<assignmentDir>/sessions/<sessionId>/summary.md` without touching `handoff.md`.
13
+
14
+ This is **mid-assignment session continuity**, not cross-ticket handoff:
15
+ - Use `/save-session-summary` when you're about to compact, when you'll resume in a new session, or when the user asks to "save the session".
16
+ - Use `/complete-assignment` (which writes `handoff.md`) when finishing the assignment for downstream review.
17
+
18
+ ## Instructions
19
+
20
+ Invoke the `save-session-summary` skill via the Skill tool, passing the user's arguments. The skill handles everything else.
21
+
22
+ Arguments: $ARGUMENTS
23
+
24
+ If the skill is not installed, tell the user to run `syntaur install-plugin` (or `syntaur setup` if they haven't set up yet).
@@ -12,6 +12,16 @@
12
12
  ]
13
13
  }
14
14
  ],
15
+ "PreCompact": [
16
+ {
17
+ "hooks": [
18
+ {
19
+ "type": "prompt",
20
+ "prompt": "Before compaction, if there is an active Syntaur assignment (check `.syntaur/context.json` for `assignmentDir` and `sessionId`), invoke `/save-session-summary` to write `<assignmentDir>/sessions/<sessionId>/summary.md` so a future session can resume cleanly. Skip silently if no active Syntaur context. Do NOT write to `handoff.md` — that is reserved for cross-ticket handoff at completion."
21
+ }
22
+ ]
23
+ }
24
+ ],
15
25
  "SessionStart": [
16
26
  {
17
27
  "hooks": [
@@ -36,11 +36,36 @@ CONTEXT_FILE="$CWD/.syntaur/context.json"
36
36
  # Always replace both sessionId and transcriptPath together. If the incoming
37
37
  # transcript_path is empty, explicitly null the stored transcriptPath so a new
38
38
  # session never inherits a stale transcript path from the prior session.
39
+ #
40
+ # Also resolve the latest session-summary path (mid-assignment continuity) so
41
+ # the resuming agent's first protocol-read can pick it up. Selection rule:
42
+ # the summary.md with the most recent file mtime under
43
+ # <assignmentDir>/sessions/*/summary.md. Null if none exists.
44
+ ASSIGNMENT_DIR_RAW=$(jq -r '.assignmentDir // empty' "$CONTEXT_FILE" 2>/dev/null)
45
+ ASSIGNMENT_DIR="${ASSIGNMENT_DIR_RAW/#\~/$HOME}"
46
+
47
+ LATEST_SUMMARY=""
48
+ if [ -n "$ASSIGNMENT_DIR" ] && [ -d "$ASSIGNMENT_DIR/sessions" ]; then
49
+ # Prefer GNU-style stat formatting if available (Linux); fall back to BSD
50
+ # (macOS). Resolve newest-by-mtime portably.
51
+ while IFS= read -r -d '' f; do
52
+ if M=$(stat -f '%m' "$f" 2>/dev/null) || M=$(stat -c '%Y' "$f" 2>/dev/null); then
53
+ printf '%s\t%s\n' "$M" "$f"
54
+ fi
55
+ done < <(find "$ASSIGNMENT_DIR/sessions" -mindepth 2 -maxdepth 2 -type f -name 'summary.md' -print0 2>/dev/null) \
56
+ | sort -rn -k1,1 \
57
+ | head -1 \
58
+ | cut -f2- > "${CONTEXT_FILE}.summary.tmp.$$" 2>/dev/null
59
+ LATEST_SUMMARY=$(cat "${CONTEXT_FILE}.summary.tmp.$$" 2>/dev/null || true)
60
+ rm -f "${CONTEXT_FILE}.summary.tmp.$$"
61
+ fi
62
+
39
63
  TMP="${CONTEXT_FILE}.tmp.$$"
40
64
  jq \
41
65
  --arg sid "$SESSION_ID" \
42
66
  --arg tp "$TRANSCRIPT_PATH" \
43
- '. + {sessionId: $sid, transcriptPath: (if ($tp | length) > 0 then $tp else null end)}' \
67
+ --arg lsp "$LATEST_SUMMARY" \
68
+ '. + {sessionId: $sid, transcriptPath: (if ($tp | length) > 0 then $tp else null end), latestSessionSummaryPath: (if ($lsp | length) > 0 then $lsp else null end)}' \
44
69
  "$CONTEXT_FILE" > "$TMP" 2>/dev/null \
45
70
  && mv "$TMP" "$CONTEXT_FILE" 2>/dev/null \
46
71
  || rm -f "$TMP"
@@ -18,8 +18,9 @@ You may ONLY write to files inside your assigned assignment folder:
18
18
  | `plan*.md` | Versioned implementation plans (optional, 0 or more: `plan.md`, `plan-v2.md`, ...) — each linked from a todo in `assignment.md` |
19
19
  | `progress.md` | Append-only timestamped progress log (newest first). Replaces the old `## Progress` body section. |
20
20
  | `scratchpad.md` | Working notes |
21
- | `handoff.md` | Append-only handoff log |
21
+ | `handoff.md` | Append-only **assignment-level cross-ticket outbound** at completion (written by `complete-assignment`) |
22
22
  | `decision-record.md` | Append-only decision log |
23
+ | `sessions/<session-id>/summary.md` | **Per-session continuity** for resume across sessions of the same agent on this assignment. Single document per session id, overwritten on every save (written by `/save-session-summary`). Not the same as `handoff.md`. |
23
24
 
24
25
  Path pattern (project-nested): `~/.syntaur/projects/<project>/assignments/<your-assignment>/`
25
26
  Path pattern (standalone): `~/.syntaur/assignments/<your-assignment-uuid>/`
@@ -22,8 +22,11 @@ Protocol version: **2.0**
22
22
  progress.md # Agent-writable, append-only: timestamped progress log
23
23
  comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
24
24
  scratchpad.md # Agent-writable: working notes
25
- handoff.md # Agent-writable: append-only handoff log
25
+ handoff.md # Agent-writable: append-only cross-ticket outbound at completion
26
26
  decision-record.md # Agent-writable: append-only decision log
27
+ sessions/
28
+ <session-id>/
29
+ summary.md # Agent-writable: per-session continuity (single doc, overwritten)
27
30
  resources/
28
31
  _index.md # Derived (read-only)
29
32
  <resource-slug>.md # Shared-writable
@@ -39,6 +42,7 @@ Protocol version: **2.0**
39
42
  scratchpad.md
40
43
  handoff.md
41
44
  decision-record.md
45
+ sessions/<session-id>/summary.md # Per-session continuity, same as project-nested
42
46
  playbooks/
43
47
  manifest.md # Derived: playbook listing (read-only)
44
48
  <slug>.md # User-authored: behavioral rules for agents
@@ -83,3 +87,4 @@ Protocol version: **2.0**
83
87
  9. **Progress** is appended to `progress.md` as timestamped entries (newest first). Do not add a `## Progress` section to `assignment.md`.
84
88
  10. **Comments** are appended to `comments.md` via `syntaur comment <slug> "body" [--type question|note|feedback] [--reply-to <id>]`. Never edit `comments.md` directly. Questions carry a `resolved` flag.
85
89
  11. **Cross-assignment work** is requested via `syntaur request <source> <target> "text"` — appends to the target's `## Todos` annotated `(from: <source>)`.
90
+ 12. **Session continuity** (mid-assignment) lives at `sessions/<session-id>/summary.md` inside the assignment dir — one document per session id, overwritten on every save (via `/save-session-summary`). On resume, pick the latest by `summary.md` file mtime; the Claude Code SessionStart hook also stashes the absolute path in `.syntaur/context.json` as `latestSessionSummaryPath`. Older summaries accumulate as immutable history; never delete them. Distinct from `handoff.md`, which is the assignment-level cross-ticket outbound at completion. `syntaur doctor` intentionally ignores `sessions/`. The Claude Code `PreCompact` hook reminds the agent to invoke `/save-session-summary` before context is compacted.
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: track-session
3
+ description: Use when the user asks to track, register, or log this Claude Code session in the Syntaur dashboard — standalone or linked to a project/assignment. Triggers on "/track-session", "track this session", "register this session in syntaur", or similar.
4
+ ---
5
+
6
+ # Track Session
7
+
8
+ Register the current Claude Code session as an agent session in the Syntaur dashboard. Works standalone or linked to a project/assignment.
9
+
10
+ Only real Claude Code session IDs are accepted — no synthesis. The real id is written to `.syntaur/context.json` by the SessionStart hook, with `~/.claude/sessions/<pid>.json` as the fallback source.
11
+
12
+ ## Usage
13
+
14
+ User arguments: `$ARGUMENTS`
15
+
16
+ - (no args) — register a standalone session
17
+ - `--description "<text>"` — with a description
18
+ - `--project <slug> --assignment <slug>` — linked to a project
19
+ - `--description "<text>" --project <slug> --assignment <slug>` — both
20
+
21
+ ## Workflow
22
+
23
+ ### Step 1: Parse arguments
24
+
25
+ Extract optional flags from the argument string:
26
+ - `--description "<text>"` or `--description <text>` — session description
27
+ - `--project <slug>` — project to link to
28
+ - `--assignment <slug>` — assignment to link to
29
+
30
+ ### Step 2: Source the real session id + transcript path
31
+
32
+ In priority order:
33
+
34
+ 1. Read `.syntaur/context.json` if present. If it contains `sessionId`, use it. Also pick up `transcriptPath` if present.
35
+ 2. Otherwise, read the most-recently-modified file under `~/.claude/sessions/*.json` whose `cwd` matches `$(pwd)` and use its `sessionId` field. The transcript path is conventionally `~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl`; include it if the file exists, otherwise omit.
36
+ 3. If neither source yields an id, abort with: "Could not resolve a real Claude Code session id. Restart the Claude session so the SessionStart hook can populate `.syntaur/context.json`, or run `/rename <slug>` then try again."
37
+
38
+ DO NOT generate a UUID. `syntaur track-session` rejects missing session IDs.
39
+
40
+ ### Step 3: Run the CLI command
41
+
42
+ Run the track-session CLI via Bash (use `dangerouslyDisableSandbox: true` since it writes to `~/.syntaur/`):
43
+
44
+ ```bash
45
+ syntaur track-session \
46
+ --agent claude \
47
+ --session-id "$SESSION_ID" \
48
+ --transcript-path "$TRANSCRIPT_PATH" \
49
+ --path "$(pwd)" \
50
+ [--description "<text>"] \
51
+ [--project <slug>] \
52
+ [--assignment <slug>]
53
+ ```
54
+
55
+ Omit `--transcript-path` entirely (don't pass an empty string) if no transcript path could be resolved.
56
+
57
+ The CLI prints one of:
58
+ - `Registered standalone agent session <sessionId>.`
59
+ - `Registered agent session <sessionId> for <assignment> in <project>.`
60
+
61
+ Registration is idempotent — re-running the command with the same session id safely upserts project/assignment/description onto the existing row.
62
+
63
+ ### Step 4: Merge context.json
64
+
65
+ Ensure `.syntaur/context.json` has the session fields (so SessionEnd and future `track-session` runs find them). Merge, don't overwrite:
66
+
67
+ ```bash
68
+ mkdir -p .syntaur
69
+ if [ -f .syntaur/context.json ]; then
70
+ jq --arg sid "$SESSION_ID" --arg tp "$TRANSCRIPT_PATH" \
71
+ '. + {sessionId: $sid} + (if ($tp | length) > 0 then {transcriptPath: $tp} else {} end)' \
72
+ .syntaur/context.json > .syntaur/context.json.tmp \
73
+ && mv .syntaur/context.json.tmp .syntaur/context.json
74
+ else
75
+ jq -n --arg sid "$SESSION_ID" --arg tp "$TRANSCRIPT_PATH" \
76
+ '{sessionId: $sid} + (if ($tp | length) > 0 then {transcriptPath: $tp} else {} end)' \
77
+ > .syntaur/context.json
78
+ fi
79
+ ```
80
+
81
+ ### Step 5: Confirm
82
+
83
+ Tell the user:
84
+ - The session was registered (include the short session id).
85
+ - It will be auto-stopped when this conversation ends via the SessionEnd hook.
86
+ - If linked to a project, mention which project/assignment.
@@ -4,9 +4,9 @@ Syntaur plugin for OpenAI Codex. Installed automatically during `syntaur setup`.
4
4
 
5
5
  ## What's included
6
6
 
7
- - **Skills:** syntaur-protocol, create-project, create-assignment, grab-assignment, plan-assignment, complete-assignment, track-session
7
+ - **Skills:** syntaur-protocol, create-project, create-assignment, grab-assignment, plan-assignment, complete-assignment, track-session, save-session-summary
8
8
  - **Hooks:** write boundary enforcement, session cleanup
9
- - **Commands:** track-session
9
+ - **Commands:** track-session, save-session-summary (Codex has no `PreCompact` event — invoke manually before compaction or session end)
10
10
  - **Agents:** syntaur-protocol (background)
11
11
  - **References:** protocol docs
12
12
 
@@ -11,7 +11,7 @@ Your job is to work fluently within the Syntaur protocol without breaking owners
11
11
 
12
12
  - Create projects and assignments (project-nested or standalone) with the `syntaur` CLI
13
13
  - Claim assignments and establish local assignment context
14
- - Keep `assignment.md`, active plan files (`plan.md`, `plan-v2.md`, ...), `progress.md`, and `handoff.md` accurate during execution
14
+ - Keep `assignment.md`, active plan files (`plan.md`, `plan-v2.md`, ...), `progress.md`, `handoff.md` (cross-ticket outbound), and any active `sessions/<sid>/summary.md` (mid-assignment continuity) accurate during execution
15
15
  - Record questions/notes/feedback via `syntaur comment` and route cross-assignment work via `syntaur request`
16
16
  - Track Codex sessions for the Syntaur dashboard
17
17
  - Set up Codex adapter instructions in the active workspace
@@ -30,7 +30,8 @@ When a task involves Syntaur:
30
30
  - any `<assignmentDir>/plan*.md` files linked from active todos in the `## Todos` section
31
31
  - `<assignmentDir>/progress.md` (if present) — reverse-chron progress log
32
32
  - `<assignmentDir>/comments.md` (if present) — threaded questions/notes/feedback
33
- - `<assignmentDir>/handoff.md`
33
+ - `<assignmentDir>/handoff.md` — cross-ticket outbound history
34
+ - the latest `<assignmentDir>/sessions/<sid>/summary.md` (selected by file mtime) if present — mid-assignment continuity from a prior session
34
35
  4. Resolve the workspace boundary from `.syntaur/context.json` or `assignment.md` frontmatter before editing code.
35
36
 
36
37
  Project-nested assignments live at `~/.syntaur/projects/<slug>/assignments/<aslug>/`. Standalone assignments live at `~/.syntaur/assignments/<uuid>/` — folder named by UUID, `project: null`, `slug` display-only.
@@ -51,8 +52,9 @@ Project-nested assignments live at `~/.syntaur/projects/<slug>/assignments/<aslu
51
52
  - `plan*.md` (0 or more versioned plan files, e.g., `plan.md`, `plan-v2.md`)
52
53
  - `progress.md` (append timestamped entries, newest first — replaces the old `## Progress` section)
53
54
  - `scratchpad.md`
54
- - `handoff.md`
55
+ - `handoff.md` (append-only; **assignment-level cross-ticket outbound** at completion)
55
56
  - `decision-record.md`
57
+ - `sessions/<session-id>/summary.md` (**per-session continuity**; single doc per session id, overwritten on save by `/save-session-summary`. Codex has no `PreCompact` hook — invoke manually before compaction or session end.)
56
58
  - project `resources/*.md`
57
59
  - project `memories/*.md`
58
60
  - `.syntaur/context.json` in the current working directory
@@ -72,7 +74,7 @@ Project-nested assignments live at `~/.syntaur/projects/<slug>/assignments/<aslu
72
74
  - Update acceptance criteria and `## Todos` checkboxes as work lands.
73
75
  - Append timestamped entries to `progress.md` (not to `assignment.md`) after meaningful milestones.
74
76
  - When requirements shift, supersede the prior plan todo instead of rewriting the old plan file.
75
- - Append handoffs instead of replacing previous handoff entries.
77
+ - Append handoff.md entries (cross-ticket outbound) instead of replacing previous handoff entries. Mid-assignment session continuity is a separate file: `sessions/<sid>/summary.md`, single document per session id, overwritten on each save. Do not delete older `sessions/*/summary.md` files at completion — they remain as immutable history.
76
78
  - Record questions via `syntaur comment ... --type question` — they roll up into `_status.md`'s `openQuestions` counter.
77
79
 
78
80
  ## CLI Reference
@@ -0,0 +1,23 @@
1
+ ---
2
+ description: Write a per-session continuity summary so a future Codex session can resume this assignment cleanly
3
+ ---
4
+
5
+ # /save-session-summary
6
+
7
+ Write a per-session continuity summary at `<assignmentDir>/sessions/<sessionId>/summary.md` so a future session can resume this assignment without re-reading the full transcript.
8
+
9
+ This is **mid-assignment session continuity**, not cross-ticket handoff:
10
+ - Use `/save-session-summary` when about to compact, before ending a session, or when the user asks to "save the session".
11
+ - Use the `complete-assignment` skill (which writes `handoff.md`) when finishing the assignment for downstream review.
12
+
13
+ Codex has no `PreCompact` hook event — invoke this command manually.
14
+
15
+ ## Workflow
16
+
17
+ Follow the `save-session-summary` skill in full. Summary:
18
+
19
+ 1. Read `.syntaur/context.json`. Required: `assignmentDir`, `sessionId`. If `sessionId` is missing, abort with: "Session not tracked. Run `syntaur track-session ...` first." Do not synthesize a session id.
20
+ 2. Create `<assignmentDir>/sessions/<sessionId>/` only at write time (avoid empty dirs).
21
+ 3. Write or overwrite `<assignmentDir>/sessions/<sessionId>/summary.md` with frontmatter (`assignment`, `sessionId`, `created`, `updated`) and body sections: `## Snapshot`, `## What Was Done`, `## What's Next`, `## Open Questions`, `## Load-Bearing Context`. Single document per session id — directory partitions by session.
22
+ 4. Do NOT modify `handoff.md`.
23
+ 5. Optionally append a brief progress entry noting the save.
@@ -18,8 +18,9 @@ You may only write to files inside your assigned assignment folder:
18
18
  | `plan*.md` | Versioned implementation plans (optional, 0 or more: `plan.md`, `plan-v2.md`, ...) — each linked from a todo in `assignment.md` |
19
19
  | `progress.md` | Append-only timestamped progress log (newest first). Replaces the old `## Progress` body section. |
20
20
  | `scratchpad.md` | Working notes |
21
- | `handoff.md` | Append-only handoff log |
21
+ | `handoff.md` | Append-only **assignment-level cross-ticket outbound** at completion (written by `complete-assignment`) |
22
22
  | `decision-record.md` | Append-only decision log |
23
+ | `sessions/<session-id>/summary.md` | **Per-session continuity** for resume across sessions of the same agent on this assignment. Single document per session id, overwritten on every save (written by `/save-session-summary`). Codex has no `PreCompact` hook — invoke manually. |
23
24
 
24
25
  Path pattern (project-nested): `~/.syntaur/projects/<project>/assignments/<your-assignment>/`
25
26
  Path pattern (standalone): `~/.syntaur/assignments/<your-assignment-uuid>/`
@@ -22,8 +22,11 @@ Protocol version: **2.0**
22
22
  progress.md # Agent-writable, append-only: timestamped progress log
23
23
  comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
24
24
  scratchpad.md # Agent-writable: working notes
25
- handoff.md # Agent-writable: append-only handoff log
25
+ handoff.md # Agent-writable: append-only cross-ticket outbound at completion
26
26
  decision-record.md # Agent-writable: append-only decision log
27
+ sessions/
28
+ <session-id>/
29
+ summary.md # Agent-writable: per-session continuity (single doc, overwritten)
27
30
  resources/
28
31
  _index.md # Derived (read-only)
29
32
  <resource-slug>.md # Shared-writable
@@ -39,6 +42,7 @@ Protocol version: **2.0**
39
42
  scratchpad.md
40
43
  handoff.md
41
44
  decision-record.md
45
+ sessions/<session-id>/summary.md # Per-session continuity, same as project-nested
42
46
  playbooks/
43
47
  manifest.md # Derived: playbook listing (read-only)
44
48
  <slug>.md # User-authored: behavioral rules for agents
@@ -83,3 +87,4 @@ Protocol version: **2.0**
83
87
  9. Progress is appended to `progress.md` as timestamped entries (newest first). Do not add a `## Progress` section to `assignment.md`.
84
88
  10. Comments are appended to `comments.md` via `syntaur comment <slug> "body" [--type question|note|feedback] [--reply-to <id>]`. Never edit `comments.md` directly.
85
89
  11. Cross-assignment work is requested via `syntaur request <source> <target> "text"` — appends to the target's `## Todos` annotated `(from: <source>)`.
90
+ 12. Session continuity (mid-assignment) lives at `sessions/<session-id>/summary.md` inside the assignment dir — one document per session id, overwritten on every save (via `/save-session-summary`). On resume, pick the latest by `summary.md` file mtime. Older summaries accumulate as immutable history; never delete them. Distinct from `handoff.md`, which is the assignment-level cross-ticket outbound at completion. `syntaur doctor` intentionally ignores `sessions/`. **Codex has no `PreCompact` hook event** — invoke `/save-session-summary` manually before compaction or session end.
@@ -63,6 +63,8 @@ Do NOT add a `## Progress` section to `assignment.md` — progress entries live
63
63
 
64
64
  ## Step 4: Write Handoff Entry
65
65
 
66
+ `handoff.md` is the **assignment-level cross-ticket outbound** doc — written here, at completion, for the next ticket / agent / human reviewer. It is NOT the mid-assignment session continuity artifact; that lives at `<assignmentDir>/sessions/<sid>/summary.md` and is written by `/save-session-summary`. Any `sessions/*/summary.md` files are reference-only at completion time and MUST NOT be deleted — they remain as immutable historical context.
67
+
66
68
  Read `<assignmentDir>/handoff.md` to see its current content and frontmatter.
67
69
 
68
70
  Append a new handoff entry to the markdown body. Read the current `handoffCount` from the frontmatter and use `handoffCount + 1` as the entry number. The entry must follow this format:
@@ -69,7 +69,11 @@ If either command fails, report the error and stop.
69
69
 
70
70
  ## Step 4: Read Assignment Context and Backfill Workspace
71
71
 
72
- Read the full assignment file. Also read `comments.md` if present (inherited questions / notes). For each `dependsOn` entry, read the dependency's `handoff.md` AND `decision-record.md` so upstream decisions carry forward.
72
+ Read the full assignment file. Also read `comments.md` if present (inherited questions / notes).
73
+
74
+ For each `dependsOn` entry, read the dependency's `handoff.md` AND `decision-record.md` so upstream decisions carry forward. (`handoff.md` is the **cross-ticket outbound** doc — distinct from session continuity.)
75
+
76
+ If `<assignmentDir>/sessions/` exists, also read the most recent `<assignmentDir>/sessions/<sid>/summary.md` (selected by `summary.md` file mtime). This is the **mid-assignment session continuity** artifact written by `/save-session-summary` at the end of a prior session of the same assignment. Treat its `What's Next` and `Load-Bearing Context` sections as resume context. (Note: in Claude Code, the SessionStart hook also stashes this path into context.json as `latestSessionSummaryPath` — same semantics; either source is fine.)
73
77
 
74
78
  From the assignment frontmatter extract: `title`, `workspace.repository`, `workspace.worktreePath`, `workspace.branch`, `dependsOn`, `priority`.
75
79
 
@@ -155,4 +159,5 @@ Summarize:
155
159
  - Active todos from `## Todos`, including any linked plan files.
156
160
  - The workspace path.
157
161
  - Any inherited comments/questions from `comments.md`.
158
- - Suggested next step: `plan-assignment` to create an implementation plan.
162
+ - **Resume context** (if Step 4 found a `sessions/<sid>/summary.md`): a short block citing the session id and the timestamp of that summary's `updated` frontmatter, followed by its `What's Next` bullets. This is mid-assignment continuity distinct from any cross-ticket handoff.
163
+ - Suggested next step: `plan-assignment` to create an implementation plan, or — if a session summary's `What's Next` is concrete — proceed directly with the next step it names.
@@ -50,7 +50,9 @@ Read these files to understand the assignment:
50
50
 
51
51
  Per-project `agent.md` / `claude.md` were removed in protocol v2.0. Agent-level conventions now live at the repo root (`CLAUDE.md` / `AGENTS.md`) and in `~/.syntaur/playbooks/` (already loaded in Step 2).
52
52
 
53
- If the assignment has dependencies (`dependsOn` in frontmatter), read each dependency's `handoff.md` AND `decision-record.md` for integration context and upstream decisions.
53
+ If the assignment has dependencies (`dependsOn` in frontmatter), read each dependency's `handoff.md` AND `decision-record.md` for integration context and upstream decisions. (`handoff.md` is cross-ticket outbound — distinct from session continuity.)
54
+
55
+ If `<assignmentDir>/sessions/` exists, also read the most recent `sessions/<sid>/summary.md` (selected by `summary.md` file mtime). This is mid-assignment continuity from a prior session of the same assignment — its `What's Next`, `Open Questions`, and `Load-Bearing Context` sections are direct planning inputs when resuming work that was already in flight.
54
56
 
55
57
  ## Step 4: Explore Workspace (if set)
56
58
 
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: save-session-summary
3
+ description: >-
4
+ Write a per-session continuity summary so a future session can resume cleanly
5
+ without re-reading the full transcript. Use when the user asks to save session
6
+ state, prepare to compact, or hand off mid-assignment to a new session of the
7
+ same agent. Triggered by `/save-session-summary`, by Claude Code's PreCompact
8
+ hook, or when the user says "save the session" / "before we compact" / similar.
9
+ license: MIT
10
+ metadata:
11
+ author: prong-horn
12
+ version: "1.0.0"
13
+ ---
14
+
15
+ # Save Session Summary
16
+
17
+ Write or overwrite the current session's continuity summary at
18
+ `<assignmentDir>/sessions/<sessionId>/summary.md`. This is **session-scoped
19
+ mid-assignment continuity** — distinct from `handoff.md`, which is the
20
+ **assignment-level cross-ticket outbound** doc written by `complete-assignment`.
21
+
22
+ ## When NOT to use this skill
23
+
24
+ - Use `complete-assignment` instead when finishing the assignment for a downstream ticket / human reviewer — that writes `handoff.md`.
25
+ - Do not write to `handoff.md` here. The two artifacts are separate.
26
+
27
+ ## Step 1: Load Context
28
+
29
+ Read `.syntaur/context.json` from the current working directory.
30
+
31
+ If the file does not exist, tell the user: "No active assignment found. Run `grab-assignment` first." and stop.
32
+
33
+ Extract:
34
+ - `assignmentDir` (absolute path) — required.
35
+ - `sessionId` — required, must be the real agent runtime session id.
36
+
37
+ If `sessionId` is missing, empty, or `null`, abort with: "Session not tracked. Run `syntaur track-session ...` first." Do not invent or generate a session id.
38
+
39
+ ## Step 2: Ensure Session Directory
40
+
41
+ Create `<assignmentDir>/sessions/<sessionId>/` only at this step (not earlier — empty session dirs are noise). Use `mkdir -p` semantics so re-saves are idempotent.
42
+
43
+ ## Step 3: Read Existing Summary (if any)
44
+
45
+ If `<assignmentDir>/sessions/<sessionId>/summary.md` already exists, read it and preserve its `created` frontmatter timestamp. Otherwise, the new file's `created` is now.
46
+
47
+ This is a **single document per session id** — every save in the same session overwrites in place. The directory partitions by session id, so older sessions remain on disk as immutable history.
48
+
49
+ ## Step 4: Write the Summary
50
+
51
+ Write `<assignmentDir>/sessions/<sessionId>/summary.md` with this structure (overwrite if it exists). Fill the section bodies with content derived from this session's actual work — be specific and concrete, this is what a future session will load to resume.
52
+
53
+ ```markdown
54
+ ---
55
+ assignment: <assignment-slug>
56
+ sessionId: <session-id>
57
+ created: "<original created timestamp, or now if new>"
58
+ updated: "<now, ISO 8601>"
59
+ ---
60
+
61
+ # Session Summary
62
+
63
+ ## Snapshot
64
+
65
+ <One paragraph: what the assignment is, where work currently stands, what is load-bearing for a future session to know immediately on resume.>
66
+
67
+ ## What Was Done
68
+
69
+ - <Concrete action 1>
70
+ - <Concrete action 2>
71
+ - ...
72
+
73
+ ## What's Next
74
+
75
+ - <Most important next step>
76
+ - <Subsequent steps in order>
77
+ - ...
78
+
79
+ ## Open Questions
80
+
81
+ - <Unresolved question or decision>
82
+ - <Ambiguity to resolve>
83
+ - ...
84
+ (or "None." if no open items)
85
+
86
+ ## Load-Bearing Context
87
+
88
+ - File paths + line numbers that matter for resume
89
+ - Command outputs the next session will need
90
+ - Decisions made this session that aren't captured in `decision-record.md`
91
+ - External references (PRs, issues, docs) that scope the next steps
92
+ ```
93
+
94
+ ## Step 5: Confirm — Do NOT Touch handoff.md
95
+
96
+ Verify your write did not modify `<assignmentDir>/handoff.md`. The two artifacts are deliberately separate:
97
+
98
+ | File | Scope | When written | Audience |
99
+ |------|-------|--------------|----------|
100
+ | `handoff.md` | Assignment-level | At completion (via `complete-assignment`) | Next ticket / agent / human reviewer |
101
+ | `sessions/<sid>/summary.md` | Session-scoped | Mid-assignment, on demand or pre-compact | Future session of the same agent on the same assignment |
102
+
103
+ ## Step 6: Append a Progress Entry (optional but recommended)
104
+
105
+ If progress hasn't already been logged in this turn, append a brief entry to `<assignmentDir>/progress.md` noting that a session summary was saved and the next-step pointer.
106
+
107
+ ## Step 7: Report to User
108
+
109
+ Summarize:
110
+ - Path of the written summary
111
+ - Session id
112
+ - Number of items in "What's Next" (so the user knows resume scope)
113
+ - Reminder: this is mid-assignment continuity, not cross-ticket handoff
@@ -26,8 +26,9 @@ Respect file ownership boundaries. The Claude Code and Codex plugins enforce the
26
26
  - `plan*.md` (versioned — `plan.md`, `plan-v2.md`, etc.)
27
27
  - `progress.md` (append-only, timestamped)
28
28
  - `scratchpad.md`
29
- - `handoff.md` (append-only)
29
+ - `handoff.md` (append-only — **assignment-level cross-ticket outbound**)
30
30
  - `decision-record.md` (append-only)
31
+ - `sessions/<sessionId>/summary.md` (**session-scoped mid-assignment continuity** — single document per session id, overwritten on save)
31
32
  2. **Project-level shared files:**
32
33
  - `~/.syntaur/projects/<project>/resources/<slug>.md`
33
34
  - `~/.syntaur/projects/<project>/memories/<slug>.md`
@@ -49,6 +50,22 @@ Respect file ownership boundaries. The Claude Code and Codex plugins enforce the
49
50
 
50
51
  Per-project `agent.md` / `claude.md` do NOT exist in protocol v2.0. Agent-level conventions now live at the repo root (`CLAUDE.md` / `AGENTS.md`) and in `~/.syntaur/playbooks/`.
51
52
 
53
+ ## Session Continuity vs Cross-Ticket Handoff
54
+
55
+ Two related but distinct artifacts. Conflating them is a recurring mistake.
56
+
57
+ | Artifact | Scope | When written | Audience | Written by |
58
+ |---|---|---|---|---|
59
+ | `handoff.md` | Assignment-level | At completion | The next ticket / agent / human reviewer | `complete-assignment` skill |
60
+ | `sessions/<sessionId>/summary.md` | Session-scoped | Mid-assignment, before compaction or at session end | A future session of the same agent on the same assignment | `save-session-summary` skill |
61
+
62
+ Rules:
63
+ - One `summary.md` per session id directory; overwrite on every save.
64
+ - Older `sessions/<sid>/summary.md` files accumulate as immutable history — never delete them, even at completion.
65
+ - Resume picks the latest by `summary.md` file mtime. The Claude Code SessionStart hook also stashes that absolute path into `.syntaur/context.json` as `latestSessionSummaryPath` for convenience; either source is fine.
66
+ - Codex has no `PreCompact` hook — Codex agents invoke `/save-session-summary` manually before compaction or session end.
67
+ - `syntaur doctor` intentionally does NOT validate `sessions/` — sessions are optional and absence is not anomalous.
68
+
52
69
  ## Current Assignment Context
53
70
 
54
71
  If `.syntaur/context.json` exists in the current working directory, read it before making changes. Fields you will see:
@@ -60,6 +77,7 @@ If `.syntaur/context.json` exists in the current working directory, read it befo
60
77
  - `workspaceRoot` — absolute path to the code workspace
61
78
  - `sessionId` — real agent-runtime session id (never a synthesized UUID)
62
79
  - `transcriptPath` — absolute path to the agent's rollout/transcript file, if known
80
+ - `latestSessionSummaryPath` — absolute path to the most recent `sessions/<sid>/summary.md` (Claude Code SessionStart hook resolves this; `null` if none)
63
81
 
64
82
  ## Required Reading Order
65
83
 
@@ -71,8 +89,9 @@ When starting work on an existing assignment, read these in order:
71
89
  4. `<assignmentDir>/assignment.md`
72
90
  5. `<assignmentDir>/comments.md` if present — inherited questions / notes
73
91
  6. Latest `<assignmentDir>/plan*.md` (pick the newest)
74
- 7. `<assignmentDir>/handoff.md` — history
75
- 8. For each `dependsOn` entry: the dependency's `handoff.md` AND `decision-record.md` upstream integration context and accepted decisions carry forward
92
+ 7. `<assignmentDir>/handoff.md` — cross-ticket outbound history (entries from prior agents/humans handing this assignment off)
93
+ 8. The latest `<assignmentDir>/sessions/<sid>/summary.md` if present (mid-assignment resume context from a prior session of this assignment) — selected by `summary.md` file mtime, or via `latestSessionSummaryPath` in context.json on Claude Code
94
+ 9. For each `dependsOn` entry: the dependency's `handoff.md` AND `decision-record.md` — upstream integration context and accepted decisions carry forward
76
95
 
77
96
  ## Lifecycle Commands
78
97
 
@@ -108,7 +127,7 @@ ls ~/.syntaur/playbooks/*.md 2>/dev/null
108
127
  - Append milestones to `progress.md` — do NOT add a `## Progress` section to `assignment.md` (v2.0 moved progress to its own file).
109
128
  - `## Todos` in `assignment.md` is an informal markdown checklist. Items may be simple tasks or markdown links to plan files. When a plan is superseded, mark the old todo as `- [x] ~~Execute [plan](./plan.md)~~ (superseded by plan-v2)` — never delete. `## Todos` is also the landing spot for cross-assignment `syntaur request` entries.
110
129
  - Record questions / notes / feedback via `syntaur comment` — never edit `comments.md` directly. Do NOT set status to `blocked` just because there is an open question; block only for a real external dependency with a `--reason`.
111
- - Write handoffs with enough context for another agent or human to continue cleanly. Record decisions in `decision-record.md` with Status / Context / Decision / Consequences — downstream dependents auto-load these during grab.
130
+ - Write `handoff.md` entries (via `complete-assignment`) with enough context for another agent or human to continue cleanly **across tickets**. Write `sessions/<sid>/summary.md` (via `/save-session-summary`) for mid-assignment continuity within the same assignment across sessions of the same agent. Do not mix the two. Record decisions in `decision-record.md` with Status / Context / Decision / Consequences — downstream dependents auto-load these during grab.
112
131
  - Commit frequently with messages referencing the assignment slug.
113
132
 
114
133
  ## References
@@ -22,8 +22,9 @@ You may only write to files inside your currently-claimed assignment folder:
22
22
  | `plan*.md` | Versioned implementation plans (`plan.md`, `plan-v2.md`, ...). When superseded, the old plan's todo is marked superseded but the file itself is never deleted. |
23
23
  | `progress.md` | Append-only, timestamped progress log (newest first). |
24
24
  | `scratchpad.md` | Working notes. |
25
- | `handoff.md` | Append-only handoff log. |
25
+ | `handoff.md` | Append-only **assignment-level cross-ticket outbound** at completion (written by `complete-assignment`). |
26
26
  | `decision-record.md` | Append-only decision log (Status / Context / Decision / Consequences). |
27
+ | `sessions/<session-id>/summary.md` | **Per-session continuity** for resume across sessions of the same agent on this assignment. Single document per session id, overwritten on every save (written by `/save-session-summary`). Not the same as `handoff.md`. |
27
28
 
28
29
  Path patterns:
29
30
  - Project-nested: `~/.syntaur/projects/<project>/assignments/<your-assignment-slug>/`