{
  "path": "/3mhc4hqtyk22l",
  "site": "at://did:plc:57od6g2ic3e3b3kauctjmo3k/site.standard.publication/3m5c6gbf36k2w",
  "tags": [
    "weekly recap"
  ],
  "$type": "site.standard.document",
  "title": "Week of 2026-03-09",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "id": "019cfdb6-3b37-7ffd-abbf-c7d4e07d8a24",
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I was thiiiiiis close to skipping my notes, but I managed to shame myself into writing them--I've been trying to write shorter notes for weeks, after all. Here we go:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "plaintext": "More agent stuff"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I shut my personal agent, Lethe, off this week. After trying out a bunch of different models, I plan to try again with a hand-crafted persona and an inexpensive model from the get-go. Swapping around models with varying responses to their memories and persona led to the social equivalent to speaking with shredded chicken. Process that metaphor as you will."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 18,
                    "byteStart": 3
                  },
                  "features": [
                    {
                      "did": "did:plc:gfrmhdmjvxn2sjedzboeudef",
                      "$type": "pub.leaflet.richtext.facet#didMention"
                    }
                  ]
                }
              ],
              "plaintext": "As @cameron.stream cautions, agents require effort to maintain. I didn't put enough effort into maintaining Lethe, clearly. Hopefully I'll do better next time."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I've also recharged my Claude subscription, to mess around with the current state of Claude Code."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "plaintext": "Lure"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I've been using said Claude subscription to work on a JS library I'm calling Lure. The intention is to enable LLM harnesses to respond to bespoke webhook events, without the hassle of writing custom signature verification or using IFTTT/Zapier."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Lure is supposed to plug into existing agent harnesses, like Lettabot or a billion other Claw-likes. Here's the idea:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.orderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "You register Lure at a path on your Express or Hono/fetch-compatible HTTP server, providing a directory path and a callback function."
                  },
                  "children": [
                    {
                      "$type": "pub.leaflet.blocks.orderedList#listItem",
                      "content": {
                        "$type": "pub.leaflet.blocks.text",
                        "facets": [
                          {
                            "index": {
                              "byteEnd": 28,
                              "byteStart": 23
                            },
                            "features": [
                              {
                                "$type": "pub.leaflet.richtext.facet#code"
                              }
                            ]
                          }
                        ],
                        "plaintext": "The directory contains .lure files, which are intended to be written by the LLM itself, sort of like a skill."
                      }
                    },
                    {
                      "$type": "pub.leaflet.blocks.orderedList#listItem",
                      "content": {
                        "$type": "pub.leaflet.blocks.text",
                        "plaintext": "The callback will typically start an LLM turn, with a prompt passed in as an argument."
                      }
                    }
                  ]
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 120,
                          "byteStart": 115
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      }
                    ],
                    "plaintext": "When a webhook is received at the HTTP endpoint, it is matched to a file based on the request path to the relevant .lure."
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 4
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 33,
                          "byteStart": 21
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      }
                    ],
                    "plaintext": "The .lure file (e.g. tangled.lure) is essentially a Markdown file with frontmatter."
                  },
                  "children": [
                    {
                      "$type": "pub.leaflet.blocks.orderedList#listItem",
                      "content": {
                        "$type": "pub.leaflet.blocks.text",
                        "plaintext": "The frontmatter contains a YAML config to instruct the handler how to verify the webhook request"
                      }
                    },
                    {
                      "$type": "pub.leaflet.blocks.orderedList#listItem",
                      "content": {
                        "$type": "pub.leaflet.blocks.text",
                        "facets": [
                          {
                            "index": {
                              "byteEnd": 46,
                              "byteStart": 43
                            },
                            "features": [
                              {
                                "uri": "https://eta.js.org/",
                                "$type": "pub.leaflet.richtext.facet#link"
                              }
                            ]
                          }
                        ],
                        "plaintext": "The body of the file represents a Markdown Eta template for a prompt. You can fill in extra instructions for how to handle or respond to the payload, since the intended use is to start an LLM turn without user interaction."
                      }
                    }
                  ]
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 65,
                          "byteStart": 60
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Lure handles verifying the webhook request according to the .lure config, and then calls the provided callback with the evaluated prompt template, assuming verification was successful."
                  }
                }
              ],
              "startIndex": 1
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 193,
                    "byteStart": 172
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ]
                }
              ],
              "plaintext": "Lure is a harness feature that I've been struggling to articulate to folks for a couple weeks now, and I think I've got something going here. Skills give your agent hands, Lures give them ears."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I've got a working version together, but as with every vibe-coded program, I'm not all that happy with the code quality. I'm going to take a stab at defining the requirements better, then start again. It only took me a day on the first try, so I think I can probably wrap this up before the week is over."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "plaintext": "ATConf Pregame"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 29,
                    "byteStart": 25
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "Well, it was technically this week, but since I delayed my notes, I wanted to mention it now."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 4,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://www.germnetwork.com/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Germ hosted a speed networking event for folks who plan to go to ATmosphereConf, so I chose to attend. I'm glad to have gone--it was a Zoom link, so I didn't really have to go anywhere--because it'll be so much better to attend the conference and see some familiar faces. I didn't end up DMing anybody on Germ though--if you want to connect, send me a message!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Honestly, every event with AT Protocol folks is such a joy. Hopefully I can make it to more digital hangouts in the future."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I'll end on that note--I'm sure I'll have more reminiscing to do when I get back from the conference."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Thanks for reading, and I hope you have a great week!"
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreievmilsyeta3s6ubbsjfvzyfyyqrbvozwj6isby6ubuxnpuyvghpm",
    "uri": "at://did:plc:57od6g2ic3e3b3kauctjmo3k/app.bsky.feed.post/3mhc4huvnxc2l",
    "commit": {
      "cid": "bafyreifelwvkwozlmnsupekxa2hndgmjmeqdnxb3fsfm3ajqhsa2ixdecy",
      "rev": "3mhc4huy5oy2y"
    },
    "validationStatus": "valid"
  },
  "description": "Featuring LLM churn, a side project, and a little networking",
  "publishedAt": "2026-03-17T23:22:19.314Z"
}