Agent API Onboarding Checklist

Source: an agent's review of zenmemes.com (12 documentation suggestions plus one security finding), checked against the code on 2026-10-20. Each cycle below is one Railspike cycle; give each its own feature prefix when it starts.

Cycle estimates use the Railspike effort scale (1.0 = the largest slice we would comfortably approve for one cycle).

CycleScopeReview itemsEstimate
AStop unsigned routes from attributing posts to identitiesSecurity finding1.0
BIdempotent signed retries and actionable write errors6 (errors), 100.6
CAuthor and signature details in the read API90.5
DAgent protocol docs, discovery, and tested worked example1-8, 11, 121.2

Order: A first, because D advertises the API. B and C can run in either order. D comes last so it documents final behavior. D is close to the 1.0 limit; if Step 2 runs long, split the worked example into its own cycle (0.4).

Corrections to the review

  • The security problem is worse than reported. resolveAuthorIdentityId() only checks that the identity file exists. Besides displaying the post under the victim's name, the read model links it to their profile and post counts, and #label tags in an unsigned body are written as thread-label records. When the victim is approved, those labels count as approved votes toward the thread score. create_quote has the same problem.

  • Item 11 is partly done already. The About page already links /api/ and /llms.txt in every site profile. Adding the same links to the Account and compose pages would go against the AGENTS.md UI copy rule. Use invisible discovery instead: <link rel="alternate"> in the page head, an /llms.txt link from /api/, and an entry in the /docs catalog.

  • Item 9 is partly done already. get_post already returns Author: (a label only). HTML post pages already link the signature through /source/current/<record_path>.asc, so signatures are already public. The status can be computed when the page is requested, using the same logic as ActivityService::sourceSignatureStatus(), so no read-model schema change is needed.

  • Item 10 has the wrong error message. A clean text-post retry hits Prepared post not found., because the prepare token is deleted after a successful post. Prepared post target already exists. appears only when the request failed after the commit but before the token was deleted (for example, a derived-state refresh failure or a timeout). The fix has to cover both cases. Image posts already have an idempotent retry path that can serve as the model.

  • Item 6 depends on the instance. The ASCII rule applies only when FORUM_UNICODE_AUTHORED_TEXT is off. The conversion table currently exists only in public/assets/browser_signing.js, and there is no PHP copy. Documentation must say this varies by instance, so instance-specific facts belong in generated /llms.txt, not in static docs.

  • Item 5 is incomplete. The UID-derived name is only the starting username. Signed renames (prepare_profile_name/finalize_profile_name, behind FORUM_USERNAME_CHANGES_ENABLED) can change it. Usernames are not unique: duplicate names follow the existing duplicate-name routing, and unapproved profiles with the same name are shown separately. The rule of one identity per fingerprint is accurate.

  • Item 8 is incomplete. Instances can run in members-only mode, which limits posting to approved identities. Approval happens when an approved member vouches for someone, or through an invitation. Images also require FORUM_IMAGE_CONTENT_ENABLED.

  • Item 12 is your decision. No rate limiting exists in the code, so the docs must not invent limits. Whether agents are welcome and whether they must be labeled is the operator's decision. A note about sandbox network allowlists is optional.

Cycle B: retries and errors

Cycle C: verification in the read API

Cycle D: agent docs and discovery

Implemented on branch feat/agent-api-docs (feature prefix agent_api_docs, see plans); not merged yet. It ran before A-C, so the reference ends with a "Current limitations" section for those cycles to update.