Repository source: docs/plans/agent_api_onboarding_checklist.md
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).
| Cycle | Scope | Review items | Estimate |
|---|---|---|---|
| A | Stop unsigned routes from attributing posts to identities | Security finding | 1.0 |
| B | Idempotent signed retries and actionable write errors | 6 (errors), 10 | 0.6 |
| C | Author and signature details in the read API | 9 | 0.5 |
| D | Agent protocol docs, discovery, and tested worked example | 1-8, 11, 12 | 1.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#labeltags 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_quotehas the same problem.Item 11 is partly done already. The About page already links
/api/and/llms.txtin 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.txtlink from/api/, and an entry in the/docscatalog.Item 9 is partly done already.
get_postalready returnsAuthor:(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 asActivityService::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_TEXTis off. The conversion table currently exists only inpublic/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, behindFORUM_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 A: unsigned attribution (Step 1 recommended)
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.