Wrap-up
Close out a finished session: close the completed work in Vertiso Memory —
complete the actions that shipped, archive the intents and projects whose
full scope is done — journal the stable state, and ensure every deferred
follow-on is tracked — as a vmem ACTION (a concrete piece of work) or, for a
measurable outcome to achieve or maintain, an intent.
Announce: "Using the wrap-up skill to close out this session."
Consent boundary
Invoking this skill at the user's request, or affirmatively accepting an
agent's offer to run it, authorizes one capture. Invocation authorizes the
wrap-up memory and its checkpoint-backed transcript gathering, including
selected attributed verbatim excerpts sent to Vertiso Memory. Once invoked, do
not ask a second permission question for that capture. It does not authorize
creating, completing, or archiving actions, intents, or projects; those
additional mutations retain the explicit confirmation step below.
Do not ask whether to write the wrap-up memory; the user's invocation already
authorized it. When follow-on or closure candidates exist, ask only whether
to create or close those named actions/intents/projects, and state that the
wrap-up memory will be written regardless. If both lists are empty, proceed
without another question.
One invocation does not grant standing authorization for later wrap-ups. Omit
and do not persist passwords, API keys, authentication tokens, payment
information, illegal or illicit materials, or sensitive third-party
information the user is not authorized to store.
Secret stripping
Before composing the memory, inspect every selected source, including the
conversation, transcript, work artifacts, tool output, title, tags, and
metadata, for secrets. Treat passwords, API keys, bearer or refresh tokens,
OAuth codes, session cookies, private keys, recovery codes, and credentialed
connection strings as secrets.
Strip or redact any detected value before composing the memory. Never send the
original value to Vertiso Memory or copy it into a quote, title, tag, metadata,
link, or error detail. Do not echo the secret in the report; state only that
sensitive content was omitted. If sanitization would make the capture
meaningless, stop and ask the user for a sanitized replacement.
When to use
- The user runs
/wrap-up.
- The user asks for a wrap-up or affirmatively accepts an agent's offer.
- Stabilized work, completed actions / intents / projects, or concrete
follow-ons are reasons to offer a wrap-up, not authorization to run it. If
work continues, offer a
handoff instead.
Distinct from related skills
handoff — work continues and the next agent needs a pick-up point.
Wrap-up is the opposite: work ends, nothing to resume.
goodbye — the vmem session-lifecycle close. Orthogonal: a wrap-up
may run before goodbye, or stand alone mid-day when a workstream finishes.
Procedure
Gather the past context via the checkpoint skill. Follow the
checkpoint skill's Procedure steps 1-2 — gather from the workstream's own
artifacts (checkpoint's gather step carries the domain palette: software is
git log / git status / gh pr, but match the domain — a PRD, a deck,
CAD revisions, a signed doc; not git by default), plus list_recent for
memories written this session and the user's explicit "done" / "shipped" /
"delivered" signals; then retrospective-sweep the whole span for the
attributed verbatim decisions (who said what). This gathered context FILLS
wrap-up's "Decisions + WHYs" slot verbatim — carry checkpoint's
attributed quotes and detailed snapshot across word-for-word, do NOT
summarize them — and informs "Worked on" / "Stable state". Wrap-up's other
slots — What shipped, What closed, Next steps — BUILD on it, they are not
replaced by checkpoint. Do NOT invoke the checkpoint skill itself (that
writes a checkpoint memory) — reuse its gather + sweep. Summarizing the
verbatim away is the exact failure mode that motivated the shared engine.
Identify closure candidates — every completable work type. Audit every
action, intent, and project the session touched: list_actions and the
primer's open_actions for actions (their ids are the complete_action
ids, distinct from memory ids — each row also carries the memory_id it
came from), list_recent for intents and projects, plus anything linked
from the gathered context. Propose completion ONLY on a witnessed
completion event; propose abandonment ONLY on the user's explicit
statement that the item is dropped — never inferred from inactivity.
Partially shipped or broader-scope → do not; uncertain → ask, don't guess.
- Action → the work itself is done (the PR merged, the artifact
delivered, the user said "done") → propose
complete_action(closed: true).
- Intent → the measurable outcome is reached and the intent's full
scope shipped → propose
archive_memory(complete: true).
- Project → every piece of work in its scope is closed and nothing in
scope remains open → propose
archive_memory(complete: true). Witness
the scope — no single read covers it, so run all three:
list_actions(memory_id: <project id>, work: "open") (only the actions
cut from the project's own text); list_actions(tags: ["project:<slug>"], work: "open") and list_recent(types: ["intent", "project"], tags: ["project:<slug>"], work: "open") for tagged
membership, where the project's tag is known; and, for every
memory_id in the project's get_memory references /
referenced_by (edge rows carry ids and titles, not status), a
follow-up get_memory showing the item archived or its work_status
closed. All empty → the scope is clear. An edge list at its 20-row cap,
or a scope you cannot enumerate → uncertain → ask. Closing a project's
child actions does NOT close the project: while any in-scope work is
still incomplete the project stays active and only the finished
children close.
A parent — intent or project — is never archived over open children,
as complete or as abandoned. When the user says a parent is done but its
scope still holds open items, each open item becomes its own closure
candidate and step 4 asks, per item: complete it too, drop it (abandon),
or leave the parent open as incomplete.
An item that is no longer actionable but was never finished is the
abandoned shape and is proposed as such, never as completion:
complete_action(status: "abandoned") for an action (never archive an
action's root memory to abandon it — that hides the whole root);
archive_memory(complete: false) for an intent or project. An
intent-only audit is the failure mode this step exists to prevent:
shipped actions left open, projects never examined.
Resolve next-step linkage. For each slot-7 item: link an existing
intent or open action if one matches — never one on the closure
candidate list; an item that still has a next step is not done. If none
exists, propose a new
ACTION (remember(type: "action", ...)) — a concrete piece of work to
do. Propose a new intent ONLY for a measurable outcome to achieve or
maintain (intents are goals, not to-dos; actions are the to-dos that serve
them). Transient items (one-off cleanup, naming fixes) get an inline
[transient] annotation instead of a memory.
Confirm before memory mutations. Show the user the proposed new
action/intent list (title + one-line description each) and the closure
candidate list (type, the call that will run, and the one-line witness
each — the completion event, or, for an abandonment, the user's words
that retired it; a parent with open children lists each child with its
complete / drop / leave-open choice), then wait for explicit go-ahead;
the user may pick a subset.
If both lists are empty, no additional confirmation is needed. Frame this
as confirmation only for the named changes, not for the wrap-up. Never
create, complete, or archive memories without confirmation; invocation
already authorized the wrap-up memory itself.
Create the confirmed follow-ons — remember(type: "action", ...) for
work items, remember(type: "intent", ...) for measurable outcomes —
capturing their IDs for slot 7.
Close the confirmed work, one call each, BEFORE writing the wrap-up
so slot 4 records only what actually landed: complete_action(id:, closed: true) for an action (the action id from list_actions /
open_actions, not the memory id) — pass closed explicitly: with
neither closed nor status the call TOGGLES the current state and
would reopen an action already closed elsewhere; archive_memory(id:, complete: true) for an intent or project — pass complete explicitly,
never lean on the archive default to carry a completion claim;
complete_action(id:, status: "abandoned") for a confirmed abandoned
action and archive_memory(id:, complete: false) for a confirmed
abandoned intent or project. Capture each result: build slot 4 only from
successful receipts; a call that errors or times out is re-checked
against current state before it is reported or retried — closed on
re-check counts as a receipt, still open is reported open. Neither tool
has a free-text reason field, so the close-out's traceability lives in
slot 4 ("What closed") of the body below — it names each closed item,
its type, its verb, and the witness that justified it; the wrap-up memory
is itself the durable record of the close.
Write the wrap-up memory via remember: pass type: "observation" and
metadata: { kind: "wrap-up", scope: <the session's primary scope, a git branch or project name, if any> }. (remember has no top-level scope
argument; scope travels inside metadata.) Cite evidence inline (the
artifact reference — a commit SHA / PR URL for code, or the published /
signed / delivered artifact otherwise; a memory ID) and use the
[anchor](vertiso-memory://memories/{id}) link format for every vmem
cross-reference so the graph picks them up.
Report using the format below. Every actionable item must reach the
user with its action/intent link or its transient rationale.
The body
Checkpoint's gather (step 1) fills the Decisions + WHYs slot and informs
Worked-on / Stable state. The rest are wrap-up's own terminal slots — What
shipped, What closed, Next steps — built on that context, not replaced by it.
- Worked on — what this session was about, in a sentence or two.
- Decisions + WHYs (attributed verbatim) — the session's decisions with
the exact words that drove them, attributed to who spoke (the user's framing
plus any agent turn that carried the context/insight), per checkpoint's
verbatim discipline. Do NOT summarize these away — this is the slot a
wrap-up historically dropped.
- What shipped / delivered — concrete artifacts, each with evidence.
Software: commit SHAs, PR numbers + URLs, migrations run, deploys, memories
written. Otherwise the delivered artifact itself is the evidence: a
published deck, a signed contract, a released CAD revision, a sent
proposal, a delivered mockup. No citation (or artifact reference), no
entry.
- What closed — actions completed, intents / projects archived, and
items abandoned in this wrap-up, each with its type, its verb, and the
witness that justifies it. A completion carries the witnessed event (a PR
merged, a deliverable accepted, a decision ratified, a milestone hit —
e.g. "complete action #4960 — PR #147 merged"; "archive intent #4954 —
AiCall + CostRate live in production, full scope shipped"); an
abandonment carries the user's words that retired it, never a completion
event (e.g. "abandon action #4971 — user: 'we're not doing the CSV
export'"). One line each. A project listed here as completed means
nothing in its scope remains open.
- Stable state — the state of the world after this session: what's live /
final / in-flight, and the equivalent for the domain (deployed and on
main; or published / signed / shipped / still pending), what assumptions
hold. The context a future agent would otherwise have to reconstruct.
- Worth flagging — non-actionable notes: memories written this session
(linked), decisions that changed how we work, lessons captured. Not
follow-ons — those go in slot 7.
- Next steps — actionable follow-ons. Per line:
- [action title](vertiso-memory://memories/{id}) — what to do next. A
transient item not worth a memory gets a [transient] prefix and a reason
instead of a link.
Report format
## Wrap-up
- **Wrap-up memory**: vmem #{id}
- **Actions completed**: {count} — {#id (title), …, or "none"}
- **Intents archived**: {count} — {#id (title), …, or "none"}
- **Projects archived**: {count} — {#id (title), …, or "none"}
- **Abandoned**: {count} — {type #id (title), …, or "none"}
- **Left open**: {count} — {type #id (title) — declined | close failed: <error>, or "none"}
- **Actions created**: {count} — {#id (title), …, or "none"}
- **Intents created**: {count} — {#id (title), …, or "none"}
## Next steps ({n})
1. [title](vertiso-memory://memories/{id}) — {what to do}
2. [transient] {item} — {why no tracked memory}
Every slot-7 item appears here with its action/intent link or its transient
rationale. An item the user declined to track gets a [deferred — not tracked] annotation so the choice stays visible. A closure candidate the
user declined, or whose call failed, appears under Left open with its
reason.
Authoring honesty
A wrap-up's value is the closure audit, the follow-on tracking discipline,
and a record future sessions can trust as a primary source. Sloppy or
dishonest authoring poisons all three.
- "Shipped" needs evidence on the same line — no bare claims.
- "Closed #X" — an action completed, an intent or project archived — needs a
witnessed event (a PR merge, a user confirmation, an observable proxy), not
chat narrative; an abandonment needs the user's explicit retirement, never
an inference from inactivity. A project closed as completed additionally
needs nothing in its scope still open.
- Say "inferred" or "believed to be" for anything you did not directly observe.
- A slot-7 item with neither an action/intent link nor a
[transient]
annotation is a drop risk — never leave one without one of the two.
1---2name: wrap-up3description: Close out stabilized work in Vertiso Memory when the user requests a wrap-up, invokes /wrap-up, or affirmatively accepts an agent's offer. Separately confirm any proposed follow-on creation or work closure — completing actions, archiving finished intents and projects — then record the stable state, so deferred follow-ons are tracked without unapproved state changes.4---56# Wrap-up78Close out a finished session: close the completed work in Vertiso Memory —9complete the actions that shipped, archive the intents and projects whose10full scope is done — journal the stable state, and ensure every deferred11follow-on is tracked — as a vmem ACTION (a concrete piece of work) or, for a12measurable outcome to achieve or maintain, an intent.1314**Announce:** "Using the wrap-up skill to close out this session."1516## Consent boundary1718Invoking this skill at the user's request, or affirmatively accepting an19agent's offer to run it, authorizes one capture. Invocation authorizes the20wrap-up memory and its checkpoint-backed transcript gathering, including21selected attributed verbatim excerpts sent to Vertiso Memory. Once invoked, do22not ask a second permission question for that capture. It does not authorize23creating, completing, or archiving actions, intents, or projects; those24additional mutations retain the explicit confirmation step below.2526Do not ask whether to write the wrap-up memory; the user's invocation already27authorized it. When follow-on or closure candidates exist, ask only whether28to create or close those named actions/intents/projects, and state that the29wrap-up memory will be written regardless. If both lists are empty, proceed30without another question.3132One invocation does not grant standing authorization for later wrap-ups. Omit33and do not persist passwords, API keys, authentication tokens, payment34information, illegal or illicit materials, or sensitive third-party35information the user is not authorized to store.3637### Secret stripping3839Before composing the memory, inspect every selected source, including the40conversation, transcript, work artifacts, tool output, title, tags, and41metadata, for secrets. Treat passwords, API keys, bearer or refresh tokens,42OAuth codes, session cookies, private keys, recovery codes, and credentialed43connection strings as secrets.4445Strip or redact any detected value before composing the memory. Never send the46original value to Vertiso Memory or copy it into a quote, title, tag, metadata,47link, or error detail. Do not echo the secret in the report; state only that48sensitive content was omitted. If sanitization would make the capture49meaningless, stop and ask the user for a sanitized replacement.5051## When to use5253- The user runs `/wrap-up`.54- The user asks for a wrap-up or affirmatively accepts an agent's offer.55- Stabilized work, completed actions / intents / projects, or concrete56 follow-ons are reasons to offer a wrap-up, not authorization to run it. If57 work continues, offer a `handoff` instead.5859## Distinct from related skills6061- **`handoff`** — work continues and the next agent needs a pick-up point.62 Wrap-up is the opposite: work ends, nothing to resume.63- **`goodbye`** — the vmem session-lifecycle close. Orthogonal: a wrap-up64 may run before `goodbye`, or stand alone mid-day when a workstream finishes.6566## Procedure67681. **Gather the past context via the checkpoint skill.** Follow the69 `checkpoint` skill's Procedure steps 1-2 — gather from the workstream's own70 artifacts (checkpoint's gather step carries the domain palette: software is71 `git log` / `git status` / `gh pr`, but match the domain — a PRD, a deck,72 CAD revisions, a signed doc; not git by default), plus `list_recent` for73 memories written this session and the user's explicit "done" / "shipped" /74 "delivered" signals; then retrospective-sweep the whole span for the75 attributed verbatim decisions (who said what). This gathered context FILLS76 wrap-up's "Decisions + WHYs" slot **verbatim** — carry checkpoint's77 attributed quotes and detailed snapshot across word-for-word, do NOT78 summarize them — and informs "Worked on" / "Stable state". Wrap-up's other79 slots — What shipped, What closed, Next steps — BUILD on it, they are not80 replaced by checkpoint. Do NOT invoke the checkpoint skill itself (that81 writes a checkpoint memory) — reuse its gather + sweep. Summarizing the82 verbatim away is the exact failure mode that motivated the shared engine.832. **Identify closure candidates — every completable work type.** Audit every84 action, intent, and project the session touched: `list_actions` and the85 primer's `open_actions` for actions (their ids are the `complete_action`86 ids, distinct from memory ids — each row also carries the `memory_id` it87 came from), `list_recent` for intents and projects, plus anything linked88 from the gathered context. Propose completion ONLY on a witnessed89 completion event; propose abandonment ONLY on the user's explicit90 statement that the item is dropped — never inferred from inactivity.91 Partially shipped or broader-scope → do not; uncertain → ask, don't guess.92 - **Action** → the work itself is done (the PR merged, the artifact93 delivered, the user said "done") → propose94 `complete_action(closed: true)`.95 - **Intent** → the measurable outcome is reached and the intent's full96 scope shipped → propose `archive_memory(complete: true)`.97 - **Project** → every piece of work in its scope is closed and nothing in98 scope remains open → propose `archive_memory(complete: true)`. Witness99 the scope — no single read covers it, so run all three:100 `list_actions(memory_id: <project id>, work: "open")` (only the actions101 cut from the project's own text); `list_actions(tags:102 ["project:<slug>"], work: "open")` and `list_recent(types: ["intent",103 "project"], tags: ["project:<slug>"], work: "open")` for tagged104 membership, where the project's tag is known; and, for every105 `memory_id` in the project's `get_memory` `references` /106 `referenced_by` (edge rows carry ids and titles, not status), a107 follow-up `get_memory` showing the item archived or its `work_status`108 closed. All empty → the scope is clear. An edge list at its 20-row cap,109 or a scope you cannot enumerate → uncertain → ask. Closing a project's110 child actions does NOT close the project: while any in-scope work is111 still incomplete the project stays active and only the finished112 children close.113114 A parent — intent or project — is never archived over open children,115 as complete or as abandoned. When the user says a parent is done but its116 scope still holds open items, each open item becomes its own closure117 candidate and step 4 asks, per item: complete it too, drop it (abandon),118 or leave the parent open as incomplete.119120 An item that is no longer actionable but was never finished is the121 abandoned shape and is proposed as such, never as completion:122 `complete_action(status: "abandoned")` for an action (never archive an123 action's root memory to abandon it — that hides the whole root);124 `archive_memory(complete: false)` for an intent or project. An125 intent-only audit is the failure mode this step exists to prevent:126 shipped actions left open, projects never examined.1273. **Resolve next-step linkage.** For each slot-7 item: link an existing128 intent or open action if one matches — never one on the closure129 candidate list; an item that still has a next step is not done. If none130 exists, propose a new131 **ACTION** (`remember(type: "action", ...)`) — a concrete piece of work to132 do. Propose a new **intent** ONLY for a measurable outcome to achieve or133 maintain (intents are goals, not to-dos; actions are the to-dos that serve134 them). Transient items (one-off cleanup, naming fixes) get an inline135 `[transient]` annotation instead of a memory.1364. **Confirm before memory mutations.** Show the user the proposed new137 action/intent list (title + one-line description each) and the closure138 candidate list (type, the call that will run, and the one-line witness139 each — the completion event, or, for an abandonment, the user's words140 that retired it; a parent with open children lists each child with its141 complete / drop / leave-open choice), then wait for explicit go-ahead;142 the user may pick a subset.143 If both lists are empty, no additional confirmation is needed. Frame this144 as confirmation only for the named changes, not for the wrap-up. Never145 create, complete, or archive memories without confirmation; invocation146 already authorized the wrap-up memory itself.1475. **Create the confirmed follow-ons** — `remember(type: "action", ...)` for148 work items, `remember(type: "intent", ...)` for measurable outcomes —149 capturing their IDs for slot 7.1506. **Close the confirmed work**, one call each, BEFORE writing the wrap-up151 so slot 4 records only what actually landed: `complete_action(id:,152 closed: true)` for an action (the action id from `list_actions` /153 `open_actions`, not the memory id) — pass `closed` explicitly: with154 neither `closed` nor `status` the call TOGGLES the current state and155 would reopen an action already closed elsewhere; `archive_memory(id:,156 complete: true)` for an intent or project — pass `complete` explicitly,157 never lean on the archive default to carry a completion claim;158 `complete_action(id:, status: "abandoned")` for a confirmed abandoned159 action and `archive_memory(id:, complete: false)` for a confirmed160 abandoned intent or project. Capture each result: build slot 4 only from161 successful receipts; a call that errors or times out is re-checked162 against current state before it is reported or retried — closed on163 re-check counts as a receipt, still open is reported open. Neither tool164 has a free-text reason field, so the close-out's traceability lives in165 slot 4 ("What closed") of the body below — it names each closed item,166 its type, its verb, and the witness that justified it; the wrap-up memory167 is itself the durable record of the close.1687. **Write the wrap-up memory** via `remember`: pass `type: "observation"` and169 `metadata: { kind: "wrap-up", scope: <the session's primary scope, a git170 branch or project name, if any> }`. (`remember` has no top-level `scope`171 argument; scope travels inside `metadata`.) Cite evidence inline (the172 artifact reference — a commit SHA / PR URL for code, or the published /173 signed / delivered artifact otherwise; a memory ID) and use the174 `[anchor](vertiso-memory://memories/{id})` link format for every vmem175 cross-reference so the graph picks them up.1768. **Report** using the format below. Every actionable item must reach the177 user with its action/intent link or its transient rationale.178179## The body180181Checkpoint's gather (step 1) fills the **Decisions + WHYs** slot and informs182Worked-on / Stable state. The rest are wrap-up's own terminal slots — What183shipped, What closed, Next steps — built on that context, not replaced by it.1841851. **Worked on** — what this session was about, in a sentence or two.1862. **Decisions + WHYs (attributed verbatim)** — the session's decisions with187 the exact words that drove them, attributed to who spoke (the user's framing188 plus any agent turn that carried the context/insight), per checkpoint's189 verbatim discipline. Do NOT summarize these away — this is the slot a190 wrap-up historically dropped.1913. **What shipped / delivered** — concrete artifacts, each with evidence.192 Software: commit SHAs, PR numbers + URLs, migrations run, deploys, memories193 written. Otherwise the delivered artifact itself is the evidence: a194 published deck, a signed contract, a released CAD revision, a sent195 proposal, a delivered mockup. No citation (or artifact reference), no196 entry.1974. **What closed** — actions completed, intents / projects archived, and198 items abandoned in this wrap-up, each with its type, its verb, and the199 witness that justifies it. A completion carries the witnessed event (a PR200 merged, a deliverable accepted, a decision ratified, a milestone hit —201 e.g. "complete action #4960 — PR #147 merged"; "archive intent #4954 —202 AiCall + CostRate live in production, full scope shipped"); an203 abandonment carries the user's words that retired it, never a completion204 event (e.g. "abandon action #4971 — user: 'we're not doing the CSV205 export'"). One line each. A project listed here as completed means206 nothing in its scope remains open.2075. **Stable state** — the state of the world after this session: what's live /208 final / in-flight, and the equivalent for the domain (deployed and on209 `main`; or published / signed / shipped / still pending), what assumptions210 hold. The context a future agent would otherwise have to reconstruct.2116. **Worth flagging** — non-actionable notes: memories written this session212 (linked), decisions that changed how we work, lessons captured. Not213 follow-ons — those go in slot 7.2147. **Next steps** — actionable follow-ons. Per line:215 `- [action title](vertiso-memory://memories/{id}) — what to do next`. A216 transient item not worth a memory gets a `[transient]` prefix and a reason217 instead of a link.218219## Report format220221```222## Wrap-up223224- **Wrap-up memory**: vmem #{id}225- **Actions completed**: {count} — {#id (title), …, or "none"}226- **Intents archived**: {count} — {#id (title), …, or "none"}227- **Projects archived**: {count} — {#id (title), …, or "none"}228- **Abandoned**: {count} — {type #id (title), …, or "none"}229- **Left open**: {count} — {type #id (title) — declined | close failed: <error>, or "none"}230- **Actions created**: {count} — {#id (title), …, or "none"}231- **Intents created**: {count} — {#id (title), …, or "none"}232233## Next steps ({n})2342351. [title](vertiso-memory://memories/{id}) — {what to do}2362. [transient] {item} — {why no tracked memory}237```238239Every slot-7 item appears here with its action/intent link or its transient240rationale. An item the user declined to track gets a `[deferred — not241tracked]` annotation so the choice stays visible. A closure candidate the242user declined, or whose call failed, appears under **Left open** with its243reason.244245## Authoring honesty246247A wrap-up's value is the closure audit, the follow-on tracking discipline,248and a record future sessions can trust as a primary source. Sloppy or249dishonest authoring poisons all three.250251- "Shipped" needs evidence on the same line — no bare claims.252- "Closed #X" — an action completed, an intent or project archived — needs a253 witnessed event (a PR merge, a user confirmation, an observable proxy), not254 chat narrative; an abandonment needs the user's explicit retirement, never255 an inference from inactivity. A project closed as completed additionally256 needs nothing in its scope still open.257- Say "inferred" or "believed to be" for anything you did not directly observe.258- A slot-7 item with neither an action/intent link nor a `[transient]`259 annotation is a drop risk — never leave one without one of the two.