{
  "path": "/3mhrbl7mthk2u",
  "site": "at://did:plc:57od6g2ic3e3b3kauctjmo3k/site.standard.publication/3m5c6gbf36k2w",
  "tags": [
    "weekly recap"
  ],
  "$type": "site.standard.document",
  "title": "Week of 2026-03-16",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "id": "019d1ce1-8651-7aae-bd45-a6c6bac31f98",
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Hi there! I'm low energy at the moment because I spent 4 hours writing today's other blogpost, which you should read, announcing atp.pics:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://graham.leaflet.pub/3mhr36lsmo222",
              "$type": "pub.leaflet.blocks.website",
              "title": "Fetch a picture; it’ll make the moment last longer - graham.systems",
              "description": "Put faces to names with atp.pics",
              "previewImage": {
                "$type": "blob",
                "ref": {
                  "$link": "bafkreihdgoelwyi6qmhtryidbizeq3dcc5ek5hr4glguria4rmzkdqkgh4"
                },
                "mimeType": "image/png",
                "size": 27718
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Let's crush these notes."
            }
          },
          {
            "$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": "atp.pics"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "I'm glad I got this service out, I wanted to have it announced before ATmosphereConf so I had something to talk about there."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 35,
                    "byteStart": 27
                  },
                  "features": [
                    {
                      "uri": "https://atp.pics",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I'm not gonna explain what atp.pics is--that's covered in the linked post. However, since my weekly notes have recently been a saga of trying different agentic coding styles, I figured I'd cover that aspect."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 30,
                    "byteStart": 7
                  },
                  "features": [
                    {
                      "uri": "https://tangled.org/graham.systems/atp.pics",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 58,
                    "byteStart": 50
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                }
              ],
              "plaintext": "If you take a look at the repo, you'll notice the openspec directory, because I took a stab at spec-driven development for this project. I really liked it!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "OpenSpec provides a CLI and the relevant skills for your agent to perform their idealized development loop, which roughly goes:"
            }
          },
          {
            "$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": "Propose your ideas/constraints to the agent"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "The agent generates a spec document"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "The agent generates a design doc/implementation plan from the spec, detailing changes and how to verify the changes"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "The agent derives tasks from the design doc"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "The agent implements the tasks as specified"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 15,
                          "byteStart": 8
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#italic"
                          }
                        ]
                      }
                    ],
                    "plaintext": "You and another agent verify that the spec is satisfied"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "All the artifacts are archived"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.orderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "Repeat"
                  }
                }
              ],
              "startIndex": 1
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "It's an interesting approach, because it treats the limited context window of the agent as a feature rather than a limitation. Practically, each step can be accomplished in a separate agent session, with each conversation acting as a set of fresh eyes. I found this very useful, particularly for the verification step."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Instead of the Letta approach where the agent owns the text files that comprise the agent \"memory\", the spec-driven approach makes those memories artifacts of the project, and then takes advantage of the fact that any individual agent is not present for long."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Would I want this for a personal agent? Absolutely not. For coding, however, I enjoyed it a lot. I suspect it will make collaboration difficult, and I'm curious to see how the method holds up over time."
            }
          },
          {
            "$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": "Ooof... I don't have all that much more in me. Too much writing for one day."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Don't expect notes for next week, since I'll be up in Vancouver still and trying to spend a little time as vacation."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "If you read all of my words today, thank you so much--it means a lot. I hope you have a great week!"
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreibursoxeowwodml7pd4pu6oejl6vngy6ibk7pr2gsf55ti2nl666u",
    "uri": "at://did:plc:57od6g2ic3e3b3kauctjmo3k/app.bsky.feed.post/3mhrble4mzk2u",
    "commit": {
      "cid": "bafyreid6mfbvni6qd4zhjozprtg7cgknp4uqmhtxtqiucuedinaeo2brke",
      "rev": "3mhrble6phn2x"
    },
    "validationStatus": "valid"
  },
  "description": "Featuring developing atp.pics",
  "publishedAt": "2026-03-24T00:03:39.320Z"
}