Skip to content

Conversation

@ejfine
Copy link
Contributor

@ejfine ejfine commented Dec 20, 2025

Why is this change necessary?

Try and hash the app webpage files better so there's not so many false positive diffs

How does this change address the issue?

New way of ensuring that path differences between local dev and CI don't cause false positive diffs

What side effects does this change have?

N/A

How is this change tested?

Downstream repo

Other

Also pulled in upstream copier template changes for ty

Summary by CodeRabbit

  • Dependencies & Tooling

    • Bumped many CI, pre-commit, and package versions for improved compatibility; added a new lightweight runtime dependency.
  • Chores

    • Improved CI error handling and diagnostics on pre-commit failures; tightened shell script error settings.
    • Updated development tooling and static-analysis exclusion patterns.
  • Configuration

    • Added new config entries including python_version and two public feature flags.

✏️ Tip: You can customize this high-level summary in your review settings.

@ejfine ejfine self-assigned this Dec 20, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 20, 2025

Walkthrough

Updates across templates, CI, tooling, and config: version bumps for many tools/actions/hooks, new copier and template config keys (python_version, async/vcrpy toggles), dependency spec format changes, stricter shell error handling, updated exclusion patterns, added ty configuration, and minor test-data whitespace edits.

Changes

Cohort / File(s) Summary
Copier & template config
.copier-answers.yml, copier.yml, template/*copier*
Bumps _commit (v0.0.87→v0.0.91); adds template_might_want_to_use_python_asyncio: false and template_might_want_to_use_vcrpy: false; adds python_version config default "3.12.7".
Devcontainer tooling & scripts
.devcontainer/devcontainer.json, .devcontainer/install-ci-tooling.py, .devcontainer/windows-host-helper.sh, template/.devcontainer/*
Extension bump coderabbit-vscode 0.16.0→0.16.1; updates installer version constants and copier spec formatting; switches set -eset -euo pipefail in Windows helper scripts.
GitHub Actions (workflows & actions)
.github/workflows/*, .github/actions/*, template/.github/*
Bumps multiple action minor versions (checkout, setup-python, setup-node, configure-aws-credentials, cache, pre-commit); converts some job needs from short to block form; adds id-token permission and enhanced pre-commit failure handling (exit-code capture, git diff).
Pre-commit / hook revisions
.pre-commit-config.yaml, template/.pre-commit-config.yaml
Updates many hook revisions (typos, prettier, ruff, pylint, pyright, hadolint, etc.); adjusts exclude patterns from .*/graphql_codegen/.*.*/generated/graphql/.*.
Type checker / exclusions
pyrightconfig.json, template/pyrightconfig.json, template/ty.toml, ty.toml
Replaces **/graphql_codegen exclusion with **/generated/graphql; adds **/copier_template_resources; adds ty.toml/template src.exclude patterns for caches, venvs, generated folders, node_modules, vendor.
Dependency/version context
extensions/context.py, pyproject.toml, template/infrastructure/pyproject.toml.jinja, template/{% if has_backend %}graphql_lambda{% endif %}/pyproject.toml.jinja
Broad version updates and new keys (ty_version, vcrpy_version, pytest_asyncio_version, pytest_recording_version, graphql_tools_mock_version); changes many exact pins to range/specifier formats; pins copier and copier-template-extensions to == in pyproject; adds ty dependency.
Infrastructure / S3 asset upload
template/infrastructure/src/infrastructure/program.py
Adds source_hash (MD5 of file contents) and tags (common_tags()) to BucketObjectv2 creation for uploaded assets.
Templates & CI templating changes
template/.devcontainer/install-ci-tooling.py.jinja, template/.devcontainer/devcontainer.json.jinja, template/.github/workflows/ci.yaml.jinja, template/*.jinja
Mirrors root changes: installer spec format changes, extension bumps, workflow dependency formatting and conditional needs rework, templated dependency formatting adjustments.
Tests / test data
tests/copier_data/data1.yaml, tests/copier_data/data2.yaml
Whitespace-only edits: inserted extra blank lines; no structural/data changes.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Pay attention to extensions/context.py (many version/specifier changes and new keys).
  • Verify consistent exclude-pattern updates across .pre-commit-config.yaml, pyrightconfig.json, and template files.
  • Confirm dependency-spec format changes in templated pyproject files are valid for the intended tooling (templating + packaging).
  • Inspect CI workflow needs restructuring and pre-commit failure handling for correct sequencing and exit behavior.

Possibly related PRs

  • Deploy in CI #9 — Modifies the same CI workflow template and job dependency patterns; overlapping changes to template/.github/workflows/ci.yaml.jinja.
  • Create resources outside of apply #6 — Touches template/infrastructure/src/infrastructure/program.py and S3 asset creation/upload logic related to BucketObjectv2.
  • Copier update (CI timeouts) #4 — Overlaps on template and tooling updates (copier.yml, devcontainer scripts, extensions/context.py, and workflow/tooling version bumps).

Pre-merge checks

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'Source hash' is vague and lacks specificity; it doesn't clearly convey what the main change accomplishes or why it matters. Consider revising the title to be more descriptive, such as 'Add source hash to S3 object uploads for better change detection' or 'Implement file hashing to reduce false-positive infrastructure diffs'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description covers all required sections from the template with substantive content explaining the purpose, solution, testing approach, and additional context.

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bba4b12 and 67b8e3b.

📒 Files selected for processing (1)
  • template/.github/workflows/ci.yaml.jinja (3 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: lint-matrix (ubuntu-24.04, 3.13.2, --data-file tests/copier_data/data2.yaml)
  • GitHub Check: lint-matrix (ubuntu-24.04, 3.12.7, --data-file tests/copier_data/data2.yaml)
  • GitHub Check: lint-matrix (ubuntu-24.04, 3.12.7, --data-file tests/copier_data/data1.yaml)
  • GitHub Check: lint-matrix (ubuntu-24.04, 3.13.2, --data-file tests/copier_data/data1.yaml)
🔇 Additional comments (3)
template/.github/workflows/ci.yaml.jinja (3)

25-26: LGTM!

The multi-line format for needs improves consistency with other jobs in the workflow.


65-66: LGTM!

Consistent formatting with other jobs in the workflow.


109-120: LGTM!

The updated failure-check logic correctly validates all job dependencies:

  • Adding get-values to needs ensures its outputs are accessible (used on line 124).
  • The explicit result checks for each job are comprehensive.
  • Allowing skipped for pulumi-prod is correct since it has a conditional if clause that may legitimately skip it.
  • Transitive failures (e.g., lint failure causing build-app-frontend to be skipped) are properly caught since skipped jobs won't have result == 'success'.

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

@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: 6

♻️ Duplicate comments (3)
template/.github/actions/install_deps/action.yml (1)

61-61: Verify the GitHub Actions versions exist and check for security advisories.

Ensure that the following action versions are valid, secure, and free from vulnerabilities:

Note: This is identical to the change in .github/actions/install_deps/action.yml. The verification script from that file's review can be used to verify these versions as well.

Also applies to: 67-67, 78-78

.github/actions/update-devcontainer-hash/action.yml (1)

30-30: Verify the GitHub Actions version exists and check for security advisories.

Ensure that actions/[email protected] is a valid, secure version with no known vulnerabilities.

Note: This is the same version bump as in template/.github/workflows/get-values.yaml. The verification script from that file's review can be used to verify this version as well.

template/.github/workflows/pulumi-aws.yml (1)

111-111: Verify the GitHub Actions version exists and check for security advisories.

Ensure that actions/[email protected] is a valid, secure version with no known vulnerabilities.

Note: This is the same version bump as in template/.github/workflows/get-values.yaml and .github/actions/update-devcontainer-hash/action.yml. The verification script from those files' reviews can be used to verify this version as well.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8145150 and bba4b12.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (34)
  • .copier-answers.yml (2 hunks)
  • .devcontainer/devcontainer.json (2 hunks)
  • .devcontainer/install-ci-tooling.py (2 hunks)
  • .devcontainer/windows-host-helper.sh (1 hunks)
  • .github/actions/install_deps/action.yml (2 hunks)
  • .github/actions/update-devcontainer-hash/action.yml (1 hunks)
  • .github/reusable_workflows/build-docker-image.yaml (1 hunks)
  • .github/workflows/ci.yaml (7 hunks)
  • .github/workflows/get-values.yaml (1 hunks)
  • .github/workflows/pre-commit.yaml (3 hunks)
  • .github/workflows/tag-on-merge.yaml (1 hunks)
  • .pre-commit-config.yaml (6 hunks)
  • copier.yml (1 hunks)
  • extensions/context.py (4 hunks)
  • pyproject.toml (1 hunks)
  • pyrightconfig.json (1 hunks)
  • template/.devcontainer/devcontainer.json.jinja (1 hunks)
  • template/.devcontainer/install-ci-tooling.py.jinja (1 hunks)
  • template/.devcontainer/windows-host-helper.sh (1 hunks)
  • template/.github/actions/install_deps/action.yml (2 hunks)
  • template/.github/actions/pulumi_ephemeral_deploy/action.yml (1 hunks)
  • template/.github/actions/update-devcontainer-hash/action.yml (1 hunks)
  • template/.github/workflows/get-values.yaml (1 hunks)
  • template/.github/workflows/pre-commit.yaml (3 hunks)
  • template/.github/workflows/pulumi-aws.yml (1 hunks)
  • template/.pre-commit-config.yaml (7 hunks)
  • template/infrastructure/pyproject.toml.jinja (1 hunks)
  • template/infrastructure/src/infrastructure/program.py (1 hunks)
  • template/pyrightconfig.json (1 hunks)
  • template/ty.toml (1 hunks)
  • template/{% if has_backend %}graphql_lambda{% endif %}/pyproject.toml.jinja (1 hunks)
  • tests/copier_data/data1.yaml (1 hunks)
  • tests/copier_data/data2.yaml (1 hunks)
  • ty.toml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.9)
.github/workflows/pre-commit.yaml

72-72: shellcheck reported issue in this script: SC2086:info:6:8: Double quote to prevent globbing and word splitting

(shellcheck)

🪛 YAMLlint (1.37.1)
tests/copier_data/data1.yaml

[error] 11-11: too many blank lines (4 > 2)

(empty-lines)

tests/copier_data/data2.yaml

[error] 11-11: too many blank lines (4 > 2)

(empty-lines)

copier.yml

[error] 37-37: too many blank lines (4 > 2)

(empty-lines)

🔇 Additional comments (45)
.devcontainer/windows-host-helper.sh (1)

10-10: LGTM! Enhanced error handling.

The addition of -u (nounset) and -o pipefail flags strengthens the script's error handling by catching unset variable references and propagating failures within pipelines.

.devcontainer/devcontainer.json (2)

61-61: LGTM! Automated hash update.

The hash update is managed by the pre-commit hook as indicated in the comment, ensuring consistency.


19-19: Verify the CodeRabbit VSCode extension version 0.16.1 availability.

The CodeRabbit VSCode extension exists and is publicly available on the Visual Studio Code marketplace. However, specific version information cannot be confirmed through standard sources. Before committing, verify this version is available by checking the extension's version history on the marketplace or using the VSCode extension installation UI.

template/.devcontainer/windows-host-helper.sh (1)

10-10: LGTM! Enhanced error handling.

The addition of -u (nounset) and -o pipefail flags strengthens the script's error handling, matching the improvement made to the non-template version.

template/.devcontainer/devcontainer.json.jinja (1)

31-31: LGTM! Template version updated to match.

The CodeRabbit VSCode extension version has been updated in the template to match the non-template version, ensuring consistency. The version verification performed for .devcontainer/devcontainer.json applies here as well.

extensions/context.py (5)

13-14: LGTM: Build tool versions updated.

The uv and pnpm version updates are straightforward and maintain exact version specifications for build reproducibility.


51-83: Correct npm package version in GraphQL tools mock.

The review references graphql_tools_mock_version as 9.1.0, but the latest available version is 9.0.25. Update the context to use the correct version. Node.js 24.11.1, Playwright 1.57.0, and @types/node 25.0.0 are all valid releases.


85-110: Container image and GitHub Actions versions are available and stable.

The specified versions exist in their respective registries: actions/checkout v6.0.1, Alpine 3.23, and Nginx 1.29.4 are all confirmed as stable, non-prerelease versions. No breaking changes have been reported for these recent releases that would affect existing workflows.


47-49: Verify whether these testing dependencies are intended for generated projects or should be removed.

Three testing-related packages have been added with version constraints, but they are not currently used in the codebase. Since this file is a copier template extension, these version definitions may be intended for projects generated from this template rather than for the template itself.

Please clarify:

  1. Are these packages meant to be included in generated projects' dependency specifications?
  2. If so, confirm they are referenced in template files used during project generation.
  3. If not, consider removing them to avoid maintaining unused version constraints.

1-121: This file contains only version updates unrelated to the stated PR objective.

The PR description mentions "improve hashing of app webpage files to reduce false-positive diffs," but extensions/context.py only defines dependency versions for the copier template. While the file is correctly structured as a ContextHook, the actual hashing improvements referenced in the PR exist in template/infrastructure/src/infrastructure/program.py (not shown in this review).

Clarify whether:

  1. These version updates are prerequisites for the hashing changes in other files
  2. This PR bundles unrelated upstream template maintenance with the hashing feature
  3. All necessary hashing-related changes are included across the PR
.copier-answers.yml (1)

2-2: LGTM!

The commit version bump to v0.0.91 and the addition of the new template configuration keys (template_might_want_to_use_python_asyncio, template_might_want_to_use_vcrpy) align with the stated upstream copier template changes.

Also applies to: 16-17

copier.yml (1)

38-41: LGTM!

The new python_version configuration entry follows the established pattern, with appropriate type, help text, and a sensible default that matches the value in .copier-answers.yml.

template/.github/actions/pulumi_ephemeral_deploy/action.yml (1)

70-74: LGTM!

The patch version bump of aws-actions/configure-aws-credentials from v5.1.0 to v5.1.1 is a low-risk update that aligns with the broader action version hygiene effort in this PR.

.github/workflows/get-values.yaml (1)

37-40: The upgrade to actions/checkout@v6 is safe and requires no workflow changes.

The primary change improves credential security by storing credentials in a separate file under $RUNNER_TEMP instead of directly in .git/config. No workflow changes are required — git fetch, git push, etc. continue to work automatically. The usage with persist-credentials: false remains compatible. This requires a minimum Actions Runner version of v2.327.1, which GitHub-hosted runners already support.

pyrightconfig.json (1)

15-15: LGTM! Improved exclusion patterns.

The changes standardize the GraphQL generated code path pattern and add appropriate exclusions for copier template resources. These updates align with the broader configuration hygiene improvements in this PR.

Also applies to: 19-19

template/ty.toml (1)

1-18: LGTM! Well-structured exclusion configuration.

The new ty.toml configuration file properly excludes generated code, caches, virtual environments, and template resources. The exclusion patterns are consistent with pyrightconfig.json, ensuring uniform handling across different tools.

template/.github/workflows/get-values.yaml (1)

38-38: actions/[email protected] is valid and secure.

This version was released 3 weeks ago and is marked as Latest on GitHub Marketplace. GitHub-owned Actions like this are recommended, and no known security vulnerabilities were found for this specific version or action.

.github/actions/install_deps/action.yml (1)

61-61: All GitHub Actions versions are valid and current.

The following action versions are confirmed to exist, are legitimate releases, and are free from known security vulnerabilities:

All versions are from official GitHub repositories with verified signatures and contain recent dependency updates. No further action is required.

.github/workflows/tag-on-merge.yaml (1)

17-21: LGTM!

Consistent checkout action version bump while preserving all existing options (ref, fetch-depth, persist-credentials).

.github/reusable_workflows/build-docker-image.yaml (2)

69-71: LGTM!

Checkout action version bump consistent with other workflow files.


75-78: LGTM!

Minor patch version bump for AWS credentials action (v5.1.0 → v5.1.1).

template/pyrightconfig.json (1)

13-17: LGTM!

Good updates to exclusion patterns:

  • Renamed GraphQL generated path from graphql_codegen to generated/graphql (aligns with broader PR changes).
  • Added **/venv to complement existing **/.venv exclusion.
  • Added **/copier_template_resources for template resource handling.
template/.github/workflows/pre-commit.yaml (3)

36-45: LGTM!

Consistent checkout action version bumps for both push and non-push event paths.


62-62: LGTM!

Cache action version bump (v4.2.4 → v4.3.0).


72-79: Improved error handling for pre-commit failures.

The enhanced script now captures the exit code and displays git diff on failure, which aids debugging by showing what pre-commit hooks modified. The -n test correctly handles both success (variable unset) and failure (variable set) cases.

ty.toml (1)

1-20: LGTM! Well-structured ty.toml configuration.

The exclusion patterns are:

  • Consistent with pyrightconfig.json exclusions.
  • Well-documented with comments explaining rationale (especially the template exclusion).
  • Appropriately scoped for a copier template repository.
template/.github/actions/update-devcontainer-hash/action.yml (1)

30-34: LGTM! Version bump to actions/[email protected].

The update maintains all existing configuration (persist-credentials, fetch-depth, ref input).

template/.devcontainer/install-ci-tooling.py.jinja (1)

79-81: LGTM - Consistent version specification format.

The change to include the == operator in the version constants rather than in the f-string maintains functional equivalence while improving consistency with line 91's PRE_COMMIT_VERSION pattern.

.devcontainer/install-ci-tooling.py (2)

79-81: LGTM - Consistent with template changes.

The version specification format matches the template file and maintains functional correctness.


10-13: Verify updated tool versions; note potential issues with pnpm 10.25.0.

UV 0.9.18 is the latest release, and copier 9.11.0 was released on November 20, 2025 with proper attestations. However, pnpm 10.25.0 has a reported bug where the lock file generated by v10.25.0 is not valid according to v10.25.0 itself. Consider upgrading to a newer pnpm version if lockfile compatibility issues arise. Additionally, the copier-template-extensions package version should be verified, as the latest confirmed version is 0.3.0.

pyproject.toml (1)

12-18: LGTM - Dependency updates align with tooling changes.

The updates include:

  • Minor pytest version bump
  • Exact version pins for copier tooling (improving reproducibility)
  • New ty dependency

These changes are consistent with the broader tooling updates across the PR.

.github/workflows/pre-commit.yaml (2)

62-62: LGTM - Minor version bump for actions/cache.

The update from v4.2.4 to v4.3.0 is a minor version change that should be backward compatible.


72-79: Excellent error handling improvement.

The enhanced pre-commit execution now captures the exit code, displays the diff on failure, and properly propagates the error. This will significantly improve debugging when pre-commit checks fail.

.pre-commit-config.yaml (2)

45-45: LGTM - Pre-commit hook version updates.

The version bumps for typos, prettier, check-jsonschema, ruff, and pylint hooks are routine maintenance updates.

Also applies to: 111-111, 198-198, 252-252, 282-282


260-260: Pattern change successfully applied across all hooks—old references completely removed.

The exclusion pattern has been updated from .*/graphql_codegen/.* to .*/generated/graphql/.* consistently across all affected hooks (ruff, pylint, pyright) at lines 260, 270, 277, 289, and 305. The old pattern no longer appears anywhere in the codebase. The new directories do not currently exist in the repository—these are likely generated at build time or represent a proactive configuration update for an upcoming restructuring.

template/.pre-commit-config.yaml (2)

72-72: LGTM - Pre-commit hook version updates consistent with main config.

The version bumps mirror those in the root .pre-commit-config.yaml and represent routine maintenance.

Also applies to: 138-138, 225-225, 279-279, 309-309


287-287: Exclusion pattern change consistent with root config.

The pattern update from graphql_codegen to generated/graphql matches the changes in the root configuration file and should be verified together with those changes.

Also applies to: 297-297, 304-304, 316-316, 332-332, 349-349

template/{% if has_backend %}graphql_lambda{% endif %}/pyproject.toml.jinja (1)

20-24: Version variables correctly include operators.

Verification confirms that pyright_version, ty_version, pytest_version, pytest_cov_version, and pytest_randomly_version are all properly defined with version operators in extensions/context.py (e.g., ">=1.1.407", ">=0.0.2"). The template correctly concatenates package names with these versioned variables to produce valid dependency specifications.

template/infrastructure/pyproject.toml.jinja (1)

13-25: No issues found. Version variables correctly include operators (primarily >=), and boto3-stubs appropriately uses the same version variable as boto3, which aligns with boto3-stubs' design of maintaining version synchronization with boto3. All referenced version variables are properly defined in the context.

.github/workflows/ci.yaml (3)

128-134: Excellent error handling improvement!

The enhanced pre-commit failure handling is a significant improvement. Capturing the exit code, printing diagnostics, and displaying the git diff will make debugging failures much easier while still properly propagating the failure status.


116-116: actions/[email protected] exists and is compatible. The version is valid and safe to use.


58-58: The actions/checkout v6.0.1 version is confirmed and safe to use.

v6.0.1 is the latest stable release. The primary breaking change in v6 requires minimum Actions Runner v2.329.0 when using Docker container actions—a requirement that GitHub-hosted runners satisfy. Standard workflows on GitHub-hosted runners will not be affected.

template/infrastructure/src/infrastructure/program.py (3)

45-60: LGTM! Addresses the PR objective effectively.

The deterministic hashing by sorting walks and using relative paths (line 52) directly addresses the stated PR objective of reducing false-positive diffs caused by path differences between local development and CI environments. The MD5 usage is appropriate for change detection.


191-197: LGTM! Clever invalidation trigger mechanism.

The integration of _compute_directory_hash into the CloudFront invalidation command (line 194) ensures the invalidation re-runs whenever file content changes. This is an elegant solution that leverages Pulumi's change detection while respecting the dependency chain (line 196).


82-83: Good addition, but optimization suggestion uses non-existent API.

The source_hash parameter is officially supported for BucketObjectv2 and correctly enables content-based change detection. Adding tags is good practice for resource management.

The file I/O efficiency concern is valid: each file is read twice (once implicitly via FileAsset on line 81, once explicitly via read_bytes() on line 82). However, the proposed optimization code contains a critical error: pulumi.BytesAsset() does not exist in the Pulumi SDK. Only FileAsset, StringAsset, and RemoteAsset are available asset types. The suggested diff using BytesAsset will not work.

If optimizing file I/O is desired, consider alternative approaches such as computing the hash upfront and passing it directly, or using StringAsset with base64-encoded content (if applicable). For now, remove the invalid code suggestion if included in PR feedback.

Likely an incorrect or invalid review comment.

- name: Checkout code during push
if: ${{ github.event_name == 'push' }}
uses: actions/checkout@v5.0.0
uses: actions/checkout@v6.0.1
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Verify the GitHub Actions version bump — ensure runner compatibility for Docker container actions.

The update from actions/[email protected] to v6.0.1 includes a credential handling change that requires a minimum Actions Runner version of v2.329.0 for Docker container action scenarios. For standard workflows, the upgrade is compatible. Confirm your runner version if you use container actions.

🤖 Prompt for AI Agents
.github/workflows/pre-commit.yaml around line 36: the checkout action was bumped
to actions/[email protected] which requires Actions Runner v2.329.0+ for Docker
container action scenarios; verify your CI/self-hosted runner version and if it
is older either upgrade the runner to v2.329.0 or newer, or pin the action to a
v5.x tag (or a compatible v5 SHA) to maintain current compatibility; also audit
this workflow for any Docker container actions and document the chosen approach
in the workflow comments.

Comment on lines 35 to +37



Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix excessive blank lines flagged by YAMLlint.

There are 4 consecutive blank lines between node_version and python_version sections, exceeding the standard limit of 2.

🔎 Proposed fix
 node_version:
     type: str
     help: What version of NodeJS is used for development?
     default: "{{ node_version }}"
 
-
-
 
 python_version:
📝 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
node_version:
type: str
help: What version of NodeJS is used for development?
default: "{{ node_version }}"
python_version:
🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 37-37: too many blank lines (4 > 2)

(empty-lines)

🤖 Prompt for AI Agents
In copier.yml around lines 35 to 37 there are four consecutive blank lines
between the node_version and python_version sections which violates YAMLlint's
max-blank-lines rule; edit the file to remove the extra blank lines so there are
no more than two consecutive blank lines (preferably a single blank line)
separating the sections and save the file, then re-run YAMLlint to confirm the
warning is resolved.

Comment on lines +16 to +22
context["pyright_version"] = ">=1.1.407"
context["pytest_version"] = ">=9.0.2"
context["pytest_randomly_version"] = ">=4.0.1"
context["pytest_cov_version"] = ">=7.0.0"
context["ty_version"] = ">=0.0.2"
context["copier_version"] = "==9.11.0"
context["copier_template_extensions_version"] = "==0.3.3"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Update ty version requirement to a released, non-yanked version.

Most specified versions exist, but ty version 0.0.2 is unavailable—it was yanked from PyPI on December 16, 2025 due to a missing source distribution. The current available versions are 0.0.3 or 0.0.4 (released December 18-19, 2025). Update the requirement to use one of these available versions to ensure the dependency can be properly installed.

Additionally, clarify the version specification strategy:

  • Lines 16-20 use >= specifiers (allowing newer minor/patch versions)
  • Lines 21-22 use == specifiers (pinned versions)

Document whether this inconsistency is intentional or standardize the approach.

🤖 Prompt for AI Agents
In extensions/context.py around lines 16 to 22, the ty_version is set to an
unavailable yanked release (>=0.0.2) and the file mixes >= and == specifiers;
update context["ty_version"] to a released non-yanked version such as ">=0.0.3"
or ">=0.0.4" so installs succeed, and decide on a consistent version strategy
across this block (either change the pinned copier entries to >= or change the
>= entries to ==) and apply that consistency to all entries on lines 16–22.

Comment on lines +24 to +32
context["pulumi_version"] = ">=3.212.0"
context["pulumi_aws_version"] = ">=7.14.0"
context["pulumi_aws_native_version"] = ">=1.40.0"
context["pulumi_command_version"] = ">=1.1.3"
context["pulumi_github_version"] = ">=6.9.1"
context["pulumi_okta_version"] = ">=6.2.0"
context["boto3_version"] = ">=1.42.11"
context["ephemeral_pulumi_deploy_version"] = ">=0.0.5"
context["pydantic_version"] = ">=2.12.5"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Verify pulumi-aws-native version: 1.40.0 does not exist as a stable release.

The specified version for pulumi-aws-native appears to be invalid. The latest stable version available is 1.38.0; update to an existing version. Additionally, while the >= specifier approach is reasonable, ensure all minimum versions are tested together to verify compatibility, as Pulumi providers can introduce breaking changes between releases.

🤖 Prompt for AI Agents
In extensions/context.py around lines 24 to 32, the pulumi_aws_native version
">=1.40.0" is invalid because 1.40.0 isn't a published stable release; update
the constraint to an existing stable minimum (for example ">=1.38.0") and ensure
the version string uses the same ">=" pattern as the other entries; after
updating, run the project's dependency/tests that exercise Pulumi providers to
confirm the chosen minimum versions are compatible together.

Comment on lines +10 to +11


Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix excessive blank lines flagged by YAMLlint.

There are 4 consecutive blank lines between ssh_port_number and node_version, exceeding the standard limit of 2. This appears to be unintentional.

🔎 Proposed fix
 ssh_port_number: 12345
 
-
-
 
 node_version: 22.13.0
📝 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
ssh_port_number: 12345
node_version: 22.13.0
🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 11-11: too many blank lines (4 > 2)

(empty-lines)

🤖 Prompt for AI Agents
In tests/copier_data/data1.yaml around lines 10 to 11, there are four
consecutive blank lines between the ssh_port_number and node_version entries
which violates YAMLlint's limit of two blank lines; remove the extra blank lines
so there are no more than two consecutive blank lines (preferably reduce to a
single blank line) and save the file to ensure the YAML stays properly
formatted.

Comment on lines +10 to +11


Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Remove excess blank lines to fix YAML lint error.

The file has 4 consecutive blank lines, which exceeds the maximum allowed (2). This will cause the YAML linter to fail.

🔎 Proposed fix
 ssh_port_number: 54321
 

-

-
 node_version: 22.14.0
📝 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
ssh_port_number: 54321
node_version: 22.14.0
🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 11-11: too many blank lines (4 > 2)

(empty-lines)

🤖 Prompt for AI Agents
In tests/copier_data/data2.yaml around lines 10 to 11, there are four
consecutive blank lines causing a YAML lint error; remove the excess blank lines
so there are no more than two consecutive blank lines (or collapse them to a
single blank line) to satisfy the linter and keep file formatting consistent.

@ejfine ejfine requested a review from Copilot December 20, 2025 15:01
@ejfine ejfine merged commit 5032256 into main Dec 20, 2025
11 checks passed
@ejfine ejfine deleted the source-hash branch December 20, 2025 15:03
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR improves the hashing mechanism for app webpage files to reduce false positive diffs between local development and CI environments. The main change adds a source_hash parameter to S3 file uploads, and includes upstream copier template updates for the ty package.

Key Changes:

  • Added source_hash parameter with MD5 hashing for S3 object change detection
  • Integrated ty package (version 0.0.4) with new ty.toml configuration files
  • Updated dependency version constraints from >= to >= for most packages, with == for copier packages
  • Updated multiple GitHub Actions and pre-commit hook versions

Reviewed changes

Copilot reviewed 35 out of 36 changed files in this pull request and generated no comments.

Show a summary per file
File Description
template/infrastructure/src/infrastructure/program.py Added source_hash parameter to S3 uploads for better change detection
uv.lock Updated dependency lockfile with new ty package and upload timestamps
ty.toml (root and template) New configuration files for ty package with exclusion patterns
pyproject.toml Reorganized dependencies and updated version constraints
extensions/context.py Updated version specifications for multiple dependencies and tooling
.pre-commit-config.yaml Updated pre-commit hook versions and renamed graphql_codegen to generated/graphql
.github/workflows/* Updated GitHub Actions versions (checkout, setup-python, setup-node, etc.)
template/.github/workflows/* Improved pre-commit error handling with git diff output on failure
.devcontainer/* Updated devcontainer tooling versions and improved shell error handling

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

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.

2 participants