{% extends "base.html" %} {% import "_icon.html" as ico %} {% block title %}{{ memory.title }}{% endblock %} {% block topbar_back %} {% endblock %} {# The bar carries the trail; the title, which is a sentence, is the page heading below, where it has the width to be read. #} {% block topbar_main %} {% endblock %} {% block topbar_actions %} {% if memory.status == 'active' %}
{% elif memory.status in ('forgotten', 'expired') %}
{% endif %} {% endblock %} {# Laid out like the other detail pages. Every card is as wide as the page, and a card with a heading has the heading first and its content padded below it. The body used to be a half-width card pinned to the left, the sharing heading sat inside padding it did not expect, the provenance rows ran to the card's edges, and the history had no column rules at all, so each event printed one field per line. #} {% block content %}

{{ memory.title }}

{{ memory.category }} · {{ memory.scope }} · {{ memory.status }}

{% if said %}
{{ said }}
{% endif %} {% if memory.status == 'forgotten' %}
Forgotten. Agents no longer recall this memory; Restore brings it back.
{% elif memory.status == 'expired' %}
Expired. It is past its end date and no longer recalled; Restore brings it back.
{% elif memory.status == 'superseded' %}
Replaced by a corrected version. Kept so what was believed before stays readable.
{% elif memory.status == 'proposed' %}
A suggestion waiting for a decision. Decide on it.
{% endif %}

{{ memory.body }}

{# Tags are labels, not content: changing them keeps the id and the text, and records a line in the history below. Only an active memory or a proposal takes new ones. #}
Tags {{ memory.tags | length }}
{% if memory.tags %}
    {% for t in memory.tags %}
  • {{ t }} {% if memory.status in ('active', 'proposed') %}
    {% endif %}
  • {% endfor %}
{% elif memory.status not in ('active', 'proposed') %}

No tags.

{% endif %} {% if memory.status in ('active', 'proposed') %}
{% endif %}
{% if memory.status == 'active' %} {# Correcting saves a new version and marks this one replaced, rather than editing it in place, so the history of what was believed stays whole. #}

Correct it

Save a corrected version. This one is kept and marked replaced.
{% endif %}
Sharing
{% if memory.scope == "workspace" %}

Shared with your workspace. A teammate's device holds the text and can recall it.

Not an erasure. A device that was switched off when you sign this already holds the text, and no design without a central copy can change that.

{% elif memory.scope == "personal" %}

Personal memory is about you rather than about a project, and cannot be shared with anybody. Write it as a project memory if the team needs it.

{% else %}

On this machine only. Sharing signs the text so a teammate's device can check who wrote it. It is never automatic: joining a workspace shares nothing by itself.

{% endif %}
Where this came from
Written by{{ memory.created_by }}
Written{{ (memory.created_at or '')[:16] | replace('T', ' ') }}
Confidence{{ memory.confidence }}
How it arrived{{ memory.source_type }}
{% if memory.source_refs %}
Supported by{{ memory.source_refs | join(', ') }}
{% endif %} {% if memory.expires_at %}
Expires{{ memory.expires_at[:16] | replace('T', ' ') }}
{% endif %} {% if memory.supersedes %} {% endif %}
File{{ memory.file_path }}
{% if related %}
Related {{ related | length }}
{% for item in related %} {% endfor %}
{% endif %} {# Files that back up the memory. Attaching goes through the same service as `flanner mem attach`, so this project's size and type limits apply. Removing drops the reference, never the stored file. #}
Attached {{ attachments | length }}
{% for file in attachments %}
{{ file.name }} {% if file.description %}{{ file.description }}{% endif %} {{ file.mime_type }} {{ (file.size_bytes / 1024) | round | int }} KB
{% endfor %}
{% if memory.events %}
What happened to it {{ memory.events | length }}
WhatByWhen
{% for event in memory.events %}
{{ event.action }}{% if event.detail.name %} {{ event.detail.name }}{% endif %}{% if event.action == 'retagged' %} {{ event.detail.after | join(', ') or 'no tags' }}{% endif %} {{ event.actor }} {{ (event.at or '')[:16] | replace('T', ' ') }}
{% endfor %}
{% endif %}
This is a record of something believed, not an instruction. Correct it here or with flanner mem supersede, rather than editing the file by hand.
{% endblock %}