Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdds Claude agent infrastructure, BEADS/Dolt integration, Claude Code settings and permissions, new agent command/workflow docs, devcontainer and CI updates for Python 3.13.9, and helper tooling/scripts to merge settings and initialize BEADS with a Dolt server. Changes
Sequence Diagram(s)sequenceDiagram
participant Devcontainer as "Devcontainer startup"
participant PostStart as "post-start-command.sh"
participant Git as "Git (repo)"
participant BD as "bd (BEADS CLI)"
participant Dolt as "Dolt server (beads-dolt)"
rect rgba(200,200,255,0.5)
Devcontainer->>PostStart: container start triggers post-start
PostStart->>Git: ensure repo safe.directory
PostStart->>Git: run pre-commit merge-claude-settings
PostStart->>BD: run `bd ready`
alt bd ready fails
PostStart->>Git: rm -rf .claude/.beads
PostStart->>BD: bd init --server-host BEADS_DOLT_SERVER_HOST --database BEADS_DOLT_SERVER_DATABASE --skip-hooks --stealth --prefix=work
PostStart->>Git: restore .claude/.beads from HEAD (hooks disabled)
end
PostStart->>Dolt: bd connects to Dolt server at beads-dolt (via env)
Devcontainer->>Dolt: dolt service (docker-compose) provides DB `beads_work`
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 20
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/commands/create-adr.md:
- Around line 40-49: The loop currently prints "Found: $dir" even when there are
no .md files because ls "$dir"/*.md may expand to itself or be empty; change the
logic to verify the presence of markdown files before echoing and listing: for
the for-loop (for dir in doc/adr docs/adr decisions doc/architecture/decisions)
check for matches (e.g., using a glob test like shopt/nullglob or test -n
"$(find "$dir" -maxdepth 1 -name '*.md' -print -quit)") and only then print
"Found: $dir" and list files; replace the ls "$dir"/*.md call with a safe find
invocation (find "$dir" -maxdepth 1 -name '*.md') or the glob existence check to
avoid printing an empty directory header when no .md files exist.
In @.claude/commands/create-issues.md:
- Around line 6-8: Update .claude/commands/create-issues.md to remove or clarify
explicit TDD mentions: change the title "Create Issues: PRD-Informed Task
Planning for TDD" and any occurrences of "TDD" in the description and body
(including the instance around line 164) to either remove the term or add a
single clarifying sentence that the "never explicitly mention TDD" rule applies
only to generated artifacts (not internal docs). Edit the header and the three
content spots referencing TDD so they are consistent with the guideline and
ensure the phrase "Never explicitly mention TDD in code, comments, commits, PRs,
or issues" is referenced only in its intended context.
In @.claude/commands/gap.md:
- Around line 41-45: The "User arguments" block ("**User arguments:**" / "Gap:
$ARGUMENTS") is placed at the end of gap.md but should be positioned
consistently near the top like in red.md and summarize.md; open
.claude/commands/gap.md and move the entire "**User arguments:**" section so it
appears directly after the frontmatter/initial header (same spot used by red.md
and summarize.md), preserving the exact content "Gap: $ARGUMENTS" and
surrounding markers to ensure the agent reads it in the same order as the other
command files.
- Around line 22-31: Remove the stray blank line breaking the numbered list that
begins with "1. **Incomplete implementations**" so item "5. **User requests**"
follows directly after item 4; specifically delete the empty line between items
4 and 5 (the break before "5. **User requests**") so the Markdown renderer
preserves continuous numbering.
In @.claude/commands/issue.md:
- Around line 46-49: The fenced code block in .claude/commands/issue.md
currently lacks a language specifier; update the block that contains "GitHub CLI
not available or not authenticated! Run: gh auth login" to include a language
tag (e.g., change ``` to ```text) so it satisfies markdown lint rules and keeps
formatting consistent with other examples.
In @.claude/commands/red.md:
- Around line 1-4: The frontmatter description in .claude/commands/red.md
contains the phrase "TDD Red Phase", which contradicts the guideline to never
explicitly mention TDD; update the description field (the "description"
frontmatter key) to a neutral phrasing that conveys the intent without saying
"TDD" (e.g., describe the action as "run the initial failing test" or "execute
the red-phase test step") so the command listing/UI no longer references TDD
explicitly.
In @.claude/commands/refactor.md:
- Line 127: The final list item "1. **Consistency check** - Look for
inconsistent patterns, naming conventions, or structure across the codebase" is
truncated; open the file and either complete the checklist entry with the
intended guidance (e.g., describe what to check, examples, and next steps) or
remove/merge it if it was duplicated, ensuring the numbered list is
syntactically and semantically complete and the markdown closes cleanly; locate
the exact line containing "1. **Consistency check** - Look for inconsistent
patterns, naming conventions, or structure across the codebase" and edit that
entry to restore the missing content.
In @.claude/commands/simplify.md:
- Around line 6-14: Add a "Plan File Restriction" section to simplify.md that
mirrors the other command docs: include a header "Plan File Restriction" and a
single rule explicitly prohibiting access to or use of plan.md (e.g., "Do not
read, write, or reference plan.md"). Insert this section where the other common
guidance sections live (after the Output Style block / current guidelines) so
the file matches red.md, summarize.md, and gap.md and consistently enforces the
plan.md restriction.
In @.claude/commands/spike.md:
- Around line 33-103: The "TDD Fundamentals" section is duplicated across the
documents; extract that shared block (the header "TDD Fundamentals" and its
contents) into a single reusable file (e.g., a new _tdd-fundamentals.md) and
replace the duplicate content in spike.md, green.md, and tdd.md with a short
include or reference to the new shared document; ensure you move all bullet
points (Red/Green/Refactor, Core Violations, Incremental Development, Spike
Phase, General Information) into the shared file and update the three originals
to import or link to it so future updates are made in one place.
In @.claude/commands/summarize.md:
- Around line 54-62: Clarify the ambiguous reference to AskUserQuestion by
replacing the generic term with the concrete MCP tool name pattern used
elsewhere: call out the specific tool (e.g., mcp__beads__ask_user_question or
similar mcp__beads__* RPC) and update the line "Use AskUserQuestion to confirm
Beads integration preferences." to explicitly reference that tool; mention the
symbol AskUserQuestion and the preferred naming convention (mcp__beads__*) so
reviewers can locate and standardize the invocation in the Beads Integration
section and related code.
In @.claude/commands/tdd-review.md:
- Around line 2-3: Update the YAML "description" field that currently reads "TDD
anti-patterns" to a phrasing consistent with the rest of the repo (e.g., "test
quality anti-patterns"); specifically replace the phrase in the description key
so it no longer explicitly mentions "TDD", matching the prohibition against
explicit TDD mentions elsewhere and aligning with create-issues.md.
In @.claude/helpers/merge-claude-settings.sh:
- Around line 44-54: The current inline Node script assigned to parsed_json
silently swallows JSON5 parse errors (in the try/catch inside the npx call)
which can mask bad config files; update that catch to write a warning to stderr
including the filename and the actual error (e.g., via console.error with the
file variable and error.message) and then continue to output '{}' so behavior is
preserved; keep the $settings_files splitting behavior as-is if intended, but
ensure the filename variable used in the Node loop is included in the error log
and reference the parsed_json assignment, the JSON5.parse call, and the catch
block to locate the change.
In @.claude/settings/permissions/bash.jsonc:
- Line 15: The rule "Bash(kill *)" is too permissive; remove or replace it with
narrowly scoped entries that only allow safe signals or specific wrappers (e.g.,
permit "Bash(kill -TERM <pid>)" and/or "Bash(kill -HUP <pid>)" or an approved
wrapper command that validates PIDs/process names) and keep the explicit deny
for "kill -9"; update the permission entries so you no longer grant a wildcard
"kill *" but instead list the exact allowed kill forms or wrapper command names
to prevent terminating arbitrary processes.
In @.claude/settings/permissions/read.jsonc:
- Line 3: The NOTE comment referencing "additional-dirs.jsonc" in the
permissions read configuration should be removed or updated because that file
does not exist; either delete the sentence that points to
"additional-dirs.jsonc" from the comment or replace it with correct guidance
(e.g., how to add directory read permissions inline or link to the actual helper
file), and if you prefer to keep the reference instead, create the missing
"additional-dirs.jsonc" helper file with the documented format so the comment is
accurate.
In @.devcontainer/docker-compose.yml:
- Around line 29-35: Add an explicit dependency so the devcontainer service
waits for beads-dolt to start: update the docker-compose service definition for
devcontainer to include a depends_on entry referencing the beads-dolt service;
ensure the comment/intent remains that beads-dolt is pinned to
dolthub/dolt-sql-server:1.83.0 and that any existing fallback in
post-start-command.sh (bd ready / bd init) remains as a safety net rather than
the primary sequencing mechanism.
In @.devcontainer/Dockerfile:
- Around line 9-10: The RUN line currently pipes curl into gpg/tee without
failing on HTTP errors; update the command used in the RUN instruction so that
the GPG fetch fails fast (e.g., add curl -f or enable set -e for the shell) and
handle errors before piping to gpg and tee (so the curl failure will abort the
build rather than producing bad input to gpg/--dearmor for
/etc/apt/keyrings/yarn-archive-keyring.gpg); ensure the commands referenced
(curl, gpg --dearmor, tee) are executed in a way that returns non-zero on
failure so the Docker build stops on key retrieval errors.
In @.devcontainer/post-start-command.sh:
- Around line 10-16: The chained commands using rm -rf .claude/.beads && bd init
... && git -c core.hooksPath=/dev/null restore ... can leave partial state if a
later command fails; change to explicit steps: run rm -rf .claude/.beads, run bd
init and capture its exit status, always attempt git restore afterwards
(regardless of bd init success) and fail the script only if the restore fails
(or implement a cleanup/trap to restore on exit); reference the commands bd
ready, rm -rf .claude/.beads, bd init --server-host="$BEADS_DOLT_SERVER_HOST"
--database="$BEADS_DOLT_SERVER_DATABASE" --skip-hooks --stealth --prefix=work,
and git -c core.hooksPath=/dev/null restore --source=HEAD --staged --worktree
.claude/.beads when making the change.
In @.github/actions/ecr-auth/action.yml:
- Around line 9-12: The input "role-arn" currently has a misleading placeholder
default ARN; update the action metadata to remove the insecure/misleading
default by either setting required: true with no default (so callers must supply
a real ARN) or, if you keep a default for backward compatibility, add an
explicit comment in the action.yml clarifying that the default
'arn:aws:iam::000000000000:role/CoreInfraBaseAccess' is non-functional and must
be overridden; modify the "role-arn" input block accordingly (the unique symbol
to change is role-arn).
In @.github/workflows/ci.yaml:
- Around line 224-233: The step "Mark the required-check as succeeded so the PR
can be merged" uses github.event.pull_request.statuses_url which is not present
for merge_group events; update the step condition to only run when pull_request
data exists (e.g., check github.event.pull_request != null or github.event_name
== 'pull_request') or add a guard that skips the gh api call if
github.event.pull_request.statuses_url is empty; ensure the check references
github.event.pull_request.statuses_url and the step name so the workflow only
attempts the POST when a valid statuses_url is available.
In `@pyproject.toml`:
- Line 10: Confirm whether your codebase depends on the inspect.getsourcelines
regression fix (gh-139783) — search for uses of inspect.getsourcelines or
tooling that introspects decorated functions; if you do rely on that scenario,
keep requires-python = ">=3.13.9" in pyproject.toml, otherwise relax the
constraint to a broader range like ">=3.13" or ">=3.13.0" to increase
compatibility; update pyproject.toml accordingly and add a short comment or
changelog note documenting the rationale referencing inspect.getsourcelines and
gh-139783.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4496dd2e-4e45-4a36-ad01-f36b3772cee2
⛔ Files ignored due to path filters (2)
.claude/package-lock.jsonis excluded by!**/package-lock.jsonuv.lockis excluded by!**/*.lock
📒 Files selected for processing (53)
.claude/.beads/.gitignore.claude/.beads/config.yaml.claude/.beads/metadata.json.claude/commands/add-command.md.claude/commands/commit.md.claude/commands/create-adr.md.claude/commands/create-issues.md.claude/commands/gap.md.claude/commands/green.md.claude/commands/issue.md.claude/commands/polish.md.claude/commands/red.md.claude/commands/refactor.md.claude/commands/research.md.claude/commands/simplify.md.claude/commands/spike.md.claude/commands/summarize.md.claude/commands/tdd-review.md.claude/commands/tdd.md.claude/helpers/merge-claude-settings.sh.claude/package.json.claude/settings/basics.jsonc.claude/settings/permissions/bash.jsonc.claude/settings/permissions/read.jsonc.claude/settings/permissions/write.jsonc.coderabbit.yaml.copier-answers.yml.devcontainer/Dockerfile.devcontainer/devcontainer.json.devcontainer/docker-compose.yml.devcontainer/install-ci-tooling.py.devcontainer/manual-setup-deps.py.devcontainer/on-create-command.sh.devcontainer/post-start-command.sh.github/actions/ecr-auth/action.yml.github/actions/install_deps/action.yml.github/actions/update-devcontainer-hash/action.yml.github/pull_request_template.md.github/workflows/ci.yaml.github/workflows/confirm-on-tagged-copier-template.yaml.github/workflows/get-values.yaml.github/workflows/pre-commit.yaml.gitignore.pre-commit-config.yaml.python-version.readthedocs.yamlAGENTS.mdCLAUDE.mdpyproject.tomlruff.tomlsrc/cloud_courier/load_config.pytests/conftest.pytests/unit/test_main.py
| ```bash | ||
| # Check common ADR directories (in order of preference) | ||
| for dir in doc/adr docs/adr decisions doc/architecture/decisions; do | ||
| if [ -d "$dir" ]; then | ||
| echo "Found: $dir" | ||
| ls "$dir"/*.md 2>/dev/null | ||
| break | ||
| fi | ||
| done | ||
| ``` |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Potential issue: ls glob with no matches returns error.
The command ls "$dir"/*.md 2>/dev/null suppresses errors, but if no .md files exist in the directory, the loop may still print "Found: $dir" without listing any files. Consider adding a check or using find instead for more robust behavior.
More robust alternative
# Check common ADR directories (in order of preference)
for dir in doc/adr docs/adr decisions doc/architecture/decisions; do
if [ -d "$dir" ]; then
echo "Found: $dir"
- ls "$dir"/*.md 2>/dev/null
+ find "$dir" -maxdepth 1 -name "*.md" -type f 2>/dev/null | head -10
break
fi
done🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/commands/create-adr.md around lines 40 - 49, The loop currently
prints "Found: $dir" even when there are no .md files because ls "$dir"/*.md may
expand to itself or be empty; change the logic to verify the presence of
markdown files before echoing and listing: for the for-loop (for dir in doc/adr
docs/adr decisions doc/architecture/decisions) check for matches (e.g., using a
glob test like shopt/nullglob or test -n "$(find "$dir" -maxdepth 1 -name '*.md'
-print -quit)") and only then print "Found: $dir" and list files; replace the ls
"$dir"/*.md call with a safe find invocation (find "$dir" -maxdepth 1 -name
'*.md') or the glob existence check to avoid printing an empty directory header
when no .md files exist.
| # Create Issues: PRD-Informed Task Planning for TDD | ||
|
|
||
| Create structured implementation plan that bridges product thinking (PRD) with test-driven development. |
There was a problem hiding this comment.
Inconsistency: Document mentions TDD despite guideline prohibition.
Lines 14-16 state "Never explicitly mention TDD in code, comments, commits, PRs, or issues," but this document explicitly mentions TDD in the title (Line 6) and description (Lines 2, 8, 164). While this is internal documentation for Claude rather than user-facing output, it may be worth aligning the messaging or clarifying that the prohibition applies only to generated artifacts.
Suggested title revision
-# Create Issues: PRD-Informed Task Planning for TDD
+# Create Issues: PRD-Informed Task Planning-Create structured implementation plan that bridges product thinking (PRD) with test-driven development.
+Create structured implementation plan that bridges product thinking (PRD) with test-first development practices.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # Create Issues: PRD-Informed Task Planning for TDD | |
| Create structured implementation plan that bridges product thinking (PRD) with test-driven development. | |
| # Create Issues: PRD-Informed Task Planning | |
| Create structured implementation plan that bridges product thinking (PRD) with test-first development practices. |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/commands/create-issues.md around lines 6 - 8, Update
.claude/commands/create-issues.md to remove or clarify explicit TDD mentions:
change the title "Create Issues: PRD-Informed Task Planning for TDD" and any
occurrences of "TDD" in the description and body (including the instance around
line 164) to either remove the term or add a single clarifying sentence that the
"never explicitly mention TDD" rule applies only to generated artifacts (not
internal docs). Edit the header and the three content spots referencing TDD so
they are consistent with the guideline and ensure the phrase "Never explicitly
mention TDD in code, comments, commits, PRs, or issues" is referenced only in
its intended context.
| 1. **Incomplete implementations** - Code that was started but not finished | ||
| 2. **Unused variables/results** - Values that were captured but never used | ||
| 3. **Missing tests** - Functionality without test coverage | ||
| 4. **Open issues** - Beads issues that are still open or in progress | ||
|
|
||
| 5. **User requests** - Things the user asked for that weren't fully completed | ||
| 6. **TODO comments** - Any TODOs mentioned in conversation | ||
| 7. **Error handling gaps** - Missing error cases or edge cases | ||
| 8. **Documentation gaps** - Undocumented APIs or features | ||
| 9. **Consistency check** - Look for inconsistent patterns, naming conventions, or structure across the codebase |
There was a problem hiding this comment.
List formatting issue: unexpected break before item 5.
The blank line between items 4 and 5 (line 27) visually breaks the numbered list and may cause some Markdown renderers to restart numbering.
Proposed fix
3. **Missing tests** - Functionality without test coverage
4. **Open issues** - Beads issues that are still open or in progress
-
5. **User requests** - Things the user asked for that weren't fully completed📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| 1. **Incomplete implementations** - Code that was started but not finished | |
| 2. **Unused variables/results** - Values that were captured but never used | |
| 3. **Missing tests** - Functionality without test coverage | |
| 4. **Open issues** - Beads issues that are still open or in progress | |
| 5. **User requests** - Things the user asked for that weren't fully completed | |
| 6. **TODO comments** - Any TODOs mentioned in conversation | |
| 7. **Error handling gaps** - Missing error cases or edge cases | |
| 8. **Documentation gaps** - Undocumented APIs or features | |
| 9. **Consistency check** - Look for inconsistent patterns, naming conventions, or structure across the codebase | |
| 1. **Incomplete implementations** - Code that was started but not finished | |
| 2. **Unused variables/results** - Values that were captured but never used | |
| 3. **Missing tests** - Functionality without test coverage | |
| 4. **Open issues** - Beads issues that are still open or in progress | |
| 5. **User requests** - Things the user asked for that weren't fully completed | |
| 6. **TODO comments** - Any TODOs mentioned in conversation | |
| 7. **Error handling gaps** - Missing error cases or edge cases | |
| 8. **Documentation gaps** - Undocumented APIs or features | |
| 9. **Consistency check** - Look for inconsistent patterns, naming conventions, or structure across the codebase |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/commands/gap.md around lines 22 - 31, Remove the stray blank line
breaking the numbered list that begins with "1. **Incomplete implementations**"
so item "5. **User requests**" follows directly after item 4; specifically
delete the empty line between items 4 and 5 (the break before "5. **User
requests**") so the Markdown renderer preserves continuous numbering.
| **User arguments:** | ||
|
|
||
| Gap: $ARGUMENTS | ||
|
|
||
| **End of user arguments** |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
User arguments section placement is inconsistent with other commands.
In red.md and summarize.md, the user arguments section appears near the top after frontmatter. Here it's at the end of the file. Consider moving it to a consistent location for predictable agent behavior.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/commands/gap.md around lines 41 - 45, The "User arguments" block
("**User arguments:**" / "Gap: $ARGUMENTS") is placed at the end of gap.md but
should be positioned consistently near the top like in red.md and summarize.md;
open .claude/commands/gap.md and move the entire "**User arguments:**" section
so it appears directly after the frontmatter/initial header (same spot used by
red.md and summarize.md), preserving the exact content "Gap: $ARGUMENTS" and
surrounding markers to ensure the agent reads it in the same order as the other
command files.
| ``` | ||
| GitHub CLI not available or not authenticated! | ||
| Run: gh auth login | ||
| ``` |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Add language specifier to fenced code block.
The code block showing the error message should have a language specifier for consistency and to satisfy markdown lint rules.
📝 Proposed fix
-```
+```text
GitHub CLI not available or not authenticated!
Run: gh auth login</details>
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 markdownlint-cli2 (0.22.0)</summary>
[warning] 46-46: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
</details>
<details>
<summary>🤖 Prompt for AI Agents</summary>
Verify each finding against the current code and only fix it if needed.
In @.claude/commands/issue.md around lines 46 - 49, The fenced code block in
.claude/commands/issue.md currently lacks a language specifier; update the block
that contains "GitHub CLI not available or not authenticated! Run: gh auth
login" to include a language tag (e.g., change totext) so it satisfies
markdown lint rules and keeps formatting consistent with other examples.
</details>
<!-- fingerprinting:phantom:poseidon:ocelot:9d433590-4761-4a4e-aaac-74958f34b27e -->
<!-- This is an auto-generated comment by CodeRabbit -->
| RUN rm /etc/apt/sources.list.d/yarn.list || true && \ | ||
| curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider adding error handling for the GPG key download.
The || true on rm is appropriate, but if curl fails silently, the gpg --dearmor step could produce unexpected results. Since this is a temporary workaround, this is acceptable, but you might want to add set -e or explicit error checking to catch failures during key retrieval.
-RUN rm /etc/apt/sources.list.d/yarn.list || true && \
- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null
+RUN rm /etc/apt/sources.list.d/yarn.list || true && \
+ curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/nullUsing -f makes curl return a non-zero exit code on HTTP errors.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| RUN rm /etc/apt/sources.list.d/yarn.list || true && \ | |
| curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null | |
| RUN rm /etc/apt/sources.list.d/yarn.list || true && \ | |
| curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.devcontainer/Dockerfile around lines 9 - 10, The RUN line currently pipes
curl into gpg/tee without failing on HTTP errors; update the command used in the
RUN instruction so that the GPG fetch fails fast (e.g., add curl -f or enable
set -e for the shell) and handle errors before piping to gpg and tee (so the
curl failure will abort the build rather than producing bad input to
gpg/--dearmor for /etc/apt/keyrings/yarn-archive-keyring.gpg); ensure the
commands referenced (curl, gpg --dearmor, tee) are executed in a way that
returns non-zero on failure so the Docker build stops on key retrieval errors.
| if ! bd ready; then | ||
| echo "It's likely the Dolt server has not yet been initialized to support beads, running that now" # TODO: figure out a better way to match this specific scenario than just a non-zero exit code...but beads still seems like in high flux right now so not sure what to tie it to | ||
| # the 'stealth' flag is just the only way I could figure out how to stop it from modifying AGENTS.md...if there's another way to avoid that, then fine. Even without the stealth flag though, files inside the .claude/beads directory get modified, so restoring them at the end to what was set in git...these shouldn't really need to change regularly | ||
| # trying to set 'prefix' to nothing doesn't seem to work (it just acts like the prefix flag wasn't there), so just setting to 'work' as an arbitrary name | ||
| # for some reason, the envvar for the server host isn't being picked up normally, so just passing it explicitly here | ||
| rm -rf .claude/.beads && bd init --server-host="$BEADS_DOLT_SERVER_HOST" --database="$BEADS_DOLT_SERVER_DATABASE" --skip-hooks --stealth --prefix=work </dev/null && git -c core.hooksPath=/dev/null restore --source=HEAD --staged --worktree .claude/.beads | ||
| fi |
There was a problem hiding this comment.
Command chain on line 15 could leave partial state on failure.
The &&-chained commands (rm -rf, bd init, git restore) will stop at the first failure, but the preceding commands' effects persist. If bd init succeeds but git restore fails, .claude/.beads will contain the bd init output rather than the expected HEAD state.
Consider splitting into separate commands with explicit error handling, or document that this is acceptable given the retry-on-next-start nature of this script.
Alternative: explicit error handling
- rm -rf .claude/.beads && bd init --server-host="$BEADS_DOLT_SERVER_HOST" --database="$BEADS_DOLT_SERVER_DATABASE" --skip-hooks --stealth --prefix=work </dev/null && git -c core.hooksPath=/dev/null restore --source=HEAD --staged --worktree .claude/.beads
+ rm -rf .claude/.beads
+ if bd init --server-host="$BEADS_DOLT_SERVER_HOST" --database="$BEADS_DOLT_SERVER_DATABASE" --skip-hooks --stealth --prefix=work </dev/null; then
+ git -c core.hooksPath=/dev/null restore --source=HEAD --staged --worktree .claude/.beads
+ else
+ echo "bd init failed, beads may not be available"
+ fi🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.devcontainer/post-start-command.sh around lines 10 - 16, The chained
commands using rm -rf .claude/.beads && bd init ... && git -c
core.hooksPath=/dev/null restore ... can leave partial state if a later command
fails; change to explicit steps: run rm -rf .claude/.beads, run bd init and
capture its exit status, always attempt git restore afterwards (regardless of bd
init success) and fail the script only if the restore fails (or implement a
cleanup/trap to restore on exit); reference the commands bd ready, rm -rf
.claude/.beads, bd init --server-host="$BEADS_DOLT_SERVER_HOST"
--database="$BEADS_DOLT_SERVER_DATABASE" --skip-hooks --stealth --prefix=work,
and git -c core.hooksPath=/dev/null restore --source=HEAD --staged --worktree
.claude/.beads when making the change.
| role-arn: | ||
| description: AWS IAM Role ARN to assume for ECR authentication | ||
| required: false | ||
| default: 'arn:aws:iam::000000000000:role/CoreInfraBaseAccess' |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Document or reconsider the placeholder default for role-arn.
The default arn:aws:iam::000000000000:role/CoreInfraBaseAccess uses a placeholder account ID. While this ensures callers must override it with a real ARN, having any default at all for security-sensitive credentials could be misleading. Consider either:
- Making this input
required: truewith no default, or - Adding a comment clarifying that the default is non-functional and must be overridden.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/actions/ecr-auth/action.yml around lines 9 - 12, The input
"role-arn" currently has a misleading placeholder default ARN; update the action
metadata to remove the insecure/misleading default by either setting required:
true with no default (so callers must supply a real ARN) or, if you keep a
default for backward compatibility, add an explicit comment in the action.yml
clarifying that the default 'arn:aws:iam::000000000000:role/CoreInfraBaseAccess'
is non-functional and must be overridden; modify the "role-arn" input block
accordingly (the unique symbol to change is role-arn).
| - name: Mark the required-check as succeeded so the PR can be merged | ||
| if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }} | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| run: | | ||
| gh api \ | ||
| -X POST -H "Accept: application/vnd.github.v3+json" \ | ||
| "${{ github.event.pull_request.statuses_url }}" \ | ||
| -f state=success -f context="required-check" -f description="✅ All required checks passed in the job triggered by pull_request" \ | ||
| -f target_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" |
There was a problem hiding this comment.
Mark required-check status only when statuses_url is available.
github.event.pull_request.statuses_url is only available for pull_request events, not merge_group. The condition includes merge_group, but the API call uses pull_request.statuses_url which will be null/empty for merge queue runs, causing the step to fail.
Proposed fix
- name: Mark the required-check as succeeded so the PR can be merged
- if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
+ if: ${{ github.event_name == 'pull_request' && github.event.pull_request.statuses_url != '' }}
env:
GH_TOKEN: ${{ github.token }}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/ci.yaml around lines 224 - 233, The step "Mark the
required-check as succeeded so the PR can be merged" uses
github.event.pull_request.statuses_url which is not present for merge_group
events; update the step condition to only run when pull_request data exists
(e.g., check github.event.pull_request != null or github.event_name ==
'pull_request') or add a guard that skips the gh api call if
github.event.pull_request.statuses_url is empty; ensure the check references
github.event.pull_request.statuses_url and the step name so the workflow only
attempts the POST when a valid statuses_url is available.
| ] | ||
| readme = "README.md" | ||
| requires-python = ">=3.12.7" | ||
| requires-python = ">=3.13.9" |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
🧩 Analysis chain
🌐 Web query:
What is the latest Python 3.13 version and what changes were introduced in Python 3.13.9?
💡 Result:
The latest version of Python 3.13 is 3.13.12, released on February 3, 2026. Python 3.13.9, released on October 14, 2025, is a maintenance release that fixed one specific regression from 3.13.8: gh-139783: Fix inspect.getsourcelines for the case when a decorator is followed by a comment or an empty line. There are no other changes in 3.13.9 compared to 3.13.8.
Citations:
- 1: https://www.python.org/downloads/latest/python3.13/
- 2: https://docs.python.org/3.13/whatsnew/changelog.html
- 3: https://www.python.org/downloads/release/python-31312/
- 4: https://www.python.org/downloads/release/python-3139/
- 5: https://blog.python.org/2025/10/python-3139-is-now-available/
- 6: https://docs.python.org/release/3.13.9/whatsnew/changelog.html
- 7: https://discuss.python.org/t/python-3-13-9-released/104362
Verify whether the inspect.getsourcelines regression fix is needed.
Python 3.13.9 (released October 2025) fixed a specific regression (gh-139783) in inspect.getsourcelines when decorators are followed by comments or empty lines. The requires-python = ">=3.13.9" constraint is justified if your codebase relies on this fix. If your project doesn't use inspect.getsourcelines or doesn't depend on this specific scenario, consider relaxing the constraint to >=3.13 or >=3.13.0 to accommodate more users.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pyproject.toml` at line 10, Confirm whether your codebase depends on the
inspect.getsourcelines regression fix (gh-139783) — search for uses of
inspect.getsourcelines or tooling that introspects decorated functions; if you
do rely on that scenario, keep requires-python = ">=3.13.9" in pyproject.toml,
otherwise relax the constraint to a broader range like ">=3.13" or ">=3.13.0" to
increase compatibility; update pyproject.toml accordingly and add a short
comment or changelog note documenting the rationale referencing
inspect.getsourcelines and gh-139783.
Pull in upstream template changes Tested in downstream repos, including LabAutomationAndScreening/cloud-courier#51 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **New Features** * Enhanced CI/CD pipeline with duplicate pull request detection to prevent redundant checks * Added template version validation workflow for release tag enforcement * **Chores** * Updated devcontainer base image and VS Code extensions to latest versions * Updated development tool dependencies (pnpm, Pulumi, and related packages) * Improved GitHub CLI permission rules for enhanced security controls * Added optional Pulumi CLI installation skipping for faster setup * **Documentation** * Expanded developer testing guidelines with isolation patterns and mock/spy assertions * Enhanced tooling best practices with explicit command execution preferences <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Pull in upstream template changes.
Also, bump to Python 3.13
Summary by CodeRabbit
New Features
Chores
Documentation