Skip to content

Copier update: workflow summary#51

Merged
ejfine merged 4 commits intomainfrom
cop-workflow
Mar 31, 2026
Merged

Copier update: workflow summary#51
ejfine merged 4 commits intomainfrom
cop-workflow

Conversation

@ejfine
Copy link
Copy Markdown
Contributor

@ejfine ejfine commented Mar 31, 2026

Pull in upstream template changes.

Also, bump to Python 3.13

Summary by CodeRabbit

  • New Features

    • Claude Code command set added (many project commands for commits, issues, ADRs, tests, refactor, research, etc.).
    • Beads/Dolt local dev database support and an AWS ECR auth GitHub Action.
  • Chores

    • Bumped Python/tooling targets to 3.13 and updated devcontainer, CI, and action versions.
    • Added pre-commit hook and settings merge helper; expanded .gitignore.
  • Documentation

    • Added AGENTS.md, CLAUDE.md and extensive command docs for developer workflows.

@ejfine ejfine self-assigned this Mar 31, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 31, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 879760be-bd48-48e5-9f76-333901e56798

📥 Commits

Reviewing files that changed from the base of the PR and between 69a10c5 and 3c6a65d.

📒 Files selected for processing (1)
  • .copier-answers.yml

📝 Walkthrough

Walkthrough

Adds 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

Cohort / File(s) Summary
Claude agent commands & docs
.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.md, .claude/commands/tdd-review.md
Added many agent-facing command specifications and templates for TDD cycles, issue/ADR workflows, reviews, research, and other agent tasks. Review for policy/content constraints and frontmatter formats.
BEADS / Dolt config & ignore
.claude/.beads/.gitignore, .claude/.beads/config.yaml, .claude/.beads/metadata.json
New BEADS metadata and config pointing to Dolt server beads-dolt / beads_work, plus ignore rules for Dolt artifacts and local JSONL dumps. Validate server/database names and that ignore patterns match repo expectations.
Claude editor settings & permissions
.claude/settings/basics.jsonc, .claude/settings/permissions/bash.jsonc, .claude/settings/permissions/read.jsonc, .claude/settings/permissions/write.jsonc
New Claude Code settings including granular allow/ask/deny bash rules and read/write permissions. Inspect high-risk deny/ask lists for correctness.
Settings merge helper & package
.claude/helpers/merge-claude-settings.sh, .claude/package.json
Added script to merge JSONC settings into settings.json (uses json5 + jq) and package.json pinning json5@2.2.3. Check Node dependency usage and script idempotency.
Devcontainer & local dev infra
.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
Updated base image and Python feature to 3.13.9, added Git LFS, introduced beads-dolt service (dolthub/dolt-sql-server) and volume, added Pulumi skip flag, updated tool pins, and added BEADS init/restore logic in startup scripts. Review container env vars, compose service, and startup sequencing.
CI / GitHub Actions & workflows
.github/actions/ecr-auth/action.yml, .github/actions/install_deps/action.yml, .github/actions/update-devcontainer-hash/action.yml, .github/workflows/ci.yaml, .github/workflows/confirm-on-tagged-copier-template.yaml, .github/workflows/get-values.yaml, .github/workflows/pre-commit.yaml
New ECR auth action, added inputs to install_deps (skip Pulumi), workflow version bumps, new workflow to validate copier _commit tags, and CI gating via skip-duplicate job. Verify action inputs and cross-workflow callers.
Pre-commit, gitignore, tooling config
.pre-commit-config.yaml, .gitignore, .coderabbit.yaml
Bumped pre-commit min version, added local merge-claude-settings hook, expanded .gitignore for Claude/Dolt artifacts, and refined reviewer guidance in coderabbit config.
Python / project metadata
pyproject.toml, ruff.toml, .python-version, .readthedocs.yaml, .copier-answers.yml
Raised Python target to 3.13.9 across configs, updated pydantic and dev deps, bumped Ruff target to py313, and updated copier answers _commit. Confirm CI/tooling compatibility with Python 3.13.9.
Agent/operator docs
AGENTS.md, CLAUDE.md
New operational guidance and a CLAUDE.md pointer to AGENTS.md. Review for policy/usage accuracy.
Small code / tests edits
src/cloud_courier/load_config.py, tests/conftest.py, tests/unit/test_main.py
Minor code tweaks: SSM NextToken uses next_token or ""; pytest fixture type annotations simplified. No functional API 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
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The pull request description is minimal (two short lines) and lacks most required template sections including detailed motivation, how the changes address the issue, side effects, and testing approach. Expand the description to include the missing template sections: explain why the upstream changes are necessary, detail how they address the issue, document any side effects (particularly the Python 3.13 bump), and describe how the changes are tested.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Copier update: workflow summary' accurately describes the main change—pulling upstream template changes and is supported by the extensive modifications to configuration files, workflow files, and Claude-specific command/settings infrastructure.

✏️ 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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between fb454ef and 69a10c5.

⛔ Files ignored due to path filters (2)
  • .claude/package-lock.json is excluded by !**/package-lock.json
  • uv.lock is 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.yaml
  • AGENTS.md
  • CLAUDE.md
  • pyproject.toml
  • ruff.toml
  • src/cloud_courier/load_config.py
  • tests/conftest.py
  • tests/unit/test_main.py

Comment on lines +40 to +49
```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
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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.

Comment on lines +6 to +8
# Create Issues: PRD-Informed Task Planning for TDD

Create structured implementation plan that bridges product thinking (PRD) with test-driven development.
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

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.

Suggested change
# 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.

Comment on lines +22 to +31
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
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

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.

Suggested change
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.

Comment on lines +41 to +45
**User arguments:**

Gap: $ARGUMENTS

**End of user arguments**
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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.

Comment on lines +46 to +49
```
GitHub CLI not available or not authenticated!
Run: gh auth login
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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 -->

Comment on lines +9 to +10
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
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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/null

Using -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.

Suggested change
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.

Comment on lines +10 to +16
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
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

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.

Comment on lines +9 to +12
role-arn:
description: AWS IAM Role ARN to assume for ECR authentication
required: false
default: 'arn:aws:iam::000000000000:role/CoreInfraBaseAccess'
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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:

  1. Making this input required: true with no default, or
  2. 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).

Comment on lines +224 to +233
- 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 }}"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

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"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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:


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.

ejfine added a commit to LabAutomationAndScreening/copier-python-package-template that referenced this pull request Mar 31, 2026
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 -->
@ejfine ejfine merged commit 3d163ec into main Mar 31, 2026
14 checks passed
@ejfine ejfine deleted the cop-workflow branch March 31, 2026 12:50
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