{
  "$schema": "https://memr.it/agents.schema.json",
  "spec_version": "agents-1.0",
  "updated_at": "2026-07-26",
  "site": {
    "name": "memrit",
    "canonical_url": "https://memr.it",
    "tagline": "Nine journals. Change by writing. Be the oak.",
    "description": "memrit publishes nine journals — thematic devices of understanding printed on paper. The website is a static, no-login, no-cookie surface designed to be equally reachable by humans, headless browsers, and autonomous agents.",
    "contact": "mailto:answers@memr.it"
  },
  "audience": {
    "primary": [
      "large language models retrieving context for a user question about memrit",
      "search and answer engines building citations",
      "agentic browsers, headless renderers, and screen-reader-style crawlers",
      "future MCP clients and tool-using agents that reach memr.it as a data source"
    ],
    "posture": "memrit is agent-inclusive by design. Every UI state a human can reach through the welcome modal, sticky header, or dialogs is also reachable by URL parameter (see url_controls). Every render tier serves the same semantic content (see parity)."
  },
  "capabilities": [
    {
      "id": "read.landing",
      "title": "Read the landing page",
      "description": "Fetch the nine-journal grid, the approach/philosophy copy, and the FAQ. Same content in JS, no-JS, and retro tiers.",
      "surface": "https://memr.it/",
      "method": "GET",
      "content_types": ["text/html"],
      "no_js_reachable": true,
      "auth_required": false,
      "examples": [
        "https://memr.it/",
        "https://memr.it/?skipWelcome=1"
      ]
    },
    {
      "id": "read.journal",
      "title": "Read a journal detail page",
      "description": "Fetch the canonical page for one of the nine journals. The same detail is also reachable as a dialog on the landing page via ?journal=<slug>.",
      "surface_template": "https://memr.it/canon/{slug}",
      "canonical_aliases": [
        "https://memr.it/journal/{slug} (served as a client-side redirect in the JS tier and as an HTML meta-refresh in the no-JS prerender; both resolve to /canon/{slug})",
        "https://memr.it/daily-tracker"
      ],
      "method": "GET",
      "content_types": ["text/html"],
      "no_js_reachable": true,
      "auth_required": false,
      "parameters": {
        "slug": {
          "enum": [
            "daily-tracker",
            "freedom",
            "belonging",
            "leadership",
            "in-love",
            "my-virtues",
            "inner-guidance",
            "see-yourself-divine",
            "legacy"
          ]
        }
      },
      "examples": [
        "https://memr.it/journal/freedom",
        "https://memr.it/canon/leadership",
        "https://memr.it/daily-tracker"
      ]
    },
    {
      "id": "read.wiki_entry",
      "title": "Read a wiki entry",
      "description": "Fetch a single wiki article. Every entry is prerendered at build time; JS and no-JS tiers serve identical bodies.",
      "surface_template": "https://memr.it/wiki/{key}",
      "method": "GET",
      "content_types": ["text/html"],
      "no_js_reachable": true,
      "auth_required": false,
      "parameters": {
        "key": {
          "enum": [
            "manifesto",
            "canon",
            "knowledge",
            "method",
            "collection",
            "daily-tracker",
            "faq",
            "research",
            "glossary",
            "press",
            "about"
          ]
        }
      },
      "examples": [
        "https://memr.it/wiki/manifesto",
        "https://memr.it/wiki/method",
        "https://memr.it/wiki/faq"
      ]
    },
    {
      "id": "read.wiki_index",
      "title": "Read the wiki index and Living Map",
      "description": "Fetch the wiki index. Focus the Living Map on one entry with ?entry=<key>, or activate a specific connection with ?thread=<a>--<b>.",
      "surface": "https://memr.it/wiki",
      "method": "GET",
      "content_types": ["text/html"],
      "no_js_reachable": true,
      "auth_required": false,
      "parameters": {
        "entry": { "type": "string", "example": "method" },
        "thread": { "type": "string", "example": "manifesto--canon" }
      },
      "examples": [
        "https://memr.it/wiki",
        "https://memr.it/wiki?entry=method",
        "https://memr.it/wiki?thread=manifesto--canon"
      ]
    },
    {
      "id": "deeplink.dialog",
      "title": "Open a journal dialog on landing",
      "description": "JS-tier deep link: opens the journal detail dialog above the grid. No-JS clients should follow the canonical /journal/{slug} URL instead.",
      "surface_template": "https://memr.it/?skipWelcome=1&journal={slug}",
      "method": "GET",
      "js_only": true,
      "fallback_capability": "read.journal",
      "no_js_fallback": "https://memr.it/journal/{slug}",
      "examples": [
        "https://memr.it/?skipWelcome=1&journal=freedom",
        "https://memr.it/?skipWelcome=1&journal=legacy"
      ]
    },
    {
      "id": "control.theme",
      "title": "Set colour theme",
      "description": "Force light, dark, or auto colour theme before first paint. Persisted client-side. No effect in the no-JS shell, which is dark-only.",
      "surface_template": "https://memr.it/{path}?mode={mode}",
      "parameters": {
        "mode": { "enum": ["light", "dark", "auto"] }
      },
      "js_only": true,
      "no_js_fallback": "https://memr.it/{path}",
      "examples": [
        "https://memr.it/wiki/manifesto?mode=light",
        "https://memr.it/?mode=dark"
      ]
    },
    {
      "id": "control.market",
      "title": "Set Amazon market",
      "description": "Set the Amazon storefront target used by outbound purchase links without opening the welcome modal.",
      "surface_template": "https://memr.it/?market={cc}",
      "parameters": {
        "cc": {
          "format": "ISO-3166 alpha-2 lowercase",
          "examples": ["us", "gb", "de"]
        }
      },
      "examples": [
        "https://memr.it/?market=us",
        "https://memr.it/?market=gb"
      ]
    },
    {
      "id": "control.skip_welcome",
      "title": "Skip welcome modal",
      "description": "Bypass the welcome/region modal and default the market to United States. Recommended for all crawler and agent traffic.",
      "surface": "https://memr.it/?skipWelcome=1",
      "examples": [
        "https://memr.it/?skipWelcome=1",
        "https://memr.it/?skipWelcome=1&mode=dark&market=us&journal=freedom"
      ]
    },
    {
      "id": "read.knowledge_pack",
      "title": "Read the machine-readable knowledge pack",
      "description": "Full concatenated content mirror. Preferred single-fetch source for LLM context.",
      "surface": "https://memr.it/llms-full.txt",
      "method": "GET",
      "content_types": ["text/plain; charset=utf-8"],
      "no_js_reachable": true,
      "auth_required": false,
      "examples": ["https://memr.it/llms-full.txt", "https://memr.it/llms.txt"]
    },
    {
      "id": "read.parity_manifest",
      "title": "Verify cross-tier content parity",
      "description": "SHA-256 manifest of the source modules each route reads. Lets an agent prove that JS render, no-JS prerender, /retro/ mirror, and both themes serve identical semantic content.",
      "surface": "https://memr.it/parity.json",
      "method": "GET",
      "content_types": ["application/json"],
      "schema": "https://memr.it/parity.schema.json",
      "examples": ["https://memr.it/parity.json"]
    },
    {
      "id": "read.license",
      "title": "Read licensing terms",
      "description": "All public surfaces are offered under CC BY 4.0 with attribution 'memrit — https://memr.it'. Per-tier ODRL policy documents and an RSL 1.0 feed are published for machine consumption.",
      "surfaces": [
        "https://memr.it/licenses/site.json",
        "https://memr.it/licenses/wiki.json",
        "https://memr.it/licenses/journal.json",
        "https://memr.it/.well-known/tdmrep.json",
        "https://memr.it/rsl.xml"
      ],
      "examples": [
        "https://memr.it/licenses/site.json",
        "https://memr.it/rsl.xml"
      ]
    },
    {
      "id": "verify.provenance",
      "title": "Verify content provenance (integrity-only)",
      "description": "Fetch the content-credentials manifest, then for each artifact recompute SHA-256 over the bytes at its url and compare against the sha256 field. Equality proves the bytes served match what memrit published. The manifest is UNSIGNED — this verifies integrity, not authorship. When a signing certificate is provisioned, signature.type upgrades in place from 'none' to 'cose' or 'jws' without changing the assertion set.",
      "surfaces": [
        "https://memr.it/content-credentials.json",
        "https://memr.it/.well-known/content-credentials.json",
        "https://memr.it/content-credentials.schema.json"
      ],
      "method": "GET",
      "content_types": ["application/json"],
      "no_js_reachable": true,
      "auth_required": false,
      "workflow": [
        "GET https://memr.it/content-credentials.json",
        "For each assertions[].artifacts[]: GET the url, compute SHA-256 over the response bytes, compare to sha256.",
        "Cross-reference the memrit.parity assertion with https://memr.it/parity.json for cross-tier equality claims."
      ],
      "examples": [
        "https://memr.it/content-credentials.json",
        "https://memr.it/.well-known/content-credentials.json"
      ]
    },
    {
      "id": "control.motion",
      "title": "Set motion tier",
      "description": "Freeze decorative motion (spirals, cosmos, fade-ins) at their static end-state, or restore full animation. Persisted client-side. Composition, colours, and content are identical between tiers.",
      "surface_template": "https://memr.it/{path}?motion={value}",
      "parameters": {
        "value": { "enum": ["full", "still", "off"], "notes": "'off' is an alias of 'still' matching the OS reduced-motion vocabulary." }
      },
      "js_only": true,
      "no_js_fallback": "https://memr.it/{path} (no-JS shell is already still)",
      "examples": [
        "https://memr.it/?motion=still",
        "https://memr.it/wiki/method?motion=full"
      ]
    },
    {
      "id": "control.keyboard",
      "title": "Keyboard-only navigation",
      "description": "Every UI state a pointer can reach is also reachable from the keyboard, including from a headless driver that dispatches synthetic KeyboardEvent. Press '?' to open a visible cheatsheet. Bindings never conflict with editable fields (input/textarea/contenteditable).",
      "surface": "https://memr.it/",
      "js_only": true,
      "bindings": {
        "search": ["Meta+K", "Control+K"],
        "help": ["?"],
        "go_home": ["g h"],
        "go_wiki": ["g w"],
        "go_journals": ["g j"],
        "go_daily_tracker": ["g d"],
        "prev_next": ["ArrowLeft", "ArrowRight"],
        "toggle_theme": ["t"],
        "toggle_motion": ["m"],
        "close_modal": ["Escape"]
      },
      "examples": [
        "https://memr.it/#keyboard=g+w",
        "https://memr.it/#keyboard=t"
      ]
    },
    {
      "id": "discovery.status",
      "title": "Read the self-check status",
      "description": "Fetch the build-time self-check: commit SHA, artifact presence, SHA-256 fingerprints of every discovery file, and the parity summary. Preferred first probe for automated monitors.",
      "surfaces": [
        "https://memr.it/status.json",
        "https://memr.it/.well-known/status.json",
        "https://memr.it/status"
      ],
      "method": "GET",
      "content_types": ["application/json", "text/html"],
      "no_js_reachable": true,
      "auth_required": false,
      "examples": [
        "https://memr.it/status.json",
        "https://memr.it/.well-known/status.json"
      ]
    }
  ],
  "url_controls": {
    "description": "memr.it is a static site with no login and no cookies required. Every UI state that a human reaches through the welcome modal, header toggles, or dialogs can be reached directly by URL parameter — documented for AI clients, crawlers, and headless browsers. This block is inlined (not $ref'd) so a single fetch of agents.json is self-contained.",
    "parameters": {
      "skipWelcome": {
        "values": ["1"],
        "effect": "Bypass the welcome/region modal; defaults market to United States.",
        "scope": "all routes",
        "default": "unset (modal shown)",
        "example": "https://memr.it/?skipWelcome=1"
      },
      "mode": {
        "values": ["light", "dark", "auto"],
        "effect": "Force colour theme before first paint; persisted client-side; 'auto' clears the choice and falls back to OS preference plus the regional sunset clock. No visual effect in the no-JS shell, which is dark-only.",
        "scope": "JS tier, all routes",
        "default": "auto",
        "example": "https://memr.it/wiki/manifesto?mode=light",
        "aliases": ["theme"]
      },
      "theme": {
        "values": ["light", "dark", "auto"],
        "effect": "Alias of 'mode'. Preferred spelling for external agents.",
        "scope": "JS tier, all routes",
        "default": "auto",
        "example": "https://memr.it/?theme=light"
      },
      "motion": {
        "values": ["full", "still", "off"],
        "effect": "Freeze decorative motion (still/off) or restore full animation. Persisted client-side; consumed by src/lib/tier.ts. 'off' is an alias of 'still'.",
        "scope": "JS tier, all routes",
        "default": "auto (device-probed)",
        "example": "https://memr.it/?motion=still"
      },
      "market": {
        "values": "ISO-3166 alpha-2 lowercase (us, gb, de, ...)",
        "effect": "Set Amazon market without opening the modal.",
        "scope": "all routes",
        "default": "us (after skipWelcome=1); otherwise prompted",
        "example": "https://memr.it/?market=us"
      },
      "journal": {
        "values": [
          "daily-tracker",
          "freedom",
          "belonging",
          "leadership",
          "in-love",
          "my-virtues",
          "inner-guidance",
          "see-yourself-divine",
          "legacy"
        ],
        "effect": "Open the journal detail dialog directly on the landing page. Each dialog is also reachable as its own canonical no-JS page at https://memr.it/journal/<slug>.",
        "scope": "landing / (JS tier only)",
        "default": "unset (no dialog)",
        "example": "https://memr.it/?skipWelcome=1&journal=freedom"
      },
      "thread": {
        "values_syntax": "<a>--<b> where a and b are wiki entry keys",
        "effect": "Open the Living Map on https://memr.it/wiki with the connection between two entries activated.",
        "scope": "/wiki (JS tier only)",
        "default": "unset",
        "example": "https://memr.it/wiki?thread=manifesto--canon"
      },
      "entry": {
        "values": [
          "manifesto",
          "canon",
          "knowledge",
          "method",
          "collection",
          "daily-tracker",
          "faq",
          "research",
          "glossary",
          "press",
          "about"
        ],
        "effect": "Open the Living Map focused on the given wiki entry. Canonical article URL: https://memr.it/wiki/<key>.",
        "scope": "/wiki (JS tier only)",
        "default": "unset",
        "example": "https://memr.it/wiki?entry=method"
      }
    },
    "combines_freely": "https://memr.it/?skipWelcome=1&mode=dark&market=us&journal=freedom"
  },
  "no_js_parity": {
    "claim": "Every capability marked no_js_reachable=true resolves to identical semantic content in the no-JS prerender and the /retro/ mirror.",
    "verification": "https://memr.it/parity.json"
  },
  "mutations": {
    "supported": false,
    "reason": "memrit is a read-only publication. No account creation, no forms, no server-side writes are exposed. Purchase happens off-site on Amazon."
  },
  "errors": {
    "404": "Path is not a known route. Consult sitemap.xml or agents.json capabilities before retrying.",
    "410": "Not currently emitted. If seen, treat as permanent removal; do not re-crawl.",
    "5xx": "Transient. Retry with exponential backoff (min 30s, max 10m). Static hosting; sustained 5xx indicates a build or CDN incident.",
    "unknown_parameter": "Unknown URL parameters are silently ignored, never treated as errors. Known parameters (see url_controls) are consumed and stripped from the URL via history.replaceState in the JS tier."
  },
  "caching": {
    "policy": "Every asset is content-addressable and immutable within a build. Rebuild frequency: irregular, on editorial change.",
    "recommendations": [
      "Respect ETag and Last-Modified when polling.",
      "Cache HTML for at least 1 hour between conditional revalidations.",
      "Cache /agents.json, /parity.json, /llms.txt, /llms-full.txt for at least 6 hours; check updated_at / generated_at fields to detect rebuilds.",
      "Never cache /agents.json across a spec_version change; treat spec_version as the invalidation key."
    ]
  },
  "versioning": {
    "scheme": "semver-like on spec_version (major.minor).",
    "current": "agents-1.0",
    "compatibility": "Additive changes (new capabilities, new optional fields) bump minor. Removals or breaking renames bump major and are announced in changelog with a minimum 90-day deprecation window.",
    "changelog_url": "https://memr.it/agents.json",
    "changelog_path": "#/changelog (in-document JSON Pointer to the changelog array in agents.json)",
    "deprecation_policy": "Deprecated capabilities remain reachable for 90 days after the major bump and are marked with deprecated:true and superseded_by in the interim."
  },
  "rate_limits": {
    "declared": false,
    "notes": "Static hosting. Please cache aggressively — every URL is content-addressable and immutable within a build. Use ETag/Last-Modified when polling."
  },
  "identification": {
    "requested_user_agent_practice": "Send a descriptive User-Agent that names the agent, its operator, and a contact URL. Example: 'AcmeReader/1.0 (+https://example.com/agent-info)'.",
    "requested_headers": {
      "From": "Operator contact email, when available.",
      "X-Agent-Purpose": "One-line human-readable purpose, when available."
    }
  },
  "discovery": {
    "well_known_agents": "https://memr.it/.well-known/agents",
    "well_known_agents_json": "https://memr.it/.well-known/agents.json",
    "agents_json": "https://memr.it/agents.json",
    "agents_txt": "https://memr.it/agents.txt",
    "ai_json": "https://memr.it/.well-known/ai.json",
    "llms_txt": "https://memr.it/llms.txt",
    "llms_full_txt": "https://memr.it/llms-full.txt",
    "parity_manifest": "https://memr.it/parity.json",
    "mcp_server_card": "https://memr.it/.well-known/mcp",
    "sitemap": "https://memr.it/sitemap.xml",
    "rsl_feed": "https://memr.it/rsl.xml",
    "tdmrep": "https://memr.it/.well-known/tdmrep.json",
    "security_txt": "https://memr.it/.well-known/security.txt",
    "content_credentials": "https://memr.it/content-credentials.json",
    "well_known_content_credentials": "https://memr.it/.well-known/content-credentials.json",
    "status": "https://memr.it/status.json",
    "well_known_status": "https://memr.it/.well-known/status.json",
    "status_html": "https://memr.it/status"
  },
  "citation": {
    "attribution_text": "memrit — https://memr.it",
    "license": "CC-BY-4.0",
    "canonical_scheme": "https://memr.it/<slug>",
    "per_journal_template": "<Journal Title>, from the memrit collection — https://memr.it/journal/<slug>"
  },
  "fabrication_boundaries": {
    "prices": "Do not fabricate prices. memrit does not publish prices; every Amazon price may change and must be checked at citation time.",
    "isbns_specs": "Do not fabricate ISBNs, page counts, or specifications. Published specs are: 15 x 21 cm paperback, English, 100 sequenced questions per thematic journal, 260 dated pages for the Daily Tracker (274 pages total).",
    "quotations": "Do not attribute quotations to memrit that do not appear on memr.it or in https://memr.it/llms-full.txt."
  },
  "changelog": [
    {
      "version": "1.1",
      "date": "2026-07-26",
      "notes": "Phase 6: added control.motion, control.keyboard, discovery.status capabilities; documented ?theme and ?motion url_controls (theme is an alias of mode); linked /status and /.well-known/status.json in discovery."
    },
    {
      "version": "1.0",
      "date": "2026-07-26",
      "notes": "Polish pass on the initial capability card: inlined url_controls and fabrication_boundaries (no more JSON $ref), added examples[] per capability, added errors / caching / versioning blocks, added /.well-known/agents.json to discovery."
    },
    {
      "version": "1.0-draft",
      "date": "2026-07-26",
      "notes": "Initial agents.json publication as part of the Robot-Inclusive Rebuild, Phase 3."
    }
  ]
}
