Skip to content

docs(workflows): add the transactional email API page - #2

Draft
Silthus wants to merge 9 commits into
masterfrom
docs/transactional-email-api
Draft

Silthus wants to merge 9 commits into
masterfrom
docs/transactional-email-api

Conversation

@Silthus

@Silthus Silthus commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Moved here from PostHog#21306, closed on 2026-10-25 so this fork stack is the only copy. It opens upstream again after review.

Note

Restacked onto fork master at 473432f3f with no conflicts. git range-diff shows all nine commits unchanged (=), so the page is the same as on PostHog#21306 at 2b0a7a224. The body below is the body of PostHog#21306.

Changes

Engineers and coding agents get one page that teaches the whole transactional email API: write an HTML template, upload it by key, send it from code, change a code-managed template, and fix every error the API returns. Each error code has its own section, so every docs_url in an API error opens the fix.

  • New page: /docs/workflows/transactional-email-api, marked beta, with a sidebar entry under Workflows › Transactional email › Send email from code.
  • The page covers the beta note, the project secret API key, the template format, sending a template file with posthog-node, upload by key, the send route, the content hash, templates managed by code, adoption, and anchored error sections.
  • New in 6aa5dd523 and 3f9db72ad (Silthus/posthog#507):
    • Change a code-managed template: Edit with your agent (complete the sentence, copy the prompt), Run with PostHog Code (a task opens a pull request, also over POST …/messaging_templates/:id/request_change/ and the MCP tool workflows-request-email-template-change), what PostHog AI and the Slack bot do (they hand you the template link), Copy HTML file, and when the change goes live: copying a prompt or a file, or starting a task, never changes live email.
    • Where the source details come from: the source option of uploadTemplate(), the GitHub Actions, GitLab CI, Vercel and Railway variables and their order, the git checkout fallback, and what happens when nothing is found.
    • Seven new error anchors for the change request: instruction_missing, template_not_managed_by_code, template_repository_missing, template_repository_unsupported, github_repository_not_connected, posthog_code_not_available, posthog_code_run_failed. Each quotes the server's detail, why, and fix verbatim.
    • The immutable fix now quotes the server's new text, which puts editing the file first. invalid_request, not_found, permission_denied, the beta note, and the key requirements name the change request route.
  • New in c1380a99d, b805f1be6, and 2b0a7a224: the page follows stack B at its reviewed head 0c3c8b87b51 (PostHog/posthog#119032).
    • A change request needs hog_flow:read next to task:write, and editor access to Workflows. permission_denied names the first missing scope and the editor access denial.
    • Run with PostHog Code lists the new disabled reasons: missing workflow editor access first, and "Shorten the change to 2,000 characters". A repository that isn't on GitHub no longer disables the button. It fails on click with template_repository_unsupported.
    • The refusal texts quote the server's new wording: the fixes say to edit the file "as its change_prompt_context describes", the sandbox fix names the page steps, and the immutable fix adds a step for PostHog AI and the Slack bot.
    • Agents also get change_prompt_variables.

Note

🔵 Merge risk: low · two-way door (merge-risk rubric)

  • Docs only: one page and one sidebar entry. No component, template, or build change.
  • The page documents server work that has not shipped yet. Hold the merge until the backend stacks ship, or the page describes routes and buttons that don't exist:

Screenshots: changing a code-managed template

Local dev server (GATSBY_MINIMAL=true pnpm start) at 2b0a7a224. Example data only: example.com-style repositories and invented keys.

Light, 1440 px Dark, 820 px
Run with PostHog Code: the six disabled reasons, the API access, and the instruction rules Run with PostHog Code, light Run with PostHog Code, dark
posthog_code_not_available, opened by plain navigation: the four reasons with the server's new fixes posthog_code_not_available, light posthog_code_not_available, dark
permission_denied: the scope and editor access messages permission_denied, light
Change a code-managed template: Edit with your agent Change section, light
Where the source details come from Source section, light
docs_url for template_repository_missing, opened by plain navigation Error anchor, light
Screenshots at 3f9db72, before the server sync

Screenshots at 3f9db72

Local dev server (GATSBY_MINIMAL=true pnpm start) at 3f9db72ad. Example data only: example.com-style repositories and invented keys.

Light, 1440 px Dark, 820 px
Change a code-managed template: Edit with your agent, Run with PostHog Code Change section, light Change section, dark
Ask PostHog AI or the Slack bot, Copy the HTML file, When the change goes live Rest of the change section, light
Where the source details come from Source section, light Source section, dark
docs_url for template_repository_missing, opened by plain navigation Error anchor, light Error anchor, dark

Evidence

  • Test seam: the anchor check, a scratch Playwright script kept out of the repo, as in Silthus/posthog#475. It opens the page and asserts that every code has an element with that id and that its section quotes the server's strings.
    • The strings for the change request codes and immutable come from the server code: a Python AST pass over template_change_requests.py, template_ownership.py, and message_templates.py at 0c3c8b87b51 pulls every refusal's detail, why, and fix. f-strings give their fixed text around each placeholder, and conditional texts give both branches.
    • The 27 earlier codes keep Amplify Test #16 PostHog/posthog.com#475's strings.
  • Red on 3f9db72ad (the page before the server sync) against the strings at 0c3c8b87b51: 30/34. immutable, template_repository_unsupported, github_repository_not_connected, and posthog_code_not_available miss the server's new text.
  • Green on 2b0a7a224: 34/34. All 63 in-page # links resolve. A text probe confirmed the served page carries the final-read fixes.
  • Lint: the pre-commit hook (markdownlint, Prettier) passed. No em or en dashes.
  • Gaps:
    • Vale isn't installed on this box, so it didn't run on the new text.
    • No production gatsby build, so the markdown twin wasn't generated locally. The changed text uses only markdown, tables, and code blocks.
    • PostHog Code has no docs page to link, so the page names it without a link.
Anchor check output (green, 2b0a7a2)
GET http://localhost:8507/docs/workflows/transactional-email-api -> 200
ok   #invalid_template_key (H3, 2 API strings)
ok   #invalid_request (H3, 3 API strings)
ok   #template_not_sendable (H3, 1 API strings)
ok   #sender_unavailable (H3, 1 API strings)
ok   #marketing_template (H3, 1 API strings)
ok   #key_already_set (H3, 2 API strings)
ok   #key_in_use (H3, 2 API strings)
ok   #immutable (H3, 4 API strings)
ok   #template_not_found (H3, 3 API strings)
ok   #template_outdated (H3, 2 API strings)
ok   #not_found (H3, 1 API strings)
ok   #authentication_failed (H3, 0 API strings)
ok   #permission_denied (H3, 3 API strings)
ok   #throttled (H3, 1 API strings)
ok   #template_not_transactional (H3, 1 API strings)
ok   #transactional_email_paused (H3, 1 API strings)
ok   #invalid_recipient (H3, 1 API strings)
ok   #quota_limited (H3, 1 API strings)
ok   #delivery_unavailable (H3, 1 API strings)
ok   #template_superseded (H3, 2 API strings)
ok   #missing_secret_key (H4, 0 API strings)
ok   #client_disabled (H4, 0 API strings)
ok   #network_error (H4, 0 API strings)
ok   #template_file_unreadable (H4, 0 API strings)
ok   #template_missing_subject (H4, 0 API strings)
ok   #api_error (H4, 0 API strings)
ok   #unexpected_error (H4, 0 API strings)
ok   #instruction_missing (H3, 3 API strings)
ok   #template_not_managed_by_code (H3, 3 API strings)
ok   #template_repository_missing (H3, 3 API strings)
ok   #template_repository_unsupported (H3, 4 API strings)
ok   #github_repository_not_connected (H3, 4 API strings)
ok   #posthog_code_not_available (H3, 9 API strings)
ok   #posthog_code_run_failed (H3, 3 API strings)
34/34 codes anchored with matching text
Anchor check output (red, 3f9db72 against 0c3c8b87b51)
GET http://localhost:8507/docs/workflows/transactional-email-api -> 200
FAIL #immutable: fix not quoted: "When the repository is in your workspace, or you run outside PostHog Code and can check it out, edit "
FAIL #immutable: fix not quoted: " there, as the template's `change_prompt_context` describes. It also says how the change goes live. Inside PostHog Code, such as PostHog AI or the Slack bot, share the template's link instead: on its page, the person clicks Edit with your agent, then Run with PostHog Code. Otherwise, ask PostHog Code to open a pull request with the change: call the `workflows-request-email-template-change` tool, or POST an `instruction` to this template's `request_change/` route. To edit the template in PostHog instead, stop managing it in code first: send a PATCH whose only field is `managed_by` set to `gui`."
FAIL #template_repository_unsupported: detail not quoted: "PostHog Code can't change files in this template's repository."
FAIL #template_repository_unsupported: fix not quoted: "Edit the template's file in its repository, as its `change_prompt_context` describes."
FAIL #github_repository_not_connected: fix not quoted: "`, then request the change again. Access you just gave can take a few minutes to show up."
FAIL #posthog_code_not_available: fix not quoted: "Share the template's link with the person. On its page, they click Edit with your agent, describe the change, and click Run with PostHog Code, which opens a pull request."
FAIL #posthog_code_not_available: fix not quoted: "Edit the template's file in its repository, as its `change_prompt_context` describes."
FAIL #posthog_code_not_available: fix not quoted: "Edit the template's file in its repository, as its `change_prompt_context` describes. PostHog Code is available again when the credits renew."
30/34 codes anchored with matching text
Evidence at 3f9db72, before the server sync

Evidence at 3f9db72

  • Test seam: the anchor check, a scratch Playwright script kept out of the repo, as in Silthus/posthog#475. It opens the page and asserts that every code has an element with that id and that its section quotes the server's strings. Extended for this change:
    • The strings for the change request codes come from the server code itself: a Python AST pass over template_change_requests.py, template_ownership.py, and message_templates.py at 60fb98f06a5 on spec/template-request-change pulls every refusal's detail, why, and fix. f-strings give their fixed text around each placeholder.
    • The 27 earlier codes keep Amplify Test #16 PostHog/posthog.com#475's strings, except the immutable fix, which the server replaced.
  • Red on c86c7a6a9 (the page before this change): 25/34. The seven new codes have no anchor, and the immutable and invalid_request sections miss the server's new fix text.
  • Green on 3f9db72ad: 34/34, every section quoting its strings. All 59 in-page # links resolve.
  • Mutation: the red run doubles as one. The old immutable section, one sentence off the server's text, fails.
  • Lint: the pre-commit hook (markdownlint, Prettier) passed on both commits. No em or en dashes.
  • Gaps:
    • Vale isn't installed on this box, so it didn't run on the new text.
    • No production gatsby build, so the markdown twin wasn't generated locally. The new sections use only markdown, tables, and code blocks.
    • PostHog Code has no docs page to link, so the page names it without a link.
Anchor check output (green, 3f9db72)
GET http://localhost:8507/docs/workflows/transactional-email-api -> 200
ok   #invalid_template_key (H3, 2 API strings)
ok   #invalid_request (H3, 3 API strings)
ok   #template_not_sendable (H3, 1 API strings)
ok   #sender_unavailable (H3, 1 API strings)
ok   #marketing_template (H3, 1 API strings)
ok   #key_already_set (H3, 2 API strings)
ok   #key_in_use (H3, 2 API strings)
ok   #immutable (H3, 4 API strings)
ok   #template_not_found (H3, 3 API strings)
ok   #template_outdated (H3, 2 API strings)
ok   #not_found (H3, 1 API strings)
ok   #authentication_failed (H3, 0 API strings)
ok   #permission_denied (H3, 3 API strings)
ok   #throttled (H3, 1 API strings)
ok   #template_not_transactional (H3, 1 API strings)
ok   #transactional_email_paused (H3, 1 API strings)
ok   #invalid_recipient (H3, 1 API strings)
ok   #quota_limited (H3, 1 API strings)
ok   #delivery_unavailable (H3, 1 API strings)
ok   #template_superseded (H3, 2 API strings)
ok   #missing_secret_key (H4, 0 API strings)
ok   #client_disabled (H4, 0 API strings)
ok   #network_error (H4, 0 API strings)
ok   #template_file_unreadable (H4, 0 API strings)
ok   #template_missing_subject (H4, 0 API strings)
ok   #api_error (H4, 0 API strings)
ok   #unexpected_error (H4, 0 API strings)
ok   #instruction_missing (H3, 3 API strings)
ok   #template_not_managed_by_code (H3, 3 API strings)
ok   #template_repository_missing (H3, 3 API strings)
ok   #template_repository_unsupported (H3, 3 API strings)
ok   #github_repository_not_connected (H3, 4 API strings)
ok   #posthog_code_not_available (H3, 9 API strings)
ok   #posthog_code_run_failed (H3, 3 API strings)
34/34 codes anchored with matching text
Anchor check output (red, c86c7a6)
FAIL #invalid_request: fix not quoted: "Fix `instruction` and request the change again."
FAIL #immutable: fix not quoted: "When you can reach the repository, edit "
FAIL #immutable: fix not quoted: " yourself. The next send uploads it. Otherwise, ask PostHog Code to open a pull request with the change: call the `workflows-request-email-template-change` tool, or POST an `instruction` to this template's `request_change/` route. To edit the template in PostHog instead, stop managing it in code first: send a PATCH whose only field is `managed_by` set to `gui`."
FAIL #instruction_missing: no element with this id
FAIL #template_not_managed_by_code: no element with this id
FAIL #template_repository_missing: no element with this id
FAIL #template_repository_unsupported: no element with this id
FAIL #github_repository_not_connected: no element with this id
FAIL #posthog_code_not_available: no element with this id
FAIL #posthog_code_run_failed: no element with this id
25/34 codes anchored with matching text

Where the facts come from

Server code on spec/template-request-change at 0c3c8b87b51 (PostHog/posthog#119032) and spec/template-agent-edit (0960e3de116, PostHog/posthog#118980), and posthog-node on PostHog/posthog-js#5312. Where the spec (Silthus/posthog#502) and the code differ, the page follows the code:

Topic Spec Code, as documented
PostHog AI and the Slack bot Call the change request and share the task link The route refuses calls from a PostHog Code sandbox with posthog_code_not_available. They hand you the template link instead (decision)
Explicit source Wins over detection on every automatic upload Only uploadTemplate() takes it. The upload after a send uses detection only
Path detection Omitted when nothing is found Always has a value. Outside the working directory it is absolute, and the prompt then finds the file by its key
Ref variables Taken as set Count only as a full 40- or 64-character commit hash
Change request errors Seven codes Also invalid_request for an instruction over 2,000 characters. posthog_code_not_available is 403 with four why/fix pairs, the rest 400
Change request access task:write and read access to the template hog_flow:read and task:write for tokens (hog_flow:write covers the read), and editor access to Workflows
Button disabled reasons Three Six, in this order: workflow editor access, no repository, "Checking the GitHub connection", no GitHub integration, over 2,000 characters, "Describe the change first". A repository that isn't on GitHub fails on click, not on the button

Review

Opus 5.5 at high effort, read-only, as a fresh agent. Recorded with fleet proof review-start and review-finish.

  • Round 2 on 6aa5dd523: no high findings, 1 medium and 13 low, all held and fixed in 3f9db72ad. The medium one: an agent that gets the sandbox refusal wasn't told where the template link is. Among the low ones: the detection order didn't hold for path, the absolute path fallback, Copy HTML file must name the file after the key, the missing "Checking the GitHub connection" reason, and an app that sends by key needs an upload after the merge.
  • Final read 4 on 3f9db72ad: all resolved, and the five new claims in the fix lines hold against the code. PASS.
  • Final read 5 on c1380a99d (the server sync), a fresh reviewer: all 38 quoted server strings match 0c3c8b87b51. 3 low findings, all fixed in b805f1be6: the server names only the first missing scope, the permission fix advised a project secret API key for routes that refuse it, and the instruction prefix includes what this request asks for:.
  • Final read 6 on b805f1be6: those resolved. 2 new low findings in the fix lines, fixed in 2b0a7a224: the per-route fix pointed at scopes some sections don't name, and the editor access denial applies to every write route, not only a change request.
  • Final read 7 on 2b0a7a224: PASS. fleet proof gate passes on this HEAD.
Earlier scope: the page itself (Silthus/posthog#475, up to c86c7a6)

Screenshots

Local dev server (GATSBY_MINIMAL=true pnpm start). Example data only: example.com addresses, invented keys and hashes.

Light, wide Dark, narrow
The page The page, light, wide The page, dark, narrow
docs_url for template_not_found template_not_found section, light, wide template_not_found section, dark, narrow

The anchor shots open /docs/workflows/transactional-email-api#template_not_found by plain navigation. The browser scrolls to the section with no script.

Sidebar (narrow windows hide the sidebar, so only wide):

Light Dark
Before (posthog.com) Sidebar before, light Sidebar before, dark
After Sidebar after, light Sidebar after, dark

Evidence

  • Red: before the page existed, the docs_url from a real template_not_found response (https://posthog.com/docs/workflows/transactional-email-api#template_not_found, opened on the local dev server) answered 404, the Gatsby development 404 page. The anchor check found 0/27 codes.

    Red: the docs_url before the page

    Red: Gatsby development 404 for the docs_url

  • Green on c86c7a6a9: after the page, the same URL answers 200 and lands on the template_not_found section. The anchor check finds 27/27 codes, each with the server's message and fix text.

  • Mutation: changing one quoted fix sentence on the page (key_in_use) made the check fail with 26/27.

  • Anchor check: a scratch Playwright script, kept out of this PR. It opens the page and asserts that every catalog code has an element with that id, and that its section quotes the API's detail and fix strings verbatim. The strings come from the server code at 7845707ba33 on spec/code-managed-templates.

  • Lint: Vale 3.13.1 with the repo config: no errors. Left: dictionary gaps (bundler, preheader) and two verbatim API quotes (id, posthog-node). markdownlint-cli2 with the repo config: 0 errors. The pre-commit hook (Prettier, ESLint, markdownlint) passed.

  • Console: the page adds no console errors. A 404 resource error and SVG width="auto" warnings show on existing pages too, such as /docs/workflows/broadcasts.

  • Gap: I didn't run a production gatsby build, so the markdown twin wasn't generated locally. The page uses plain markdown, code blocks, tables, and one CalloutBox, as the existing workflows pages do.

Anchor check output (green)
GET /docs/workflows/transactional-email-api -> 200
ok   #invalid_template_key (H3, 2 API strings)
ok   #invalid_request (H3, 2 API strings)
ok   #template_not_sendable (H3, 1 API strings)
ok   #sender_unavailable (H3, 1 API strings)
ok   #marketing_template (H3, 1 API strings)
ok   #key_already_set (H3, 2 API strings)
ok   #key_in_use (H3, 2 API strings)
ok   #immutable (H3, 2 API strings)
ok   #template_not_found (H3, 3 API strings)
ok   #template_outdated (H3, 2 API strings)
ok   #not_found (H3, 1 API strings)
ok   #authentication_failed (H3, 0 API strings)
ok   #permission_denied (H3, 3 API strings)
ok   #throttled (H3, 1 API strings)
ok   #template_not_transactional (H3, 1 API strings)
ok   #transactional_email_paused (H3, 1 API strings)
ok   #invalid_recipient (H3, 1 API strings)
ok   #quota_limited (H3, 1 API strings)
ok   #delivery_unavailable (H3, 1 API strings)
ok   #template_superseded (H3, 2 API strings)
ok   #missing_secret_key (H4, 0 API strings)
ok   #client_disabled (H4, 0 API strings)
ok   #network_error (H4, 0 API strings)
ok   #template_file_unreadable (H4, 0 API strings)
ok   #template_missing_subject (H4, 0 API strings)
ok   #api_error (H4, 0 API strings)
ok   #unexpected_error (H4, 0 API strings)
27/27 codes anchored with matching text

Where the facts come from

The routes, fields, codes, and messages come from the server code on the integration branch spec/code-managed-templates (tip 7845707ba33) and the SDK in PostHog/posthog-js#5312. Where the spec's error catalog and the code differ, the page follows the code:

Topic Spec catalog Code, as documented
immutable Later lock slice Live: update, design, and delete answer 403, and the UI shows a read-only preview with Stop managing in code
authentication_failed / permission_denied One row Two sections. A missing header answers not_authenticated
Existing codes (sender_unavailable, template_not_sendable, marketing_template, send codes) Same table No why, fix, or docs_url in the body. The page gives the fix
invalid_request Field errors and both or neither of key and id Also hash with id, and key sent with other fields on adoption
template_superseded Spec wording The server's wording. In posthog-node it is { code, message }, without fix
SDK codes Six Also api_error and unexpected_error
Upload result created, updated, unchanged Also superseded with if_not_superseded (Silthus/posthog#499, landed on the integration branch)

Review

Opus 5.5 at high effort, read-only, as a fresh agent. Recorded with fleet proof review-start and review-finish.

  • Round 1 on 26083a1c3: 10 findings, 2 medium and 8 low. All held and are fixed in cedcc00a3. The two medium ones: the error envelope (only seven codes carry why, fix, and docs_url), and the deleted-workflow case of transactional_email_paused (an upload makes a new workflow with the default sender). The low ones: the beta flag gates only upload and send, the example response hash, the 100-hash window, how to set a default sender, marketing_template on a code-managed template, templateFile() throws, the personal API key fallback and two permission messages, and how the rate limits count.
  • Final read 1 on cedcc00a3: all 10 resolved. It found 3 new low problems in the fix lines, all fixed in 12c38f1fc.
  • Final read 2 on 12c38f1fc: all 3 resolved. One new low finding: name the access make_transactional needs, and its 403 message. Fixed in c86c7a6a9.
  • Final read 3 on c86c7a6a9: PASS, no findings. fleet proof gate passes on this HEAD.

Decisions

Question Answer Who Where
What do PostHog AI and the Slack bot do for a code-managed template? They hand you the template link, where Run with PostHog Code opens the pull request. The route keeps refusing sandbox calls 👤 Human Silthus/posthog#507
Where do the docs live? One beta page at /docs/workflows/transactional-email-api, with one anchored section per error code and warning 👤 Human Spec: Docs page
Copyable agent prompt or llms.txt line? Neither in this PR 👤 Human Map: Not yet specified
Spec or code when they differ? Document the code 👤 Human Silthus/posthog#475
Anchors for SDK-only codes? Yes, so every error.code from posthog-node has a fix 🤖 Agent Silthus/posthog#475
Local evaluation in the Node setup? Recommend enableLocalEvaluation: false, because secretKey starts flag polling, which needs feature_flag:read 🤖 Agent Silthus/posthog#475
Commit the anchor check? No, a content PR changes only contents/ and the nav 🤖 Agent Silthus/posthog#475
How to quote the change request errors detail, why, and fix as a list per code, and posthog_code_not_available's four reasons as a table 🤖 Agent Silthus/posthog#507
Where the anchor check gets its strings From the server code by AST, so a server text change fails the check 🤖 Agent Silthus/posthog#507

Involvement: one decision answered by Michael; for this change one review round and four final reads (Opus 5.5, high); proof captured (red, green, screenshots). CodeRabbit not run on this repository.

Checklist

  • I've read the docs and/or content style guides.
  • Words are spelled using American English
  • Use relative URLs for internal links
  • I've checked the pages added or changed in the Vercel preview build (checked on the local dev server; the Vercel preview runs on this PR)
  • If I moved a page, I added a redirect in vercel.json (no page moved)

🤖 Generated with Claude Code

Silthus and others added 9 commits October 23, 2026 13:39
One page for sending email from code: the template format, posthog-node
template files and the content hash, upload by key, the send route,
templates managed by code, adoption, and one anchored section per error
code, so every docs_url the API returns opens its fix.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Say which errors carry why, fix, and docs_url, and which routes the beta
flag gates. Split the paused and deleted workflow cases, name the 100-hash
window, the default sender button, the personal API key fallback, two more
permission messages, when templateFile() throws, and how the rate limits
count. Correct the example upload response hash.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Scope the automatic upload guarantee to the last 100 publishes, point a
keyless template with a deleted workflow at the make_transactional route,
and split the project access fix by key type.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… comes from

Add the section on changing a code-managed template: the agent prompt,
Run with PostHog Code and its request_change route, what PostHog AI and
the Slack bot do, and Copy HTML file. Add how posthog-node detects the
repository, path and ref, and anchors for the seven request-change error
codes. Update the immutable fix to the server's new text.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Scope the source detection order to the repository and the ref, and name
the absolute path fallback. Tell an agent that gets the sandbox refusal
where the template link is. Name the file after the key on Copy HTML
file, add the missing disabled reason, the starter advice, the upload by
key after a merge, and the change request route in the beta callout and
the key requirements.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Quote the server's new refusal texts: the fixes now point at
change_prompt_context, and the sandbox fix names the page steps. Add
hog_flow:read next to task:write, the workflow editor access and length
reasons on the button, change_prompt_variables, and the new immutable
fix with its PostHog Code step.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Name the first missing scope as the server does, add the editor access
denial a change request gets, scope the permission fix per route, and
say what PostHog puts in front of an instruction without the starter.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@github-actions

Copy link
Copy Markdown

Vale prose linter → found 0 errors, 14 warnings, 1 suggestions in your markdown

Full report → Copy the linter results into an LLM to batch-fix issues.

Linter being weird? Update the rules!

contents/docs/workflows/transactional-email-api.mdx — 0 errors, 14 warnings, 1 suggestions
Line Severity Message Rule
140:91 warning 'Bundlers' is a possible misspelling. PostHogBase.Spelling
148:8 warning 'bundler' is a possible misspelling. PostHogBase.Spelling
261:60 warning 'preheader' is a possible misspelling. PostHogBase.Spelling
266:42 warning 'preheader' is a possible misspelling. PostHogBase.Spelling
269:131 warning 'preheader' is a possible misspelling. PostHogBase.Spelling
293:55 warning 'preheader' is a possible misspelling. PostHogBase.Spelling
380:124 warning 'preheader' is a possible misspelling. PostHogBase.Spelling
390:4 warning 'upload's' is a possible misspelling. PostHogBase.Spelling
407:208 warning 'worktree's' is a possible misspelling. PostHogBase.Spelling
408:131 suggestion Address the reader directly. Use 'you' instead of 'The user'. PostHogDocs.DirectAddress
528:190 warning Use 'ID' instead of 'id'. Vale.Terms
536:63 warning Use 'PostHog' instead of 'posthog'. Vale.Terms
563:30 warning Capitalize 'Workflows' for PostHog's product. Use 'workflows' for the general industry concept. PostHogBase.ProductNames
564:30 warning Capitalize 'Workflows' for PostHog's product. Use 'workflows' for the general industry concept. PostHogBase.ProductNames
647:97 warning Use 'PostHog' instead of 'posthog'. Vale.Terms

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant