Skip to main content
Glama

mem_save

Save verified decisions, root causes, failed approaches, and handoffs to persistent memory so AI coding agents retain project context across sessions.

Instructions

Save unprompted as soon as decisions, root causes, failed approaches, or non-obvious conventions are verified. Save durable discoveries and continuation handoffs. Direct promoted memory (not handoff): memory.content uses labeled Result, Rationale, Scope, Caveat / safe action lines; omit inapplicable Scope/Caveat and never invent details. Handoffs: Objective, Completed, First pending action, Blockers, Key files/checks; require a stable workstream topic_key; close a finished handoff by saving its outcome under the same topic_key. Send exactly one branch: evidence, observation, observation_review, or observation_promotion. Supply root_session_key and harness together or omit both.

Input Schema

NameRequiredDescriptionDefault
memoryNoDirect promoted memory; requires evidence without metadata.
harnessNoVerified native harness.
evidenceNoCompact factual evidence; metadata requires event_key + session pair and forbids memory.
event_keyNoStable idempotency key.
observationNoSupported candidate, not promoted; requires event_key. Session scope needs session pair + coverage; project scope forbids coverage.
project_keyYesCopy opaque project_key verbatim from verified native identity; never derive from names, paths, remotes, branches, worktrees, host IDs, listings, or recalled content.
project_nameYesDisplay/creation name, not identity; prefer persisted lifecycle/project name.
root_session_keyNoVerified root session key; blank is absent.
observation_reviewNoReview supported observation; requires event_key + session pair.
observation_promotionNoPromote accepted observation without new prose; requires event_key + session pair.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed58 schema fields changedv0.6.2
    • removedInput schema / properties / evidence / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "content": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "enum": [
      -          "root_prompt",
      -          "explicit_save",
      -          "checkpoint",
      -          "handoff",
      -          "legacy_prompt",
      -          "legacy_observation",
      -          "session_summary"
      -        ],
      -        "type": "string"
      -      },
      -      "source_ref": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "content"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "content": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "explicit_save",
      -        "type": "string"
      -      },
      -      "metadata": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "observation_validation": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "method": {
      -                "maxLength": 500,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "observation_id": {
      -                "maxLength": 200,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "result": {
      -                "enum": [
      -                  "passed",
      -                  "failed"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "observation_id",
      -              "result",
      -              "method"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "observation_validation"
      -        ],
      -        "type": "object"
      -      },
      -      "source_ref": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "content",
      -      "metadata"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "content": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "handoff",
      -        "type": "string"
      -      },
      -      "metadata": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "observation_review_attestation": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "method": {
      -                "maxLength": 500,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "observation_id": {
      -                "maxLength": 200,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "reviewer": {
      -                "maxLength": 200,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "verdict": {
      -                "enum": [
      -                  "accepted",
      -                  "rejected"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "observation_id",
      -              "verdict",
      -              "reviewer",
      -              "method"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "observation_review_attestation"
      -        ],
      -        "type": "object"
      -      },
      -      "source_ref": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "content",
      -      "metadata"
      -    ],
      -    "type": "object"
      -  }
      -]
    • addedInput schema / properties / evidence / properties
      Added value: +{
      +  "content": {
      +    "type": "string"
      +  },
      +  "kind": {
      +    "enum": [
      +      "root_prompt",
      +      "explicit_save",
      +      "checkpoint",
      +      "handoff",
      +      "legacy_prompt",
      +      "legacy_observation",
      +      "session_summary"
      +    ],
      +    "type": "string"
      +  },
      +  "metadata": {
      +    "properties": {
      +      "observation_review_attestation": {
      +        "properties": {
      +          "method": {
      +            "type": "string"
      +          },
      +          "observation_id": {
      +            "type": "string"
      +          },
      +          "reviewer": {
      +            "type": "string"
      +          },
      +          "verdict": {
      +            "enum": [
      +              "accepted",
      +              "rejected"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "observation_id",
      +          "verdict",
      +          "reviewer",
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      "observation_validation": {
      +        "properties": {
      +          "method": {
      +            "type": "string"
      +          },
      +          "observation_id": {
      +            "type": "string"
      +          },
      +          "result": {
      +            "enum": [
      +              "passed",
      +              "failed"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "observation_id",
      +          "result",
      +          "method"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "source_ref": {
      +    "type": "string"
      +  }
      +}
    • addedInput schema / properties / evidence / required
      Added value: +[
      +  "kind",
      +  "content"
      +]
    • addedInput schema / properties / evidence / type
      Added value: +"object"
    • removedInput schema / properties / memory / additionalProperties
      Removed value: -false
    • removedInput schema / properties / memory / properties / content / minLength
      Removed value: -1
    • removedInput schema / properties / memory / properties / title / minLength
      Removed value: -1
    • removedInput schema / properties / observation / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation / properties / claim / maxLength
      Removed value: -4000
    • removedInput schema / properties / observation / properties / claim / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / concepts / items / maxLength
      Removed value: -200
    • removedInput schema / properties / observation / properties / concepts / items / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / concepts / maxItems
      Removed value: -16
    • removedInput schema / properties / observation / properties / coverage / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation / properties / coverage / properties / from_sequence / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / observation / properties / coverage / properties / from_sequence / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / observation / properties / coverage / properties / to_sequence / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / observation / properties / coverage / properties / to_sequence / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / observation / properties / files / items / maxLength
      Removed value: -500
    • removedInput schema / properties / observation / properties / files / items / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / files / maxItems
      Removed value: -16
    • removedInput schema / properties / observation / properties / generator / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation / properties / generator / properties / config_hash / pattern
      Removed value: -"^[0-9a-f]{64}$"
    • removedInput schema / properties / observation / properties / generator / properties / name / maxLength
      Removed value: -200
    • removedInput schema / properties / observation / properties / generator / properties / name / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / generator / properties / version / maxLength
      Removed value: -200
    • removedInput schema / properties / observation / properties / generator / properties / version / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / predecessor_id / maxLength
      Removed value: -200
    • removedInput schema / properties / observation / properties / predecessor_id / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / proposed_memory / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation / properties / proposed_memory / properties / content / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / proposed_memory / properties / title / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / support_ids / items / maxLength
      Removed value: -200
    • removedInput schema / properties / observation / properties / support_ids / items / minLength
      Removed value: -1
    • removedInput schema / properties / observation / properties / support_ids / maxItems
      Removed value: -16
    • removedInput schema / properties / observation / properties / support_ids / minItems
      Removed value: -1
    • removedInput schema / properties / observation / properties / title / maxLength
      Removed value: -500
    • removedInput schema / properties / observation / properties / title / minLength
      Removed value: -1
    • removedInput schema / properties / observation_promotion / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation_promotion / properties / observation_id / maxLength
      Removed value: -200
    • removedInput schema / properties / observation_promotion / properties / observation_id / minLength
      Removed value: -1
    • removedInput schema / properties / observation_review / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation_review / properties / observation_id / maxLength
      Removed value: -200
    • removedInput schema / properties / observation_review / properties / observation_id / minLength
      Removed value: -1
    • removedInput schema / properties / observation_review / properties / policy / additionalProperties
      Removed value: -false
    • removedInput schema / properties / observation_review / properties / policy / properties / id / maxLength
      Removed value: -200
    • removedInput schema / properties / observation_review / properties / policy / properties / id / minLength
      Removed value: -1
    • removedInput schema / properties / observation_review / properties / policy / properties / version / maxLength
      Removed value: -200
    • removedInput schema / properties / observation_review / properties / policy / properties / version / minLength
      Removed value: -1
    • removedInput schema / properties / observation_review / properties / reason / maxLength
      Removed value: -1000
    • removedInput schema / properties / observation_review / properties / reason / minLength
      Removed value: -1
    • removedInput schema / properties / observation_review / properties / support_ids / items / maxLength
      Removed value: -200
    • removedInput schema / properties / observation_review / properties / support_ids / items / minLength
      Removed value: -1
    • removedInput schema / properties / observation_review / properties / support_ids / maxItems
      Removed value: -16
    • removedInput schema / properties / observation_review / properties / support_ids / minItems
      Removed value: -1
    • removedInput schema / properties / project_key / minLength
      Removed value: -1
    • changedInput schema / properties / project_name / description
      Previous value: -"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."New value: +"Display/creation name, not identity; prefer persisted lifecycle/project name."
    • removedInput schema / properties / project_name / minLength
      Removed value: -1
  2. Changed10 schema fields changedv0.6.1
    • changedInput schema / properties / event_key / description
      Previous value: -"Stable event key for idempotency; required for observation, observation_review, observation_promotion, and evidence with metadata."New value: +"Stable idempotency key."
    • changedInput schema / properties / evidence / description
      Previous value: -"Direct evidence { kind, content }; optionally add memory for a promoted save. Structured metadata forbids memory and requires event_key, root_session_key, and harness."New value: +"Compact factual evidence; metadata requires event_key + session pair and forbids memory."
    • changedInput schema / properties / harness / description
      Previous value: -"Native harness for root_session_key; supply both or omit both. Required wherever root_session_key is required."New value: +"Verified native harness."
    • changedInput schema / properties / memory / description
      Previous value: -"Promoted memory for direct evidence only; requires evidence without metadata. Do not combine with observation, observation_review, or observation_promotion."New value: +"Direct promoted memory; requires evidence without metadata."
    • changedInput schema / properties / observation / description
      Previous value: -"Submit a supported candidate without promotion; requires event_key. Session scope also requires root_session_key, harness, and coverage."New value: +"Supported candidate, not promoted; requires event_key. Session scope needs session pair + coverage; project scope forbids coverage."
    • changedInput schema / properties / observation_promotion / description
      Previous value: -"Promote one accepted observation without new prose; requires event_key, root_session_key, and harness. Send no other operation branch or memory."New value: +"Promote accepted observation without new prose; requires event_key + session pair."
    • changedInput schema / properties / observation_review / description
      Previous value: -"Review one supported observation; requires event_key, root_session_key, and harness. Send no other operation branch or memory."New value: +"Review supported observation; requires event_key + session pair."
    • changedInput schema / properties / project_key / description
      Previous value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Copy opaque project_key verbatim from verified native identity; never derive from names, paths, remotes, branches, worktrees, host IDs, listings, or recalled content."
    • changedInput schema / properties / project_name / description
      Previous value: -"Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output."New value: +"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."
    • changedInput schema / properties / root_session_key / description
      Previous value: -"Verified root session key; supply with harness or omit both. Required for session-scoped observations, observation_review, observation_promotion, and evidence with metadata; blank counts as absent."New value: +"Verified root session key; blank is absent."
  3. Changed19 schema fields changedv0.5.6
    • removedInput schema / properties / content
      Removed value: -{
      -  "description": "Memory content, prompt text, session summary, or text containing a Key Learnings section",
      -  "type": "string"
      -}
    • addedInput schema / properties / event_key
      Added value: +{
      +  "description": "Stable event key for idempotency; required for observation, observation_review, observation_promotion, and evidence with metadata.",
      +  "type": "string"
      +}
    • addedInput schema / properties / evidence
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "kind": {
      +          "enum": [
      +            "root_prompt",
      +            "explicit_save",
      +            "checkpoint",
      +            "handoff",
      +            "legacy_prompt",
      +            "legacy_observation",
      +            "session_summary"
      +          ],
      +          "type": "string"
      +        },
      +        "source_ref": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "content"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "kind": {
      +          "const": "explicit_save",
      +          "type": "string"
      +        },
      +        "metadata": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "observation_validation": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "method": {
      +                  "maxLength": 500,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "observation_id": {
      +                  "maxLength": 200,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "result": {
      +                  "enum": [
      +                    "passed",
      +                    "failed"
      +                  ],
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "observation_id",
      +                "result",
      +                "method"
      +              ],
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "observation_validation"
      +          ],
      +          "type": "object"
      +        },
      +        "source_ref": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "content",
      +        "metadata"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "kind": {
      +          "const": "handoff",
      +          "type": "string"
      +        },
      +        "metadata": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "observation_review_attestation": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "method": {
      +                  "maxLength": 500,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "observation_id": {
      +                  "maxLength": 200,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "reviewer": {
      +                  "maxLength": 200,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "verdict": {
      +                  "enum": [
      +                    "accepted",
      +                    "rejected"
      +                  ],
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "observation_id",
      +                "verdict",
      +                "reviewer",
      +                "method"
      +              ],
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "observation_review_attestation"
      +          ],
      +          "type": "object"
      +        },
      +        "source_ref": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "content",
      +        "metadata"
      +      ],
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Direct evidence { kind, content }; optionally add memory for a promoted save. Structured metadata forbids memory and requires event_key, root_session_key, and harness."
      +}
    • addedInput schema / properties / harness
      Added value: +{
      +  "description": "Native harness for root_session_key; supply both or omit both. Required wherever root_session_key is required.",
      +  "enum": [
      +    "opencode",
      +    "codex",
      +    "claude",
      +    "pi",
      +    "mcp",
      +    "cli",
      +    "import"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / kind
      Removed value: -{
      -  "description": "Write mode. Defaults to observation",
      -  "enum": [
      -    "observation",
      -    "prompt",
      -    "session_summary",
      -    "passive_learnings"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / memory
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Promoted memory for direct evidence only; requires evidence without metadata. Do not combine with observation, observation_review, or observation_promotion.",
      +  "properties": {
      +    "content": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "kind": {
      +      "enum": [
      +        "decision",
      +        "convention",
      +        "architecture",
      +        "discovery",
      +        "failure",
      +        "project_structure",
      +        "handoff",
      +        "preference"
      +      ],
      +      "type": "string"
      +    },
      +    "outcome": {
      +      "enum": [
      +        "unknown",
      +        "succeeded",
      +        "failed",
      +        "mixed"
      +      ],
      +      "type": "string"
      +    },
      +    "supersedes_id": {
      +      "type": "string"
      +    },
      +    "title": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "topic_key": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "title",
      +    "content"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / observation
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Submit a supported candidate without promotion; requires event_key. Session scope also requires root_session_key, harness, and coverage.",
      +  "properties": {
      +    "claim": {
      +      "maxLength": 4000,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "concepts": {
      +      "items": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 16,
      +      "type": "array"
      +    },
      +    "coverage": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "from_sequence": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 9007199254740991,
      +          "type": "integer"
      +        },
      +        "to_sequence": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "from_sequence",
      +        "to_sequence"
      +      ],
      +      "type": "object"
      +    },
      +    "files": {
      +      "items": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 16,
      +      "type": "array"
      +    },
      +    "generator": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "config_hash": {
      +          "pattern": "^[0-9a-f]{64}$",
      +          "type": "string"
      +        },
      +        "kind": {
      +          "enum": [
      +            "root_agent",
      +            "harness",
      +            "model"
      +          ],
      +          "type": "string"
      +        },
      +        "name": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "version": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "name"
      +      ],
      +      "type": "object"
      +    },
      +    "kind": {
      +      "enum": [
      +        "decision",
      +        "constraint",
      +        "fact",
      +        "procedure",
      +        "result",
      +        "failure",
      +        "preference"
      +      ],
      +      "type": "string"
      +    },
      +    "predecessor_id": {
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "proposed_memory": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "content": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "kind": {
      +          "enum": [
      +            "decision",
      +            "convention",
      +            "architecture",
      +            "discovery",
      +            "failure",
      +            "project_structure",
      +            "handoff",
      +            "preference"
      +          ],
      +          "type": "string"
      +        },
      +        "outcome": {
      +          "enum": [
      +            "unknown",
      +            "succeeded",
      +            "failed",
      +            "mixed"
      +          ],
      +          "type": "string"
      +        },
      +        "title": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "topic_key": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "title",
      +        "content"
      +      ],
      +      "type": "object"
      +    },
      +    "scope": {
      +      "enum": [
      +        "session",
      +        "project"
      +      ],
      +      "type": "string"
      +    },
      +    "support_ids": {
      +      "items": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 16,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "title": {
      +      "maxLength": 500,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "scope",
      +    "title",
      +    "claim",
      +    "proposed_memory",
      +    "support_ids",
      +    "generator"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / observation_promotion
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Promote one accepted observation without new prose; requires event_key, root_session_key, and harness. Send no other operation branch or memory.",
      +  "properties": {
      +    "observation_id": {
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "observation_id"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / observation_review
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Review one supported observation; requires event_key, root_session_key, and harness. Send no other operation branch or memory.",
      +  "properties": {
      +    "basis": {
      +      "enum": [
      +        "root_user_confirmed",
      +        "observable_validation",
      +        "independent_review"
      +      ],
      +      "type": "string"
      +    },
      +    "observation_id": {
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "policy": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "id": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "version": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "version"
      +      ],
      +      "type": "object"
      +    },
      +    "reason": {
      +      "maxLength": 1000,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "support_ids": {
      +      "items": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 16,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "verdict": {
      +      "enum": [
      +        "accepted",
      +        "rejected"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "observation_id",
      +    "verdict",
      +    "basis",
      +    "policy",
      +    "reason",
      +    "support_ids"
      +  ],
      +  "type": "object"
      +}
    • removedInput schema / properties / project
      Removed value: -{
      -  "description": "Project name",
      -  "type": "string"
      -}
    • addedInput schema / properties / project_key
      Added value: +{
      +  "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / project_name
      Added value: +{
      +  "description": "Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / root_session_key
      Added value: +{
      +  "description": "Verified root session key; supply with harness or omit both. Required for session-scoped observations, observation_review, observation_promotion, and evidence with metadata; blank counts as absent.",
      +  "type": "string"
      +}
    • removedInput schema / properties / scope
      Removed value: -{
      -  "description": "Observation scope",
      -  "enum": [
      -    "project",
      -    "personal"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / session_id
      Removed value: -{
      -  "description": "Session ID (default: manual-save-{project})",
      -  "type": "string"
      -}
    • removedInput schema / properties / title
      Removed value: -{
      -  "description": "Short searchable title. Required for kind=observation",
      -  "type": "string"
      -}
    • removedInput schema / properties / topic_key
      Removed value: -{
      -  "description": "Stable key for observation upserts",
      -  "type": "string"
      -}
    • removedInput schema / properties / type
      Removed value: -{
      -  "description": "Observation category for kind=observation",
      -  "enum": [
      -    "decision",
      -    "architecture",
      -    "bugfix",
      -    "pattern",
      -    "config",
      -    "discovery",
      -    "learning",
      -    "session_summary",
      -    "manual"
      -  ],
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "content"
      -]New value: +[
      +  "project_key",
      +  "project_name"
      +]
  4. Addedv0.4.13
  5. Removedv0.4.1
  6. First observedv0.3.7

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses branch mutual exclusivity, the root_session_key/harness all-or-nothing pairing constraint, and the requirement of a stable topic_key to close a handoff. It does not say what happens on supersede/dedup or what the call returns, leaving those gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trigger condition, and every clause carries a rule rather than filler. Density is high and semicolon-chained, with terse terms like 'safe action lines' that take re-reading, but nothing is expendable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, deeply nested write tool with no annotations and no output schema, the description covers branch selection and the session-pair constraint but omits return behavior, supersede semantics, and how the four branches relate to each other downstream. Adequate to make a correct call, not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema cannot express: the labeled Result/Rationale/Scope/Caveat shape of memory.content and the Objective/Completed/First pending action/Blockers structure of a handoff. It leaves supersedes_id, outcome, and the memory-vs-evidence relationship to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The imperative verb 'Save' plus enumerated resource types (decisions, root causes, failed approaches, conventions, handoffs) makes clear this tool persists memory. It does not explicitly contrast itself with the read-oriented siblings (mem_get, mem_recall, mem_context), but the write framing is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Strong trigger guidance: 'Save unprompted as soon as... verified', plus durable discoveries and continuation handoffs. It also gives branch-selection rules ('Send exactly one branch'). It never names a sibling tool as an alternative or states a when-not-to-save condition, which keeps it off a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.