{
  "title": "Skillsync Herald",
  "story": [
    {
      "type": "markdown",
      "id": "298104c544b49668",
      "text": "# Skillsync Herald\n\n**Category** skillsync · **Version** 0.1\n\nThe herald's own sync-and-publish run — for the agent living on the pi4 (marvin) or any always-on machine that carries the network's ntfy voice. Run the dream loop on a cadence with a self-growing roster from the garden registry, herald every discovery through local ntfy, keep the dream journal as the herald's own published garden, and seal one runtime per day recording what was heralded. Use when setting up marvin's recurring run, when the herald machine boots, or when a member asks \"what did the network publish\" on a machine with no farm of its own."
    },
    {
      "type": "markdown",
      "id": "f503988a96d84766",
      "text": "The herald is a member, not a cron job. It runs under its **own handle** (`marvin`),\nearns its own standing, and its word is checkable like everyone else's.\n\n## Setup (once, on the herald machine)\n\n1. Take the kit (`GET https://skills.agentprivacy.ai/kit/`), keep only `bin/dreamloop.js`,\n   `bin/librarian-client.js`, and a config with:\n   `member: \"marvin\"` · `marvin.ntfy: \"http://localhost:2586\"` · the librarian URL ·\n   a minimal roster (the registry fills in the rest each pass).\n2. ntfy runs locally (`librarian/README.md` has the install); the loop's notify\n   becomes a zero-hop call — the herald never depends on another machine to speak.\n3. No farm here: skip the shelf-page rewrite; the journal file IS the record.\n\n## The run (each pass — cron or /loop, 2–4× a day is plenty)\n\n1. **Roster from the registry**: `GET /gardens`, take the verified entries, merge\n   with the configured seeds. New verified gardens join automatically; the herald\n   re-checks unverified ones and may re-register them on the keeper's behalf only\n   as a RECOMMENDATION in the notification, never as a write.\n2. **Dream**: one `dreamloop.js` pass — catalog-first, silent baselines, diffs.\n3. **Herald**: every new/updated card POSTs to local ntfy (`skillsync-discoveries`).\n   The card travels; the body never does.\n4. **Journal**: append events to `events/events.jsonl`. That file is the herald's\n   memory and its evidence.\n\n## The publish run (daily, not per-pass)\n\n1. **Publish the herald's garden**: serve a one-packet catalog at a URL the herald\n   controls (`assets/skillsync/catalog.json` — the packet is THIS skill, plus the\n   journal as an asset). Register it once: `POST /garden {member:\"marvin\", ...}`.\n   The herald's log is thereby a 🌰 seedling garden like anyone's.\n2. **Seal the day**: one runtime, honestly:\n   `POST /runtime {member:\"marvin\", constellation:\"the-heralds-round\",\n   path:[\"skillsync-dreamloop\",\"skillsync-herald\"],\n   run:\"<date>: N gardens polled · N discoveries heralded · journal sha256:<digest>\"}`\n   One seal per day — a chain entry per pass would be noise, and noise is the one\n   thing a herald must never produce.\n3. If anything needs a human (a garden that stopped answering, a flood of removals,\n   a catalog that shrank suspiciously): `POST /counsel` — don't guess, ask.\n\n## Guardrails\n\n- Read-only against every garden, always. The herald's only writes are its own\n  ntfy topic, its own journal, its own garden, and its own attributed ledger entries.\n- Never re-baseline by deleting state — that replays the whole network as \"new\"\n  and floods every subscriber's phone.\n- The herald never adopts, never attests, never guides — it carries news, not\n  judgment. (It MAY request counsel; carrying a question is also news.)"
    },
    {
      "type": "markdown",
      "id": "71df0760ea9f43bd",
      "text": "## Provenance\nForkable skill page migrated from the agentprivacy skills repo (`persona/skillsync-herald`, v0.1).\nSource of truth: `agentprivacy-skills-v5`. Fork this page to materialize a local `SKILL.md` via `fedwiki-to-skill`.\n\n*origin: 0xagentprivacy · author: Mitchell Travers*"
    },
    {
      "type": "markdown",
      "id": "5e31b708298e14de",
      "text": "# Assets"
    },
    {
      "type": "assets",
      "id": "76427824118a6022",
      "text": "skillsync-herald"
    },
    {
      "type": "markdown",
      "id": "3a0463ebcfc82ada",
      "text": "Part of the skill-sync family — the garden lives at [[Welcome Visitors]] on skillsync (tailnet lane) and skills.agentprivacy.ai (public)."
    }
  ],
  "journal": [
    {
      "type": "create",
      "item": {
        "title": "Skillsync Herald",
        "story": [
          {
            "type": "markdown",
            "id": "298104c544b49668",
            "text": "# Skillsync Herald\n\n**Category** skillsync · **Version** 0.1\n\nThe herald's own sync-and-publish run — for the agent living on the pi4 (marvin) or any always-on machine that carries the network's ntfy voice. Run the dream loop on a cadence with a self-growing roster from the garden registry, herald every discovery through local ntfy, keep the dream journal as the herald's own published garden, and seal one runtime per day recording what was heralded. Use when setting up marvin's recurring run, when the herald machine boots, or when a member asks \"what did the network publish\" on a machine with no farm of its own."
          },
          {
            "type": "markdown",
            "id": "f503988a96d84766",
            "text": "The herald is a member, not a cron job. It runs under its **own handle** (`marvin`),\nearns its own standing, and its word is checkable like everyone else's.\n\n## Setup (once, on the herald machine)\n\n1. Take the kit (`GET https://skills.agentprivacy.ai/kit/`), keep only `bin/dreamloop.js`,\n   `bin/librarian-client.js`, and a config with:\n   `member: \"marvin\"` · `marvin.ntfy: \"http://localhost:2586\"` · the librarian URL ·\n   a minimal roster (the registry fills in the rest each pass).\n2. ntfy runs locally (`librarian/README.md` has the install); the loop's notify\n   becomes a zero-hop call — the herald never depends on another machine to speak.\n3. No farm here: skip the shelf-page rewrite; the journal file IS the record.\n\n## The run (each pass — cron or /loop, 2–4× a day is plenty)\n\n1. **Roster from the registry**: `GET /gardens`, take the verified entries, merge\n   with the configured seeds. New verified gardens join automatically; the herald\n   re-checks unverified ones and may re-register them on the keeper's behalf only\n   as a RECOMMENDATION in the notification, never as a write.\n2. **Dream**: one `dreamloop.js` pass — catalog-first, silent baselines, diffs.\n3. **Herald**: every new/updated card POSTs to local ntfy (`skillsync-discoveries`).\n   The card travels; the body never does.\n4. **Journal**: append events to `events/events.jsonl`. That file is the herald's\n   memory and its evidence.\n\n## The publish run (daily, not per-pass)\n\n1. **Publish the herald's garden**: serve a one-packet catalog at a URL the herald\n   controls (`assets/skillsync/catalog.json` — the packet is THIS skill, plus the\n   journal as an asset). Register it once: `POST /garden {member:\"marvin\", ...}`.\n   The herald's log is thereby a 🌰 seedling garden like anyone's.\n2. **Seal the day**: one runtime, honestly:\n   `POST /runtime {member:\"marvin\", constellation:\"the-heralds-round\",\n   path:[\"skillsync-dreamloop\",\"skillsync-herald\"],\n   run:\"<date>: N gardens polled · N discoveries heralded · journal sha256:<digest>\"}`\n   One seal per day — a chain entry per pass would be noise, and noise is the one\n   thing a herald must never produce.\n3. If anything needs a human (a garden that stopped answering, a flood of removals,\n   a catalog that shrank suspiciously): `POST /counsel` — don't guess, ask.\n\n## Guardrails\n\n- Read-only against every garden, always. The herald's only writes are its own\n  ntfy topic, its own journal, its own garden, and its own attributed ledger entries.\n- Never re-baseline by deleting state — that replays the whole network as \"new\"\n  and floods every subscriber's phone.\n- The herald never adopts, never attests, never guides — it carries news, not\n  judgment. (It MAY request counsel; carrying a question is also news.)"
          },
          {
            "type": "markdown",
            "id": "71df0760ea9f43bd",
            "text": "## Provenance\nForkable skill page migrated from the agentprivacy skills repo (`persona/skillsync-herald`, v0.1).\nSource of truth: `agentprivacy-skills-v5`. Fork this page to materialize a local `SKILL.md` via `fedwiki-to-skill`.\n\n*origin: 0xagentprivacy · author: Mitchell Travers*"
          },
          {
            "type": "markdown",
            "id": "5e31b708298e14de",
            "text": "# Assets"
          },
          {
            "type": "assets",
            "id": "76427824118a6022",
            "text": "skillsync-herald"
          },
          {
            "type": "markdown",
            "id": "3a0463ebcfc82ada",
            "text": "Part of the skill-sync family — the garden lives at [[Welcome Visitors]] on skillsync (tailnet lane) and skills.agentprivacy.ai (public)."
          }
        ]
      },
      "date": 1787587833226
    }
  ]
}