Engagement tagging assigns engagement IDs to individual rounds within inscribed sessions. The tags are the filtering key for every engagement-scoped operation in context surgery (method 54): compress-engagement, extract-engagement, and split all depend on rounds carrying engagement_id values. Without tags, those operations have nothing to select on. Tagging is the bridge between the session record (what happened) and the engagement model (what it was for).
#Engagement Discovery
Before tagging a session, enumerate the engagement vocabulary. An engagement ID is a short, stable, human-readable slug that identifies a workstream. The vocabulary comes from four sources, checked in order:
engagement.md files. Active projects may already have engagement.md files (architecture 39) with engagement_id fields in their frontmatter. These are authoritative — use them as-is.
Board entries. Board posts that mention distinct workstreams often name them implicitly. "Console work is done" implies a console-work engagement. Read board.md for workstream names that recur.
Session content. Many sessions predate the engagement model. Their workstreams must be discovered by reading the round previews. Look for topic transitions — where the conversation shifts from one concern to another. Each distinct concern is a candidate engagement.
Cross-session consistency. The same workstream may appear in multiple sessions. Use the same engagement ID everywhere. The vocabulary is global, not per-session.
#Engagement ID Format
<domain>-<topic>, lowercase, hyphen-separated. The domain is the area of work; the topic is the specific concern. Examples:
infra-session-inscription— building the session inscription systeminfra-console-viewer— web console, viewer consolidation, browser designinfra-engagement-system— engagement skills, engagement.md formatinfra-agent-runner— agent runner developmentinfra-exoscale-deploy— Exoscale deployment, sync, remote servicesdesign-context-surgery— context surgery model, compression, split/mergedesign-knowledge-org— knowledge organization, filesystem restructuringdesign-situation-browser— situation browser design and iterationdesign-panel-claims— panel creation standard, claim extractionproject-5ht-talk— 5HT talk/slides workproject-asc-review— ASC review processproject-inscription-paper— inscription paper/arXivproject-library-theorem— Library Theorem paper, arXiv submissionproject-fct-grants— FCT grant applicationsmeta-session-management— roster, dispatch, agent coordinationmeta-role-coordination— standing role handoffs, mandate workops-system-health— CPU issues, daemon management, file watcher problems
The vocabulary grows as new workstreams are discovered. Prefer reusing an existing ID over creating a near-duplicate.
#Classification Process
For each session:
#Step 1 — Read the round previews
Read the session's index.md table. The you said and agent said columns provide enough signal to identify topic boundaries in most rounds. For ambiguous rounds, read the full round JSON.
#Step 2 — Identify topic transitions
Scan sequentially. Note where the conversation shifts from one engagement to another. Transitions are usually visible as:
- The user introduces a new topic ("ok, now let's work on...")
- A long time gap between rounds (the user left and returned with a different concern)
- A task notification arriving from unrelated work
- The user explicitly switching context ("what about the console?")
#Step 3 — Assign engagement IDs
Apply one engagement_id per round. Rules:
- Primary content wins. A round belongs to the engagement it primarily advances. If a round discusses console work for 80% and mentions the inscription system briefly, it gets the console tag.
- Meta-rounds follow context. Rounds like "what's on deck?" or "wrap up" get tagged with the engagement they're embedded in. If they are genuinely cross-cutting (spanning multiple engagements equally), leave them null.
- One tag per round. No multi-tagging. The engagement_id column is a single value, not a list. When a round spans two engagements, assign the dominant one.
- Task notifications inherit.
<task-notification>rounds get the engagement of the task that produced them, which is usually the engagement of the preceding user request. - Interrupted rounds. Rounds that are interrupted (
[Request interrupted by user]) with no substantive content get the tag of the surrounding block, or null if isolated. - System rounds. Rounds from
/model,/compact, and other CLI commands get null unless they are clearly part of an engagement transition.
#Step 4 — Consistency checks
After initial classification, verify:
- No isolated tags. A single round tagged X surrounded by rounds tagged Y is likely wrong. Check whether the content genuinely belongs to X.
- Clean transitions. Tags should form contiguous blocks. Alternating tags (X, Y, X, Y) suggest either the engagements are really one thing, or the transition points need adjustment.
- Reasonable block sizes. An engagement block of 1-2 rounds in a long session is suspicious. Either the content was too brief to constitute a real engagement (tag it with the surrounding engagement), or it is a genuine micro-engagement (keep it, but note it).
#Step 5 — Summary table
Produce a summary per session:
Session: 24f52300 (75 rounds)
infra-session-inscription: rounds 1-12, 16-27
infra-console-viewer: rounds 38-58
design-context-surgery: rounds 59-75
null (meta/system): rounds 13-15, 28-37
The summary is the review artifact. The human reviews it before tags are written to SQL.
#Writing Tags
Tags are written via the session scribe CLI:
python3 infra/scripts/session_scribe.py tag <uuid> <range> "<engagement_id>" --agent <agent_id>
The <range> is either a single round number, a lo-hi range, or all. Examples:
python3 infra/scripts/session_scribe.py tag 24f52300-... 1-12 "infra-session-inscription"
python3 infra/scripts/session_scribe.py tag 24f52300-... 38-58 "infra-console-viewer"
python3 infra/scripts/session_scribe.py tag 38ebd26a-... 1-58 "project-fct-grants" --agent sill
Tags are mutable. Re-running the command overwrites previous tags for those rounds. This is safe — the block store is never modified, only the SQL index.
#Retroactive Tagging at Scale
For sessions that predate the engagement model (the majority of the corpus), batch tagging proceeds as follows:
- Prioritize. Start with the longest and most recent sessions — they contain the most active workstreams.
- Discover vocabulary. The first pass through key sessions establishes the engagement vocabulary.
- Propagate. Once the vocabulary is stable, older sessions can be tagged faster — the engagement IDs are known, and round content is matched against known patterns.
- Validate. Cross-session queries (
SELECT engagementid, COUNT(*) FROM rounds GROUP BY engagementid) verify that the vocabulary is consistent and coverage is adequate.
#Relationship to Other Methods
Session inscription (method 53) produces the round records that tagging annotates. Inscription is prerequisite; tagging is post-hoc annotation.
Engagement state (architecture 39) defines what an engagement is. Tagging connects individual rounds to engagement instances. When an engagement.md exists, its engagement_id is the tag value.
Context surgery (method 54) consumes tags. compress-engagement, extract-engagement, and split all filter on engagement_id. Without tags, these operations cannot distinguish workstreams within a session.
method . 55 . engagement tagging . 2026-03-20 . zach + claude
Methods 55 — Engagement Tagging — 2026 — Zachary F. Mainen / HAAK