Skip to content

Conversation

thomasyopes
Copy link
Contributor

@thomasyopes thomasyopes commented Jul 9, 2025

Ref: ENG-602

Issues:

Dependencies

Description

  • adding role that will be assumed by Snowflake + policy
  • current principal is our own account in the upstream (to be updated later)

Testing

  • Local
    • N/A
  • Staging
    • role is created w/ policy
  • Sandbox
    • N/A
  • Production
    • role is created w/ policy

Release Plan

  • Upstream dependencies are met/released
  • Merge this

Summary by CodeRabbit

  • New Features

    • Added support for Snowflake integration, including configuration options for integration user and external ID.
    • Enabled secure Snowflake access to S3 data through new IAM roles and policies.
  • Documentation

    • Updated configuration examples to include new Snowflake integration settings.

Ref: ENG-602

Ref: #1040
Signed-off-by: Thomas Yopes <thomasyopes@Mac.attlocal.net>
Copy link

linear bot commented Jul 9, 2025

Copy link

coderabbitai bot commented Jul 9, 2025

Walkthrough

A new Snowflake integration configuration was added to the analytics platform settings, including two fields for AWS IAM integration. The infrastructure stack was updated to create an IAM policy and role for Snowflake access to a specific S3 bucket prefix, using values from the new configuration properties.

Changes

File(s) Change Summary
packages/infra/config/analytics-platform-config.ts Extended AnalyticsPlatformConfig interface to include a snowflake object with two string fields.
packages/infra/config/example.ts Added a snowflake property with placeholder values to the analyticsPlatform config section.
packages/infra/lib/analytics-platform/analytics-platform-stack.ts Added IAM policy and role creation for Snowflake S3 integration, sourcing config from new fields.

Sequence Diagram(s)

sequenceDiagram
    participant Config as analyticsPlatform-config
    participant Example as example-config
    participant Stack as AnalyticsPlatformsNestedStack
    participant IAM as AWS IAM
    participant S3 as S3 Bucket

    Config->>Example: Defines snowflake integrationUserArn & integrationExternalId
    Example->>Stack: Passes snowflake config to stack
    Stack->>IAM: Creates policy for S3 access (snowflake prefix)
    Stack->>IAM: Creates role for Snowflake, using integrationUserArn & integrationExternalId
    IAM->>S3: Grants Snowflake role permissions on S3 bucket (snowflake prefix)
Loading

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

npm error code ERR_SSL_WRONG_VERSION_NUMBER
npm error errno ERR_SSL_WRONG_VERSION_NUMBER
npm error request to https://10.0.0.28:4873/punycode/-/punycode-2.3.1.tgz failed, reason: C08CD3606B7F0000:error:0A00010B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:354:
npm error
npm error A complete log of this run can be found in: /.npm/_logs/2025-07-09T21_48_58_799Z-debug-0.log


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d0650d5 and a7f37bd.

📒 Files selected for processing (1)
  • packages/infra/lib/analytics-platform/analytics-platform-stack.ts (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/infra/lib/analytics-platform/analytics-platform-stack.ts
⏰ 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). (2)
  • GitHub Check: check-pr / lint-build-test
  • GitHub Check: Analyze (javascript)
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4cbb29d and d0650d5.

📒 Files selected for processing (3)
  • packages/infra/config/analytics-platform-config.ts (1 hunks)
  • packages/infra/config/example.ts (1 hunks)
  • packages/infra/lib/analytics-platform/analytics-platform-stack.ts (3 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
`**/*.{js,jsx,ts,tsx}`: Don’t use null inside the app, only on code interacting ...

**/*.{js,jsx,ts,tsx}: Don’t use null inside the app, only on code interacting with external interfaces/services, like DB and HTTP; convert to undefined before sending inwards into the code
Use const whenever possible
Use async/await instead of .then()
Naming: classes, enums: PascalCase
Naming: constants, variables, functions: camelCase
Naming: file names: kebab-case
Naming: Don’t use negative names, like notEnabled, prefer isDisabled
If possible, use decomposing objects for function parameters
Prefer Nullish Coalesce (??) than the OR operator (||) when you want to provide a default value
Avoid creating arrow functions
Use truthy syntax instead of in - i.e., if (data.link) not if ('link' in data)
While handling errors, keep the stack trace around: if you create a new Error (e.g., MetriportError), make sure to pass the original error as the new one’s cause so the stack trace is available upstream.
max column length is 100 chars
multi-line comments use /** */
top-level comments go after the import (save pre-import to basic file header, like license)
move literals to constants declared after imports when possible

📄 Source: CodeRabbit Inference Engine (.cursorrules)

List of files the instruction was applied to:

  • packages/infra/config/analytics-platform-config.ts
  • packages/infra/config/example.ts
  • packages/infra/lib/analytics-platform/analytics-platform-stack.ts
`**/*.{ts,tsx}`: Use types whenever possible

**/*.{ts,tsx}: Use types whenever possible

📄 Source: CodeRabbit Inference Engine (.cursorrules)

List of files the instruction was applied to:

  • packages/infra/config/analytics-platform-config.ts
  • packages/infra/config/example.ts
  • packages/infra/lib/analytics-platform/analytics-platform-stack.ts
`**/*.ts`: - Use the Onion Pattern to organize a package's code in layers - Try ...

**/*.ts: - Use the Onion Pattern to organize a package's code in layers

  • Try to use immutable code and avoid sharing state across different functions, objects, and systems
  • Try to build code that's idempotent whenever possible
  • Prefer functional programming style functions: small, deterministic, 1 input, 1 output
  • Minimize coupling / dependencies
  • Avoid modifying objects received as parameter
  • Only add comments to code to explain why something was done, not how it works
  • Naming
    • classes, enums: PascalCase
    • constants, variables, functions: camelCase
    • file names: kebab-case
    • table and column names: snake_case
    • Use meaningful names, so whoever is reading the code understands what it means
    • Don’t use negative names, like notEnabled, prefer isDisabled
    • For numeric values, if the type doesn’t convey the unit, add the unit to the name
  • Typescript
    • Use types
    • Prefer const instead of let
    • Avoid any and casting from any to other types
    • Type predicates: only applicable to narrow down the type, not to force a complete type conversion
    • Prefer deconstructing parameters for functions instead of multiple parameters that might be of
      the same type
    • Don’t use null inside the app, only on code interacting with external interfaces/services,
      like DB and HTTP; convert to undefined before sending inwards into the code
    • Use async/await instead of .then()
    • Use the strict equality operator ===, don’t use abstract equality operator ==
    • When calling a Promise-returning function asynchronously (i.e., not awaiting), use .catch() to
      handle errors (see processAsyncError and emptyFunction depending on the case)
    • Date and Time
      • Always use buildDayjs() to create dayjs instances
      • Prefer dayjs.duration(...) to create duration consts and keep them as duration
  • Prefer Nullish Coalesce (??) than the OR operator (||) to provide a default value
  • Avoid creating arrow functions
  • Use truthy syntax instead of in - i.e., if (data.link) not if ('link' in data)
  • Error handling
    • Pass the original error as the new one’s cause so the stack trace is persisted
    • Error messages should have a static message - add dynamic data to MetriportError's additionalInfo prop
    • Avoid sending multiple events to Sentry for a single error
  • Global constants and variables
    • Move literals to constants declared after imports when possible (avoid magic numbers)
    • Avoid shared, global objects
  • Avoid using console.log and console.error in packages other than utils, infra and shared,
    and try to use out().log instead
  • Avoid multi-line logs
    • don't send objects as a second parameter to console.log() or out().log()
    • don't create multi-line strings when using JSON.stringify()
  • Use eslint to enforce code style
  • Use prettier to format code
  • max column length is 100 chars
  • multi-line comments use /** */
  • scripts: top-level comments go after the import

⚙️ Source: CodeRabbit Configuration File

List of files the instruction was applied to:

  • packages/infra/config/analytics-platform-config.ts
  • packages/infra/config/example.ts
  • packages/infra/lib/analytics-platform/analytics-platform-stack.ts
🧠 Learnings (3)
📓 Common learnings
Learnt from: leite08
PR: metriport/metriport#3550
File: packages/api/src/external/commonwell/__tests__/patient.test.ts:5-5
Timestamp: 2025-04-01T20:57:29.282Z
Learning: PR #3574 is the follow-up PR that moves the domain feature flags from packages/api/src/aws/app-config.ts to packages/core/src/command/feature-flags/domain-ffs.ts.
Learnt from: leite08
PR: metriport/metriport#0
File: :0-0
Timestamp: 2025-03-05T18:43:30.389Z
Learning: For backmerge PRs at metriport/metriport, only verify two things: (1) that the source branch is `master` and destination branch is `develop`, and (2) that there's a link to at least one PR (usually a "patch" PR) in the description. No need for detailed review comments or updates to the PR description unless there's an issue with these criteria.
Learnt from: leite08
PR: metriport/metriport#3550
File: packages/api/src/external/commonwell/__tests__/patient.test.ts:5-5
Timestamp: 2025-04-01T20:57:29.282Z
Learning: PR #3574 is the follow-up PR that moves the domain feature flags from app-config.ts to the domain folder in packages/core.
packages/infra/config/example.ts (5)
Learnt from: leite08
PR: metriport/metriport#3550
File: packages/api/src/external/commonwell/__tests__/patient.test.ts:5-5
Timestamp: 2025-04-01T19:59:22.396Z
Learning: The file at `packages/api/src/aws/app-config.ts` contains domain feature flags (not AWS AppConfig specific functionality) and is planned to be moved to the domain folder in packages/core in a future PR.
Learnt from: lucasdellabella
PR: metriport/metriport#3948
File: packages/infra/config/example.ts:179-180
Timestamp: 2025-06-03T14:41:10.149Z
Learning: Example configuration files (like example.ts) use placeholder values and don't need to match real environment-specific constants or actual deployment values. They're meant to demonstrate structure and format.
Learnt from: leite08
PR: metriport/metriport#3550
File: packages/api/src/external/commonwell/__tests__/patient.test.ts:5-5
Timestamp: 2025-04-01T20:57:29.282Z
Learning: PR #3574 is the follow-up PR that moves the domain feature flags from packages/api/src/aws/app-config.ts to packages/core/src/command/feature-flags/domain-ffs.ts.
Learnt from: lucasdellabella
PR: metriport/metriport#3948
File: packages/infra/lib/hl7-notification-stack/constants.ts:6-14
Timestamp: 2025-06-03T14:43:16.951Z
Learning: The environment-specific IP constants (MLLP_SERVER_NLB_PROD_INTERNAL_IP_A/B and MLLP_SERVER_NLB_STAGING_INTERNAL_IP_A/B) in packages/infra/lib/hl7-notification-stack/constants.ts are used in symlinked configuration files that are not visible during codebase analysis, which is why they may appear unused despite being actively referenced.
Learnt from: leite08
PR: metriport/metriport#3469
File: packages/utils/src/s3/list-objects.ts:12-13
Timestamp: 2025-03-14T01:14:58.991Z
Learning: In utility scripts under `./packages/utils/src/s3/`, empty string values like `const bucketName = ``; const filePrefix = ``;` are intentional placeholders meant to be filled in by developers before running the script, as documented in the TSDoc comments. These should not be flagged as issues or suggested to be replaced with environment variables.
packages/infra/lib/analytics-platform/analytics-platform-stack.ts (2)
Learnt from: leite08
PR: metriport/metriport#3545
File: packages/infra/lib/api-stack.ts:383-391
Timestamp: 2025-03-28T23:03:04.409Z
Learning: When creating a nested stack in AWS CDK, don't include "NestedStack" in the ID parameter since the class name already has that suffix.
Learnt from: thomasyopes
PR: metriport/metriport#3871
File: packages/infra/lib/surescripts-stack.ts:189-189
Timestamp: 2025-05-21T20:57:09.547Z
Learning: When creating AWS S3 buckets with AWS CDK, if the bucketName property is not provided, CDK will generate a default name rather than failing. In the Metriport codebase, properties like bucket names should be made required in type definitions rather than adding runtime validation.
⏰ 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). (2)
  • GitHub Check: check-pr / lint-build-test
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (5)
packages/infra/config/analytics-platform-config.ts (1)

6-9: LGTM! Interface addition follows TypeScript best practices.

The new snowflake configuration interface is well-structured with appropriate field names and types.

packages/infra/config/example.ts (1)

243-246: LGTM! Example configuration uses appropriate placeholder values.

The placeholder values follow the expected format for Snowflake integration configuration.

packages/infra/lib/analytics-platform/analytics-platform-stack.ts (3)

3-3: LGTM! IAM import added for Snowflake integration.

The import is necessary for the new IAM role and policy creation.


18-18: LGTM! Bucket variable assignment enables reuse in policy statements.

Storing the bucket reference in a variable is good practice for referencing its ARN in the IAM policy.


29-55: LGTM! IAM policy follows Snowflake S3 integration best practices.

The policy statements correctly:

  • Grant object-level permissions on the snowflake/* prefix
  • Restrict bucket-level operations with appropriate prefix conditions
  • Use meaningful resource ARNs and conditions

The implementation follows AWS IAM best practices for scoped S3 access.

Comment on lines 56 to 64
new iam.Role(this, "SnowflakeIntegrationRole", {
assumedBy: new iam.AccountPrincipal(
props.config.analyticsPlatform.snowflake.integrationUserArn
),
externalIds: [props.config.analyticsPlatform.snowflake.integrationExternalId],
inlinePolicies: {
SnowflakeAnalyticsPlatformS3Policy: s3Policy.document,
},
});
Copy link

@coderabbitai coderabbitai bot Jul 9, 2025

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Fix the AccountPrincipal usage with integrationUserArn.

AccountPrincipal expects an AWS account ID (12-digit number), but integrationUserArn contains an ARN. For Snowflake integration, you typically need to use the Snowflake AWS account ID as the principal.

Consider this approach:

-assumedBy: new iam.AccountPrincipal(
-  props.config.analyticsPlatform.snowflake.integrationUserArn
-),
+assumedBy: new iam.AccountPrincipal("474142129181"), // Snowflake's AWS account ID

Or extract the account ID from the ARN if that's the intended usage:

-assumedBy: new iam.AccountPrincipal(
-  props.config.analyticsPlatform.snowflake.integrationUserArn
-),
+assumedBy: new iam.AccountPrincipal(
+  props.config.analyticsPlatform.snowflake.integrationUserArn.split(':')[4]
+),

🌐 Web query:

What is the correct AWS account ID for Snowflake S3 integration in 2024?

💡 Result:

To integrate Snowflake with Amazon S3, Snowflake provisions a unique AWS Identity and Access Management (IAM) user for your account. This IAM user is consistent across all S3 storage integrations within your Snowflake account. To identify this IAM user, you can execute the following SQL command in Snowflake:

DESC INTEGRATION <integration_name>;

Replace <integration_name> with the name of your storage integration. This command will return various properties, including STORAGE_AWS_IAM_USER_ARN, which contains the ARN of the IAM user. The ARN will be in the format:

arn:aws:iam::<aws_account_id>:user/<user_name>

Here, <aws_account_id> is the AWS account ID associated with your Snowflake account, and <user_name> is the specific IAM user's name. This IAM user is used by Snowflake to access your S3 buckets securely. (docs.snowflake.com)

For more detailed information on configuring Snowflake storage integrations with Amazon S3, refer to the Snowflake documentation: (docs.snowflake.com)

Citations:


Use an ArnPrincipal for the Snowflake IAM user ARN

The AccountPrincipal construct expects a 12-digit AWS account ID, not a full IAM user ARN. Since integrationUserArn is the ARN of the Snowflake-provisioned IAM user, switch to ArnPrincipal, or if you truly intend to grant the entire Snowflake account, extract the account ID from the ARN.

• File: packages/infra/lib/analytics-platform/analytics-platform-stack.ts
Lines: 56–64

Suggested change:

-   new iam.Role(this, "SnowflakeIntegrationRole", {
-     assumedBy: new iam.AccountPrincipal(
-       props.config.analyticsPlatform.snowflake.integrationUserArn
-     ),
+   new iam.Role(this, "SnowflakeIntegrationRole", {
+     assumedBy: new iam.ArnPrincipal(
+       props.config.analyticsPlatform.snowflake.integrationUserArn
+     ),
      externalIds: [props.config.analyticsPlatform.snowflake.integrationExternalId],
      inlinePolicies: {
        SnowflakeAnalyticsPlatformS3Policy: s3Policy.document,
      },
    });

If your goal is to allow the entire Snowflake AWS account (rather than just the IAM user), you can instead extract the account ID:

- assumedBy: new iam.AccountPrincipal(
-   props.config.analyticsPlatform.snowflake.integrationUserArn
- ),
+ assumedBy: new iam.AccountPrincipal(
+   props.config.analyticsPlatform.snowflake.integrationUserArn.split(':')[4]
+ ),
📝 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
new iam.Role(this, "SnowflakeIntegrationRole", {
assumedBy: new iam.AccountPrincipal(
props.config.analyticsPlatform.snowflake.integrationUserArn
),
externalIds: [props.config.analyticsPlatform.snowflake.integrationExternalId],
inlinePolicies: {
SnowflakeAnalyticsPlatformS3Policy: s3Policy.document,
},
});
new iam.Role(this, "SnowflakeIntegrationRole", {
assumedBy: new iam.ArnPrincipal(
props.config.analyticsPlatform.snowflake.integrationUserArn
),
externalIds: [props.config.analyticsPlatform.snowflake.integrationExternalId],
inlinePolicies: {
SnowflakeAnalyticsPlatformS3Policy: s3Policy.document,
},
});
🤖 Prompt for AI Agents
In packages/infra/lib/analytics-platform/analytics-platform-stack.ts around
lines 56 to 64, the code incorrectly uses iam.AccountPrincipal with a full IAM
user ARN, but AccountPrincipal expects a 12-digit AWS account ID. To fix this,
replace iam.AccountPrincipal with iam.ArnPrincipal using the full
integrationUserArn, or if the intention is to allow the entire Snowflake
account, extract the account ID from the ARN and pass it to iam.AccountPrincipal
accordingly.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

For now, the ARN is actually an account ID temporarily. I will update it to an ARN in a second pass, and update this as well.

Copy link

Choose a reason for hiding this comment

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

@thomasyopes, understood! That clarifies the temporary implementation. The naming is indeed misleading for now, but it makes sense given the phased approach. When you update it to an actual ARN, you'll need to switch to ArnPrincipal as the bot suggested.


✏️ Learnings added
Learnt from: thomasyopes
PR: metriport/metriport#4167
File: packages/infra/lib/analytics-platform/analytics-platform-stack.ts:56-64
Timestamp: 2025-07-09T20:41:08.494Z
Learning: In the analytics platform Snowflake integration (packages/infra/lib/analytics-platform/analytics-platform-stack.ts), the `integrationUserArn` field in the config temporarily contains an AWS account ID rather than an ARN. This is planned to be updated to an actual ARN in a second pass, at which point the IAM Role's assumedBy should be changed from AccountPrincipal to ArnPrincipal.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: leite08
PR: metriport/metriport#3545
File: packages/infra/lib/api-stack.ts:383-391
Timestamp: 2025-03-28T23:03:04.409Z
Learning: When creating a nested stack in AWS CDK, don't include "NestedStack" in the ID parameter since the class name already has that suffix.

Learnt from: thomasyopes
PR: metriport/metriport#3709
File: packages/infra/lib/ehr-nested-stack.ts:470-486
Timestamp: 2025-04-23T19:33:45.489Z
Learning: The `refreshEhrBundles` Lambda in the EhrNestedStack uses the API to refresh bundles, rather than accessing the S3 bucket directly. This is why it doesn't need the EHR_BUNDLE_BUCKET_NAME environment variable or direct S3 bucket permissions, unlike other similar Lambdas.

Learnt from: leite08
PR: metriport/metriport#3550
File: packages/api/src/external/commonwell/__tests__/patient.test.ts:5-5
Timestamp: 2025-04-01T20:57:29.282Z
Learning: PR #3574 is the follow-up PR that moves the domain feature flags from packages/api/src/aws/app-config.ts to packages/core/src/command/feature-flags/domain-ffs.ts.

Learnt from: leite08
PR: metriport/metriport#0
File: :0-0
Timestamp: 2025-03-05T18:43:30.389Z
Learning: For backmerge PRs at metriport/metriport, only verify two things: (1) that the source branch is `master` and destination branch is `develop`, and (2) that there's a link to at least one PR (usually a "patch" PR) in the description. No need for detailed review comments or updates to the PR description unless there's an issue with these criteria.

Learnt from: leite08
PR: metriport/metriport#3550
File: packages/api/src/external/commonwell/__tests__/patient.test.ts:5-5
Timestamp: 2025-04-01T20:57:29.282Z
Learning: PR #3574 is the follow-up PR that moves the domain feature flags from app-config.ts to the domain folder in packages/core.

Ref: ENG-602

Ref: #1040
Signed-off-by: Thomas Yopes <thomasyopes@Mac.attlocal.net>
@thomasyopes thomasyopes added this pull request to the merge queue Jul 9, 2025
Merged via the queue into develop with commit 8f1fe9e Jul 9, 2025
15 checks passed
@thomasyopes thomasyopes deleted the eng-602-analytics-platform-snowflake-infra branch July 9, 2025 23:00
@thomasyopes thomasyopes mentioned this pull request Jul 9, 2025
1 task
@coderabbitai coderabbitai bot mentioned this pull request Jul 17, 2025
6 tasks
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