Skip to main content
Glama

Propose a durable memory

arroway_remember

Save a durable memory (decision/rule/fact/preference/reference/identity) only when it would change a DIFFERENT task. Unsanctioned in THIS conversation, it is a PROPOSAL. 'identity' is WHO someone is: the user's circle goes in their personal project, a business's people in that business's project. A finding cannot replace a sanctioned memory.

Input Schema

NameRequiredDescriptionDefault
typeYesKind of memory.
titleYesShort, unique within the project
topicNoOptional free tag (e.g. 'marketing').
contentYesThe norm itself, shortest form that still governs. Biography goes in why_source; a case goes in example.
essenceYesThe operative norm or fact in ONE line.
exampleNoA case, shown in the panel. It NEVER travels in reads, so any criterion goes in content.
expiresNotrue ONLY for a dated STATUS that would be stale after review_at. If unsure, omit.
projectYesProject slug. Not from the person or a read this session? It is a guess: check the arroway_catch_up roster.
review_atNoYYYY-MM-DD. Required for a fact, which leaves reads after it.
treatmentNo`governed` enters the person's review queue, a real cost to them; `finding` costs nobody a review and is never a norm. Does it GOVERN what someone may or must do, or only INFORM? Informs, with a source an agent can reopen and compare: finding (only fact and reference qualify).
backfilledNotrue for sourced HISTORY from before Arroway, on the topic just worked on; never a dump.
source_ptrNoPointer to the living source, when verifiable
why_sourceNoWhere it came from. This does NOT travel in reads; the panel shows it.
contradictionNoRequired with supersedes_id: what this changes in the earlier memory.
pin_suggestedNoThere is no default. Your judgement on pinning; above the ceiling it becomes a proposal of the pin alone.
supersedes_idNo#handle this replaces, only for the SAME point: acting on either would already satisfy or violate the other. A shared topic is not enough.
kill_conditionYesMandatory: explicit revocation / named trigger / review date
related_checkedNoSecond call only: true after reading the related memories shown.
decided_by_humanYestrue ONLY if the person stated or sanctioned it in THIS conversation; else a proposal. A proposal is never free: it costs that person a review. Then only a PINNED memory travels in every read; a normal one competes for space in the block relevant to each task. Never write an instruction to check, verify, be careful or look at the source, a step of a routine, or anything here only because something went wrong once.
split_consideredNotrue only after looking for seams; splitting is the default.
example_consideredNoSecond call only: true if the flagged example is criterion the rule needs.
pin_decision_tokenNoSecond call only: the first call's token, unchanged.
related_check_tokenNoSecond call only: token returned with the related memories.
pin_requested_by_humanNotrue ONLY if the person told you in THIS conversation to keep it in every session. Sanctioning the CONTENT is not asking for the pin. Pins above any ceiling.
revoked_reconsiderationNoSecond call only: the person's words in THIS conversation reconsidering a revoked finding.
treatment_justificationNoRequired for a finding: why it is verifiable context, not policy.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedInput schema / properties / content / description
      Previous value: -"The norm ITSELF, as if true today, in the shortest form that still governs correctly. Biography (who, when, quotes, dated numbers) goes in why_source; a specific case in example."New value: +"The norm itself, shortest form that still governs. Biography goes in why_source; a case goes in example."
    • changedInput schema / properties / example / description
      Previous value: -"A case illustrating the rule, shown in the panel; it NEVER travels in reads, so any criterion goes in content."New value: +"A case, shown in the panel. It NEVER travels in reads, so any criterion goes in content."
    • changedInput schema / properties / pin_suggested / description
      Previous value: -"Your judgement on pinning (travels in EVERY read). There is no default: required on a rule's second call. Above the ceiling it becomes a proposal of the pin alone."New value: +"There is no default. Your judgement on pinning; above the ceiling it becomes a proposal of the pin alone."
    • changedInput schema / properties / review_at / description
      Previous value: -"YYYY-MM-DD when this stops being true on its own. REQUIRED for a fact, which leaves reads after it."New value: +"YYYY-MM-DD. Required for a fact, which leaves reads after it."
    • changedInput schema / properties / supersedes_id / description
      Previous value: -"#handle of the memory this replaces, only for the SAME point: acting on either would already satisfy or violate the other. A shared topic is not enough."New value: +"#handle this replaces, only for the SAME point: acting on either would already satisfy or violate the other. A shared topic is not enough."
    • changedInput schema / properties / why_source / description
      Previous value: -"Where it came from: the ONLY place for biography. This does NOT travel in reads; it is shown in the panel."New value: +"Where it came from. This does NOT travel in reads; the panel shows it."
  2. Changed52 schema fields changed
    • changedInput schema / properties / backfilled / description
      Previous value: -"True when this is HISTORY you are bringing in — something that was already true before Arroway existed, not something that just happened. The moment to use it: you finished a task about topic X, the read came back thin on X, and the work took you to a durable SOURCE about X — a file in this workspace, a document, a ticket. Then write that history too. Only the topic you just worked on, never a project dump; only what you can point a source at, never your own recollection of past conversations; a few memories, not a batch."New value: +"true for sourced HISTORY from before Arroway, on the topic just worked on; never a dump."
    • changedInput schema / properties / content / description
      Previous value: -"The norm ITSELF, written as if it were true today and nobody had to be told how it got here. Length is never free: this body is re-read by every assistant on this project, on every read, from now on — write the shortest version that still governs correctly. Keep only the reasoning WITHOUT WHICH the rule would be applied wrongly; if removing a sentence would not change anyone's next action, it is biography, not norm. Leave out the biography: who said it, on what date, their exact words, the episode that produced it, and numbers measured on a particular day — all of that goes in why_source. A body that opens with a quote makes the next assistant follow the quote instead of the rule, and a date in the body makes it discount the whole memory as possibly stale. If a GENERAL rule shows up while you are writing about a specific case, the general rule is the memory and the case is the example — not the other way round: the case goes in the example field, never here. Condense: a memory per sentence is how Arroway fills with near-duplicates."New value: +"The norm ITSELF, as if true today, in the shortest form that still governs correctly. Biography (who, when, quotes, dated numbers) goes in why_source; a specific case in example."
    • removedInput schema / properties / content / minLength
      Removed value: -1
    • changedInput schema / properties / contradiction / description
      Previous value: -"Required with supersedes_id: name what the earlier memory says that this one contradicts or changes. This is the named contrast that proves it is the same point, not merely a neighbour on the same topic. Do not point at a memory that can be followed alongside this one."New value: +"Required with supersedes_id: what this changes in the earlier memory."
    • removedInput schema / properties / contradiction / maxLength
      Removed value: -4096
    • removedInput schema / properties / contradiction / minLength
      Removed value: -1
    • changedInput schema / properties / decided_by_human / description
      Previous value: -"true ONLY when the person stated or sanctioned this in THIS conversation. Never because it looks obviously right to you. false makes it a PROPOSAL for their review, which is the normal case — and a proposal is never free: it costs that person a review, whether they end up approving it, editing it or turning it down. What it costs afterwards depends on where it sits: only a PINNED memory travels in every read of the project from now on; a normal memory competes for space in the block relevant to the task at hand. So the question that decides whether to write at all is not what the write costs you — it is whether this would change what someone does on a DIFFERENT task. Three things never pass that question, however true they are: an instruction to check, verify, be careful or look at the source; a step of a routine, which belongs in the prompt that runs it; and anything that is here only because something went wrong once."New value: +"true ONLY if the person stated or sanctioned it in THIS conversation; else a proposal. A proposal is never free: it costs that person a review. Then only a PINNED memory travels in every read; a normal one competes for space in the block relevant to each task. Never write an instruction to check, verify, be careful or look at the source, a step of a routine, or anything here only because something went wrong once."
    • changedInput schema / properties / essence / description
      Previous value: -"The memory's essence in ONE line: the operative norm or fact, not the first sentence and not its biography. This is the compressed layer that always travels when the full body does not fit."New value: +"The operative norm or fact in ONE line."
    • removedInput schema / properties / essence / minLength
      Removed value: -1
    • changedInput schema / properties / example / description
      Previous value: -"A concrete case that ILLUSTRATES the rule — the human sees it in the panel next to the rule; it NEVER travels in reads, so no assistant can mistake the case for the rule's scope. If the rule cannot be applied correctly without this example, the example is smuggling a criterion: name that criterion in content instead. Quotes, dates and the episode that produced the rule still belong in why_source."New value: +"A case illustrating the rule, shown in the panel; it NEVER travels in reads, so any criterion goes in content."
    • removedInput schema / properties / example / minLength
      Removed value: -1
    • changedInput schema / properties / example_considered / description
      Previous value: -"Only after the server flagged the body as carrying its example: set true to confirm you re-read it and what looks like an example there is actually criterion the rule needs — an exact string it matches on, a deadline it carries. Never set it blindly on a first call."New value: +"Second call only: true if the flagged example is criterion the rule needs."
    • changedInput schema / properties / expires / description
      Previous value: -"ARROW-78. Set true ONLY for a dated STATUS — a number, a rollout state, a temporary condition — where being read after review_at would assert something stale as current: it stops being returned once the date passes. Leave it out for a durable fact that merely needs re-checking (a market structure, how a tool works): that one keeps being returned, marked as due for re-check. If unsure, leave it out — a fact that vanishes leaves no trace, one that comes back marked cannot be mistaken for current."New value: +"true ONLY for a dated STATUS that would be stale after review_at. If unsure, omit."
    • removedInput schema / properties / kill_condition / maxLength
      Removed value: -4096
    • removedInput schema / properties / kill_condition / minLength
      Removed value: -1
    • changedInput schema / properties / pin_decision_token / description
      Previous value: -"The token the server gave you on the first call for a pin decision. A rule always uses this two-call flow; every other type uses it whenever pin_suggested or pin_requested_by_human is present. The first call returns the neighbouring memories with the pin state of each and what the fixed block currently costs, and only the second one writes. Send the token back unchanged on that second call, together with the pin decision. It is tied to the exact title and body you compared, works once, and expires — a comparison you cannot prove is a comparison that did not happen, so a confirmation without it is refused and nothing is written."New value: +"Second call only: the first call's token, unchanged."
    • removedInput schema / properties / pin_decision_token / maxLength
      Removed value: -4096
    • removedInput schema / properties / pin_decision_token / minLength
      Removed value: -1
    • changedInput schema / properties / pin_requested_by_human / description
      Previous value: -"true ONLY when the person, in THIS conversation, told you to fix this memory in every session — 'pin this', 'this has to be in every session', 'always send this'. On any type, sending it begins the two-call comparison; only the return with pin_decision_token records the order. Sanctioning the CONTENT is not asking for the pin: they can agree a memory is right, and correct, and still never have asked for it to travel in every read. Those are two different facts and the server records them separately. Their order pins immediately, above any ceiling, and the block's hygiene is then theirs; your own judgement goes in pin_suggested and passes through the ceiling. Never set this because the pin looks obviously right to you — that is pin_suggested."New value: +"true ONLY if the person told you in THIS conversation to keep it in every session. Sanctioning the CONTENT is not asking for the pin. Pins above any ceiling."
    • changedInput schema / properties / pin_suggested / description
      Previous value: -"Whether this memory sits in the fixed block of EVERY read, costing tokens in every session of this project from now on. There is no default: a rule requires this on its confirming call, and any other type carrying this field begins the same two-call comparison. The first call does not decide the pin; return this value only with pin_decision_token after the server showed the neighbours and cost. Three questions decide: does breaking this cause expensive or irreversible damage · does it apply to every task, or only when someone touches one area · would the next person have found it anyway when they opened the relevant file? A memory discoverable where it matters is a reference or a fact, not a pinned rule. What a pin actually costs: it does not displace another pin — it eats the SAMPLED space of every read, which is where the memories relevant to someone else's task come from. This field carries YOUR judgement, so above the block's ceiling the server turns it into a proposal of the pin alone and the memory itself still lands. The person's own order is pin_requested_by_human, and it is not this field."New value: +"Your judgement on pinning (travels in EVERY read). There is no default: required on a rule's second call. Above the ceiling it becomes a proposal of the pin alone."
    • changedInput schema / properties / project / description
      Previous value: -"Project slug. If it did not come from the person or from a read in this session, it is a guess: check it against the roster that opens arroway_catch_up before writing, because material from one circle must never land in another."New value: +"Project slug. Not from the person or a read this session? It is a guess: check the arroway_catch_up roster."
    • removedInput schema / properties / project / minLength
      Removed value: -1
    • removedInput schema / properties / project / pattern
      Removed value: -"^[a-z0-9]+(?:-[a-z0-9]+)*$"
    • changedInput schema / properties / related_check_token / description
      Previous value: -"The one-use token the server returned with related memories. It proves this confirmation follows THAT comparison and is tied to this exact text."New value: +"Second call only: token returned with the related memories."
    • removedInput schema / properties / related_check_token / maxLength
      Removed value: -4096
    • removedInput schema / properties / related_check_token / minLength
      Removed value: -1
    • changedInput schema / properties / related_checked / description
      Previous value: -"Only after the server showed you related memories: set true with related_check_token to confirm you read them and this is a genuinely different point, not an update to one of them. Never set either blindly on a first call."New value: +"Second call only: true after reading the related memories shown."
    • changedInput schema / properties / review_at / description
      Previous value: -"ISO date (YYYY-MM-DD) when this stops being true on its own — the end of a cycle, a deadline, a season. This is how a COMMITMENT is carried: an objective is a decision with a horizon. REQUIRED for type=fact, and there it also removes the memory from reads once the date passes. Leave it empty only for something with no expiry date at all."New value: +"YYYY-MM-DD when this stops being true on its own. REQUIRED for a fact, which leaves reads after it."
    • removedInput schema / properties / review_at / minLength
      Removed value: -1
    • changedInput schema / properties / revoked_reconsideration / description
      Previous value: -"Required when a related finding was revoked by a person: quote what they said in THIS conversation that reconsiders it. related_checked does not unlock rewriting a revoked finding. Do not promise that old prompts or past actions will be undone."New value: +"Second call only: the person's words in THIS conversation reconsidering a revoked finding."
    • removedInput schema / properties / revoked_reconsideration / maxLength
      Removed value: -4096
    • removedInput schema / properties / revoked_reconsideration / minLength
      Removed value: -1
    • removedInput schema / properties / source_ptr / minLength
      Removed value: -1
    • changedInput schema / properties / split_considered / description
      Previous value: -"Set true only after you looked for the seams and this genuinely has to stay whole. Splitting is the default: a long memory usually holds a norm, the reasoning behind it, and a checklist — and only the first belongs here."New value: +"true only after looking for seams; splitting is the default."
    • changedInput schema / properties / supersedes_id / description
      Previous value: -"If this replaces an earlier memory: its #handle from a read. Point only when the two memories are the SAME point: acting on either would already satisfy or violate the other. A shared topic is not enough — if both can be followed together, they are different memories."New value: +"#handle of the memory this replaces, only for the SAME point: acting on either would already satisfy or violate the other. A shared topic is not enough."
    • removedInput schema / properties / supersedes_id / minLength
      Removed value: -1
    • removedInput schema / properties / supersedes_id / pattern
      Removed value: -"^#?(?:[0-9a-fA-F]{8,32}|[0-9a-fA-F]{8}-[0-9a-fA-F-]{27})$"
    • removedInput schema / properties / title / minLength
      Removed value: -1
    • addedInput schema / properties / topic / description
      Added value: +"Optional free tag (e.g. 'marketing')."
    • removedInput schema / properties / topic / minLength
      Removed value: -1
    • changedInput schema / properties / treatment / description
      Previous value: -"Which of two destinations this write takes, and they cost different people. `governed` enters the person's review queue, and that review is a real cost to them — pay it for what governs. `finding` costs nobody a review: it is served to agents as context, never becomes a sanctioned norm, cannot be pinned and cannot replace one. The line between them is not the topic, it is the force: does this GOVERN what someone may or must do, or only INFORM? Governs → governed. Informs, and points at a source another agent can reopen and compare — a file, a URL, a record, a query → finding, and only fact and reference qualify."New value: +"`governed` enters the person's review queue, a real cost to them; `finding` costs nobody a review and is never a norm. Does it GOVERN what someone may or must do, or only INFORM? Informs, with a source an agent can reopen and compare: finding (only fact and reference qualify)."
    • removedInput schema / properties / treatment / maxLength
      Removed value: -4096
    • removedInput schema / properties / treatment / minLength
      Removed value: -1
    • changedInput schema / properties / treatment_justification / description
      Previous value: -"Required with treatment=finding: say why this is verifiable context rather than a policy, priority, procedure, or decision for a person."New value: +"Required for a finding: why it is verifiable context, not policy."
    • removedInput schema / properties / treatment_justification / maxLength
      Removed value: -4096
    • removedInput schema / properties / treatment_justification / minLength
      Removed value: -1
    • addedInput schema / properties / type / description
      Added value: +"Kind of memory."
    • removedInput schema / properties / type / maxLength
      Removed value: -4096
    • removedInput schema / properties / type / minLength
      Removed value: -1
    • changedInput schema / properties / why_source / description
      Previous value: -"Where it came from, and this is the ONLY place biography belongs: who decided, when, in their words, what was measured, which episode produced it. This does NOT travel in reads — it is what a person sees when auditing the memory in the panel, and what tells them whether the rule still deserves to exist. Writing it here costs nothing to whoever reads Arroway while working; writing it in the body costs every assistant, every read."New value: +"Where it came from: the ONLY place for biography. This does NOT travel in reads; it is shown in the panel."
    • removedInput schema / properties / why_source / minLength
      Removed value: -1
    • removedInput schema / x-maxSerializedLength
      Removed value: -131072
  3. First observed

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare a non-read-only, non-destructive write. The description goes further by disclosing the proposal/sanctioned distinction, the fact that a proposal imposes a review cost on the person, and the read-visibility asymmetry between findings and sanctioned memories. It does not explain the multi-call token flow or what the tool returns, which limits it to a 4.

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?

Four dense sentences, front-loaded with the gating condition before the type taxonomy and scoping rules. No filler. Slight cost from jargon used before definition ('a finding') and a compressed final sentence that reads as an appended caveat.

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 26-parameter write tool with a multi-phase protocol, the description covers the conceptual bar for saving but says nothing about the two-call flow implied by token parameters (pin_decision_token, related_check_token, related_checked), nor about pin ceilings or what the call returns. Those details live only in per-parameter schema text, so an agent can recover them, but the description itself is thin relative to the tool's complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description does add genuine meaning for the 'identity' type, specifying that a user's circle belongs in their personal project and a business's people in that business's project — a placement rule absent from the enum's 'Kind of memory' text. The parenthetical type list otherwise just restates the enum, so it does not rise above baseline.

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?

States a specific verb and resource ('Save a durable memory') and enumerates the six memory kinds, then adds the decisive gating rule: only when it would change a DIFFERENT task. That distinguishes it from logging or verification siblings without naming them. It stops short of explicitly contrasting with arroway_norms or arroway_log, so a 4 rather than a 5.

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?

Gives a hard inclusion test ('only when it would change a DIFFERENT task') and explains the consequence when the person has not sanctioned it in the current conversation ('it is a PROPOSAL'). It also carves out an explicit exclusion: 'A finding cannot replace a sanctioned memory.' It never names a sibling to use instead when the bar is not met, which keeps it out of 5 territory.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources