Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
841fb13
feat: add PR preview deployments via Cloudflare Pages
Aureliolo Mar 11, 2026
ddad993
fix: address review findings — security hardening and consistency
Aureliolo Mar 11, 2026
a7ddb81
fix: rename Cloudflare Pages project to match existing project
Aureliolo Mar 11, 2026
532bcbf
fix: address PR review feedback — concurrency, pagination, head SHA
Aureliolo Mar 11, 2026
8fd59de
fix: incorporate PR review feedback and rename Cloudflare project
Aureliolo Mar 11, 2026
0785644
fix: address 8 PR review findings from local agents and external revi…
Aureliolo Mar 11, 2026
c42cbea
fix: restore correct griffe-compatible docstring indentation
Aureliolo Mar 11, 2026
e809aeb
fix: address round 2 reviewer feedback — SHA consistency, stable URLs…
Aureliolo Mar 11, 2026
bafe318
docs: add barebones user guide alongside developer setup
Aureliolo Mar 11, 2026
7aee04b
fix: address round 3 reviewer feedback — cleanup comment, pagination,…
Aureliolo Mar 11, 2026
208a9a5
feat: add commit SHA and dynamic build age to preview banner
Aureliolo Mar 11, 2026
c28baab
docs: add template option to user guide, de-emphasize raw YAML
Aureliolo Mar 11, 2026
78c5219
docs: add grid cards for user/dev paths, lead user guide with Docker
Aureliolo Mar 11, 2026
35222d5
docs: simplify user guide — all config via dashboard, add WIP disclaimer
Aureliolo Mar 11, 2026
632f175
fix: remove dead placeholder links from user guide
Aureliolo Mar 11, 2026
8e41d35
fix: landing page links to user guide, Docker commands, templates in …
Aureliolo Mar 11, 2026
f3e43ba
docs: render design spec in docs site, fix landing page links and mes…
Aureliolo Mar 11, 2026
c05a276
fix: Safari ISO timestamp compatibility and add job timeouts
Aureliolo Mar 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 183 additions & 0 deletions .github/workflows/pages-preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
name: PR Preview

on:
pull_request:
branches: [main]
paths:
- "docs/**"
- "site/**"
- "mkdocs.yml"
- "src/ai_company/**"
- ".github/workflows/pages-preview.yml"
Comment thread
greptile-apps[bot] marked this conversation as resolved.

permissions: {}

concurrency:
group: "pages-preview-${{ github.event.pull_request.number }}"
cancel-in-progress: true

jobs:
build:
name: Build Preview
runs-on: ubuntu-latest
Comment thread
greptile-apps[bot] marked this conversation as resolved.
permissions:
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actions/checkout on pull_request defaults to checking out the PR merge commit (github.sha). In this workflow the PR comment reports pull_request.head.sha, which can diverge from what was actually built/deployed. To keep the deployed artifact and reported SHA consistent, either (a) set ref on the checkout step to github.event.pull_request.head.sha, or (b) keep building the merge commit but update the comment to report context.sha (and/or both SHAs).

Suggested change
persist-credentials: false
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha }}

Copilot uses AI. Check for mistakes.

# --- MkDocs (documentation at /docs) ---
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.14"
allow-prereleases: true

- name: Install uv
uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1

- name: Install docs dependencies
run: uv sync --group docs --no-dev

- name: Build MkDocs
run: uv run mkdocs build --strict

# --- Astro (landing page at /) ---
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "22"

Comment on lines +51 to +55

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

npm dependency cache not configured in either Node.js setup step

Both setup-node calls in the workflow (here in build and again in deploy-preview at line 151) omit the cache input, so npm ci downloads Astro's entire dependency tree fresh on every PR push. For a preview workflow triggered on every synchronize event, this adds avoidable latency and bandwidth.

Adding cache: 'npm' (which keys on package-lock.json) is a one-liner:

Suggested change
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "22"
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "22"
cache: 'npm'
cache-dependency-path: site/package-lock.json

The same change applies to the deploy-preview job's setup-node step at line 151. astral-sh/setup-uv similarly supports an enable-cache option that would cache Python package downloads between runs.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/pages-preview.yml
Line: 50-54

Comment:
**npm dependency cache not configured in either Node.js setup step**

Both `setup-node` calls in the workflow (here in `build` and again in `deploy-preview` at line 151) omit the `cache` input, so `npm ci` downloads Astro's entire dependency tree fresh on every PR push. For a preview workflow triggered on every `synchronize` event, this adds avoidable latency and bandwidth.

Adding `cache: 'npm'` (which keys on `package-lock.json`) is a one-liner:

```suggestion
      - name: Set up Node.js
        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
        with:
          node-version: "22"
          cache: 'npm'
          cache-dependency-path: site/package-lock.json
```

The same change applies to the `deploy-preview` job's `setup-node` step at line 151. `astral-sh/setup-uv` similarly supports an `enable-cache` option that would cache Python package downloads between runs.

How can I resolve this? If you propose a fix, please make it concise.

- name: Install Astro dependencies
working-directory: site
run: npm ci

- name: Build Astro
working-directory: site
run: npm run build

# --- Merge outputs ---
- name: Merge Astro + MkDocs into final output
run: |
# Guard against Astro accidentally producing a docs/ route
if [ -d "site/dist/docs" ]; then
echo "::error::Astro output contains 'docs/' directory which would overwrite MkDocs output"
exit 1
fi
# Astro output goes to root (use /. to avoid glob edge cases)
cp -r site/dist/. _site/
# MkDocs output is already at _site/docs/ from the build step

# --- Inject preview banner ---
- name: Inject preview banner
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
python3 << 'PYEOF'
import os, pathlib, re

pr_number = os.environ["PR_NUMBER"]
style = (
"background:linear-gradient(90deg,#f59e0b,#d97706);"
"color:#000;text-align:center;padding:10px 16px;"
"font-weight:600;font-size:14px;position:sticky;"
"top:0;z-index:9999;"
"box-shadow:0 2px 4px rgba(0,0,0,0.15)"
)
banner = (
f'<div style="{style}">'
f"Development Preview &mdash; PR #{pr_number}"
f" &mdash; Not a release version"
f"</div>"
)
count = 0
for f in pathlib.Path("_site").rglob("*.html"):
text = f.read_text(encoding="utf-8")
updated = re.sub(r"(<body[^>]*>)", lambda m: m.group(1) + banner, text, count=1)
if updated != text:
f.write_text(updated, encoding="utf-8")
count += 1
print(f"Injected preview banner into {count} HTML files")
Comment on lines +124 to +128

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The banner injection step logs how many HTML files were updated, but it never fails the build if count ends up as 0 (e.g., if the <body> regex doesn’t match). Since the banner is a key safety/UX signal for previews, consider failing the job when no files were modified (and/or make the <body> match case-insensitive) so a regression doesn’t silently ship an un-bannered preview.

Suggested change
updated = re.sub(r"(<body[^>]*>)", lambda m: m.group(1) + banner, text, count=1)
if updated != text:
f.write_text(updated, encoding="utf-8")
count += 1
print(f"Injected preview banner into {count} HTML files")
updated = re.sub(r"(?i)(<body[^>]*>)", lambda m: m.group(1) + banner, text, count=1)
if updated != text:
f.write_text(updated, encoding="utf-8")
count += 1
print(f"Injected preview banner into {count} HTML files")
if count == 0:
raise SystemExit("No HTML files were modified with the preview banner; failing build to avoid un-bannered preview.")

Copilot uses AI. Check for mistakes.
PYEOF

- name: Upload preview artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
Comment on lines +131 to +132

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Artifact upload/download major-version mismatch

actions/upload-artifact is pinned to # v7 but actions/download-artifact (line 121) is pinned to # v8. GitHub's artifact service uses a different internal format per major version — uploading with v7 and downloading with v8 (or vice versa) will result in the download step failing with "Artifact not found" or a format incompatibility error.

Both actions should reference the same major version. Pin both to the same version (typically the latest: both at v4, or both at whichever major version you intend):

Suggested change
- name: Upload preview artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
- name: Upload preview artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7

Fix: Update the download-artifact pin on line 121 to the same v7 SHA/tag used here, or update both to a consistent version.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/pages-preview.yml
Line: 104-105

Comment:
**Artifact upload/download major-version mismatch**

`actions/upload-artifact` is pinned to `# v7` but `actions/download-artifact` (line 121) is pinned to `# v8`. GitHub's artifact service uses a different internal format per major version — uploading with v7 and downloading with v8 (or vice versa) will result in the download step failing with "Artifact not found" or a format incompatibility error.

Both actions should reference the same major version. Pin both to the same version (typically the latest: both at v4, or both at whichever major version you intend):

```suggestion
      - name: Upload preview artifact
        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
```

> **Fix:** Update the `download-artifact` pin on line 121 to the same v7 SHA/tag used here, or update both to a consistent version.

How can I resolve this? If you propose a fix, please make it concise.

with:
name: preview-site
path: _site
retention-days: 5

deploy-preview:
name: Deploy Preview
needs: build
if: github.event.pull_request.head.repo.full_name == github.repository
Comment thread
greptile-apps[bot] marked this conversation as resolved.
runs-on: ubuntu-latest
permissions:
contents: read

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment preview URL uses github.rest.issues.* endpoints to list/update/create an issue comment, but this job only requests pull-requests: write. Grant issues: write (or replace pull-requests: write with issues: write) so the GITHUB_TOKEN can manage PR comments reliably.

Suggested change
contents: read
contents: read
issues: write

Copilot uses AI. Check for mistakes.
pull-requests: write

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This job uses the Issues API (issues.listComments, issues.updateComment, issues.createComment) to manage the PR comment, but the job permissions only grant pull-requests: write. With fine-grained workflow permissions, comment endpoints generally require issues: write; consider adding it here to avoid 403s when posting/updating the preview URL comment.

Suggested change
pull-requests: write
pull-requests: write
issues: write

Copilot uses AI. Check for mistakes.

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

deploy-preview uses github.rest.issues.* (listComments/updateComment/createComment), but the job permissions only grant pull-requests: write. With top-level permissions: {}, this can lead to 403s because issue comments typically require issues: write. Add issues: write (and drop pull-requests: write if it’s no longer needed) so the preview URL comment can be created/updated reliably.

Suggested change
pull-requests: write
issues: write

Copilot uses AI. Check for mistakes.
steps:
- name: Download preview artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: preview-site
path: _site

- name: Deploy to Cloudflare Pages
id: deploy
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
npm i --no-save wrangler@3 > /dev/null 2>&1
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Outdated
DEPLOY_OUTPUT=$(npx wrangler pages deploy _site --project-name=synthorg-pr-preview --branch="pr-${PR_NUMBER}" 2>&1)
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Outdated
echo "$DEPLOY_OUTPUT"

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deploy to Cloudflare Pages uses npm/npx but the deploy-preview job doesn’t set up/pin Node like the build job does. Add an explicit actions/setup-node step (matching the Node version used in build) to keep deployments reproducible and avoid failures if the runner image changes.

Copilot uses AI. Check for mistakes.
DEPLOY_URL=$(echo "$DEPLOY_OUTPUT" | grep -oP 'https://[^\s]+\.pages\.dev' | tail -1)

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

URL extraction uses grep ... | tail -1 under the default bash -eo pipefail runner shell; if grep finds no match, it exits 1 and the whole deploy step fails before the later “skip comment if no URL” logic can run. Make the extraction tolerant (e.g., || true) or avoid parsing by constructing the deterministic Pages URL from PR_NUMBER/project name or using a structured/JSON output flag if available.

Suggested change
DEPLOY_URL=$(echo "$DEPLOY_OUTPUT" | grep -oP 'https://[^\s]+\.pages\.dev' | tail -1)
DEPLOY_URL="https://pr-${PR_NUMBER}.synthorg-pr-preview.pages.dev"

Copilot uses AI. Check for mistakes.
echo "deployment-url=${DEPLOY_URL}" >> "$GITHUB_OUTPUT"
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Outdated
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

- name: Comment preview URL
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }}
with:
script: |
const url = process.env.DEPLOY_URL || '';
if (!url) {
console.log('No deployment URL found — skipping comment');
return;
}
const headSha = context.payload?.pull_request?.head?.sha || context.sha;
const body = [
'## Preview Deployment',
'',
`**URL:** ${url}`,
'',
`Built from commit \`${headSha.substring(0, 7)}\``,
].join('\n');
Comment thread
coderabbitai[bot] marked this conversation as resolved.

const comments = await github.paginate(
github.rest.issues.listComments,
{
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
per_page: 100,
}
);
const existing = comments.find(c => c.body?.includes('## Preview Deployment'));
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body,
});
}
Comment on lines +138 to +212

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

What is the latest version of Cloudflare wrangler npm package?

💡 Result:

The latest version of the Cloudflare wrangler npm package is 4.71.0. [1]


Update wrangler to the latest major version or document the reason for staying on 3.x.

Deploy job addresses all previous review feedback:

  • Fork PR guard prevents secret exposure
  • Stable branch alias URL construction (not scraped from output)
  • Unique marker + bot-author check for comment matching
  • Paginated comment listing

However, wrangler is pinned to 3.114.17 while the latest available version is 4.71.0. Using an outdated major version may miss security updates, bug fixes, and new features. Either upgrade to version 4.x or add a comment explaining the reason for pinning to 3.x.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pages-preview.yml around lines 136 - 209, The Deploy to
Cloudflare Pages step currently installs wrangler@3.114.17 (see the run block
that runs "npm i ... wrangler@3.114.17" and then "npx wrangler pages deploy");
update that install to a current 4.x release (e.g., wrangler@4.71.0) and verify
the CLI invocation (npx wrangler pages deploy) still works with v4, or if you
intentionally must stay on 3.x, add an inline comment in the same Deploy to
Cloudflare Pages step explaining the reason for pinning to 3.x
(compatibility/security/regression test) and reference the chosen 3.x version
and a plan/tracker issue for when it will be upgraded.

1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ src/ai_company/

- **Jobs**: lint (ruff) + type-check (mypy src/ tests/) + test (pytest + coverage) run in parallel → ci-pass (gate)
- **Pages**: `.github/workflows/pages.yml` — builds Astro landing + MkDocs docs, merges, deploys to GitHub Pages on push to main
- **PR Preview**: `.github/workflows/pages-preview.yml` — builds site on PRs (same path triggers as Pages), injects "Development Preview" banner, deploys to Cloudflare Pages (`synthorg-pr-preview` project) via wrangler CLI. Each PR gets a unique preview URL at `pr-<number>.synthorg-pr-preview.pages.dev`. Requires `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` secrets. Build job runs regardless (catches build failures); deploy job skips on fork PRs (no secrets access). Concurrency group cancels stale builds on rapid pushes.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This line is very long (over 450 characters), which makes it difficult to read and maintain. For better readability, consider breaking this down into a nested list that details the different aspects of the PR Preview workflow.

Suggested change
- **PR Preview**: `.github/workflows/pages-preview.yml` — builds site on PRs (same path triggers as Pages), injects "Development Preview" banner, deploys to Cloudflare Pages (`synthorg-pr-preview` project) via wrangler CLI. Each PR gets a unique preview URL at `pr-<number>.synthorg-pr-preview.pages.dev`. Requires `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` secrets. Build job runs regardless (catches build failures); deploy job skips on fork PRs (no secrets access). Concurrency group cancels stale builds on rapid pushes.
- **PR Preview**: `.github/workflows/pages-preview.yml`
- Builds site on PRs (same path triggers as Pages), injects a "Development Preview" banner, and deploys to Cloudflare Pages (`synthorg-pr-preview` project) via wrangler CLI.
- Each PR gets a unique preview URL at `pr-<number>.synthorg-pr-preview.pages.dev`.
- Requires `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` secrets.
- The build job runs on all PRs to catch build failures, while the deploy job skips on fork PRs (no secrets access).
- A concurrency group is used to cancel stale builds on rapid pushes.

- **Docker**: `.github/workflows/docker.yml` — builds backend + web images, pushes to GHCR, signs with cosign. Scans: Trivy (CRITICAL = hard fail, HIGH = warn-only) + Grype (critical cutoff). CVE triage via `.github/.trivyignore.yaml` and `.github/.grype.yaml`. Images only pushed after scans pass. Triggers on push to main and version tags (`v*`).
- **Matrix**: Python 3.14
- **Dependabot**: daily uv + github-actions + docker updates, grouped minor/patch, no auto-merge
Expand Down
6 changes: 3 additions & 3 deletions docs/getting_started.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,6 @@ VS Code should auto-detect the `.venv` directory. If not, use **Python: Select I

## Next Steps

- [CONTRIBUTING.md](../.github/CONTRIBUTING.md) — branch, commit, and PR workflow
- [CLAUDE.md](../CLAUDE.md) — code conventions and quick command reference
- [DESIGN_SPEC.md](../DESIGN_SPEC.md) — full high-level design specification
- [CONTRIBUTING.md](https://github.com/Aureliolo/synthorg/blob/main/.github/CONTRIBUTING.md) — branch, commit, and PR workflow
- [CLAUDE.md](https://github.com/Aureliolo/synthorg/blob/main/CLAUDE.md) — code conventions and quick command reference
- [DESIGN_SPEC.md](https://github.com/Aureliolo/synthorg/blob/main/DESIGN_SPEC.md) — full high-level design specification

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using absolute URLs pointing to the main branch can be problematic for documentation, as viewers on other branches or tags will be directed to content that may not match their version.

A more robust approach is to make these documentation assets part of the mkdocs build. You can copy these files into the docs directory during your CI build process and then use standard relative links. This ensures the documentation is self-contained and version-correct.

For example, you could add a step in your .github/workflows/pages-preview.yml and .github/workflows/pages.yml workflows:

- name: Copy root markdown files to docs
  run: |
    cp .github/CONTRIBUTING.md docs/
    cp CLAUDE.md docs/
    cp DESIGN_SPEC.md docs/

With that change, you can update the links in this file to be relative, as suggested.

Suggested change
- [CONTRIBUTING.md](https://github.com/Aureliolo/synthorg/blob/main/.github/CONTRIBUTING.md) — branch, commit, and PR workflow
- [CLAUDE.md](https://github.com/Aureliolo/synthorg/blob/main/CLAUDE.md) — code conventions and quick command reference
- [DESIGN_SPEC.md](https://github.com/Aureliolo/synthorg/blob/main/DESIGN_SPEC.md) — full high-level design specification
- [CONTRIBUTING.md](CONTRIBUTING.md) — branch, commit, and PR workflow
- [CLAUDE.md](CLAUDE.md) — code conventions and quick command reference
- [DESIGN_SPEC.md](DESIGN_SPEC.md) — full high-level design specification

2 changes: 1 addition & 1 deletion src/ai_company/communication/messenger.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ async def receive(
- *timeout* expires without a message arriving.
- The bus is shut down while waiting.
- The subscription is cancelled via :meth:`unsubscribe`
while a ``receive()`` call is in flight.
while a ``receive()`` call is in flight.

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docstring list continuation is over-indented compared to the corresponding docstring in communication/bus_memory.py (which uses a 2-space continuation under the bullet). With the extra indentation here, some doc renderers treat the continuation as a nested block/code block. Align the while a ``receive()``... line indentation with the bullet text continuation (as in bus_memory.py).

Suggested change
while a ``receive()`` call is in flight.
while a ``receive()`` call is in flight.

Copilot uses AI. Check for mistakes.
"""
return await self._bus.receive(
channel_name,
Expand Down
Loading