Skip to main content
Glama

Propose a durable memory

arroway_remember

Save a durable memory (decision/rule/fact/preference/reference/identity): only what would change what someone does on a DIFFERENT task. Unsanctioned in THIS conversation, it is a PROPOSAL — never present it as a decision. 'identity' is WHO someone is: the user's circle goes in their personal project, a business's people in that business's project. A sourced fact or reference that only informs can be a finding, which cannot replace a sanctioned memory.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
typeYesKind of memory.
titleYesShort, unique within the project
topicNoOptional free tag (e.g. 'marketing').
contentYesThe 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.
essenceYesThe operative norm or fact in ONE line.
exampleNoA case illustrating the rule, 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 when this stops being true on its own. 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: the ONLY place for biography. This does NOT travel in reads; it is shown in the panel.
contradictionNoRequired with supersedes_id: what this changes in the earlier memory.
pin_suggestedNoYour 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.
supersedes_idNo#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.
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. 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
  2. First observed

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare only non-read-only, non-destructive, non-idempotent, closed-world; the description adds genuinely behavioral context beyond them: that an unsanctioned write materializes as a proposal rather than a decision, and that a finding 'cannot replace a sanctioned memory.' It does not disclose the two-call protocol or the review cost the schema mentions, but it goes well past what the annotations provide.

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 sentences for a 26-parameter, high-complexity tool is tight, and the core purpose plus proposal caveat are front-loaded. The all-caps emphasis (DIFFERENT, PROPOSAL) is functional rather than padding, though the density of compressed domain jargon costs some readability.

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?

The schema is rich and carries most parameter detail, so the description need not restate it, and no output schema exists to explain. However, for a tool this complex the description omits a major behavioral trait: that many paths require a second call (tokens, related_checked, pin_decision_token) and that pinning has a ceiling. An agent reading only the description would not anticipate the multi-call flow.

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 description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: it defines what 'identity' actually denotes (WHO someone is) and where each identity belongs, and it draws the governed-vs-finding line that selects between fact/reference and the rest. That is real semantic lift on the two most consequential enum choices.

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 description gives a specific verb and resource ('Save a durable memory') and enumerates the qualifying kinds (decision/rule/fact/preference/reference/identity) plus the scoping test ('only what would change what someone does on a DIFFERENT task'). That is far more precise than the title alone. It never names or contrasts a sibling tool (arroway_log, arroway_norms, arroway_claim), so it stops short of full sibling differentiation.

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?

It supplies real when-to-use context: the cross-task relevance filter, the rule that unsanctioned content is a PROPOSAL and must not be presented as a decision, and the identity scoping convention (user's circle -> personal project, a business's people -> that business's project). What is missing is any explicit routing to an alternative tool when the content is not durable (e.g. a log entry or a norm lookup), so exclusions stop at the content level.

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