feat: standardize monetization lifecycle signals - #1633
Conversation
|
Warning Review limit reached
Next review available in: 37 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (87)
📝 WalkthroughWalkthrough
ChangesMonetization lifecycle
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related issues
Possibly related PRs
Sequence Diagram(s)sequenceDiagram
participant BillingOrMeteringAdapter
participant MonetizationSignalFactory
participant MonetizationThresholdTracker
participant LifecycleRuleRegistry
participant LifecycleDiagnosticsProvider
BillingOrMeteringAdapter->>MonetizationSignalFactory: normalized monetization input
MonetizationSignalFactory-->>MonetizationThresholdTracker: lifecycle signal
MonetizationThresholdTracker->>LifecycleRuleRegistry: accepted threshold crossing
LifecycleRuleRegistry-->>LifecycleDiagnosticsProvider: monetization run data
LifecycleDiagnosticsProvider-->>BillingOrMeteringAdapter: signal counts and capability diagnostics
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📊 Benchmark Results✅ All benchmarks passed
Updated: 2026-07-31T15:16:24.726Z · Commit: ddaf420 |
512f58a to
ae784dd
Compare
There was a problem hiding this comment.
Actionable comments posted: 15
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/cli/package.json`:
- Line 40: Update the package.json test script to wrap the Vitest integration
exclusion glob in escaped double quotes instead of single quotes, ensuring
Windows cmd.exe passes the pattern correctly while preserving the existing
test:e2e scope and exclusion behavior.
In
`@packages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.md`:
- Line 8: Update the JSDoc for MonetizationSignalDefinitionProblem and
MonetizationRecipeCapabilityProblem in
packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts to describe their
specific problem details instead of the generic Problem class. Document signal
input definition issues for MonetizationSignalDefinitionProblem, and describe
missing unavailable recipe capabilities using recipeId and missingCapabilities
for MonetizationRecipeCapabilityProblem; then regenerate the TypeDoc pages
packages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSignalDefinitionProblem.md:8-8
and
packages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.md:8-8.
In
`@packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md`:
- Around line 8-18: Restore the API documentation generation path behind
CROCO_PROBLEM_CODE_REGISTRY and reconcile its source Problem metadata before
updating this generated Markdown. Run the canonical regeneration flow, verify
the regenerated registry matches the source metadata, and ensure pnpm
docs:api:check passes before committing the document.
In
`@packages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts`:
- Around line 173-184: Update the getHealth flow around
monetizationThresholdStore.getDiagnostics and
monetizationCapabilitySource.getCapabilities to handle each Promise
independently with an appropriate timeout; convert failures into degraded health
results and detailed diagnostics containing traceable diagnostic codes and
underlying causes instead of allowing getHealth to throw. Also emit a diagnostic
when monetizationRecipes is configured but no monetizationCapabilitySource
exists, rather than silently skipping capability validation.
- Around line 59-66: Update the monetizationSignalsByType property in
LifecycleDiagnosticsProvider to use MonetizationSignalType as the Record key
instead of string, and add MonetizationSignalType to the existing type import
from ../monetization.
In `@packages/lifecycle-core/src/libs/monetization.ts`:
- Around line 1211-1226: Update the when callback to access the threshold
through optional chaining from data.evidence, returning false when evidence is
absent while preserving the existing threshold-range checks. Anchor the change
in the when callback and its threshold evaluation; do not assume data.evidence
is always present.
- Around line 435-438: Update the trial-ending signal construction in the
function containing createMonetizationSignal so daysRemaining is included in the
signal identity material, ensuring D-7, D-3, and D-1 reminders receive distinct
IDs and are not deduplicated by createRecipe’s context.signal.idempotencyKey.
- Around line 977-991: Update acknowledgeCrossings and the
reservation-expiration flow so claims removed by pruneExpiredReservations are
surfaced rather than silently ignored. Add expiredClaimCount to
MonetizationThresholdDiagnostics, increment it when reservations expire, and
expose it through the existing diagnostics path; ensure acknowledgeCrossings
does not falsely treat an expired claim as successfully acknowledged.
In `@packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts`:
- Line 171: LifecycleProblems의 생성자에서 signalType을 MonetizationSignalType으로 좁히고,
관련 recipeId 파라미터와 MonetizationRecipeCapabilityDiagnostic.recipeId도
MonetizationRecipeId를 사용하도록 변경하십시오. 두 도메인 타입은 순환 import가 발생하지 않는 공용 타입 모듈에 선언하거나
재사용하여 Problem extensions 계약이 컴파일 시점에 검증되도록 하십시오.
- Around line 170-184: Update the category used by
MonetizationSignalDefinitionProblem from ProblemCategory.InternalServerError to
the input-validation category, ProblemCategory.ValidationError, while preserving
the existing error code, message, and extensions.
In `@packages/lifecycle-core/src/libs/types.ts`:
- Around line 6-14: Remove the duplicated monetization signal literals from
LifecycleSignalType and reuse MonetizationSignalType from monetization.ts as the
single source of truth. If direct reuse is not possible, add a compile-time
compatibility assertion between LifecycleSignalType and MonetizationSignalType
so future divergence fails type checking.
In `@packages/lifecycle-core/src/tests/MonetizationLifecycle.spec.ts`:
- Around line 180-184: Update the test around the
billing.usage.threshold_crossed signal to assert signal.type equals the expected
event type before checking reason, status, and evidence. Remove the conditional
guard so the test always validates the event type and payload.
- Around line 63-69: Update allCapabilities() to derive signalSources from each
recipe descriptor’s requiredSignalSources field instead of signalTypes, while
keeping requiredActionTypes unchanged. Ensure the helper matches the capability
fields checked by missingCapabilities so the diagnostics and installation tests
validate the actual contract.
- Around line 319-331: Update the asynchronous rejection assertion for
installMonetizationRecipe to include rejects.toThrow alongside the existing
toMatchObject checks, preserving the current error code and recipeId assertions.
Since MonetizationRecipeCapabilityProblem is currently type-only imported,
change it to a value import if using it for a class assertion.
- Line 152: The assertion at line 152 uses toHaveLength on a Set object, but Set
instances use the .size property instead of .length. Update the expect assertion
for the Set created from signals.map to use the toHaveSize matcher instead,
which correctly validates that the unique signal types collection contains
exactly 8 distinct entries.
🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 03bf0e79-56bb-47a4-a595-ae7061a4f431
⛔ Files ignored due to path filters (2)
packages/problems-core/src/generated/problem-code-registry.tsis excluded by!**/generated/**pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (85)
.changeset/calm-pandas-observe.md.changeset/steady-cli-tests.mddocs/problem-code-registry.jsonpackages/cli/package.jsonpackages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryMonetizationConditionStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryMonetizationThresholdStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleDiagnosticsProvider.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSignalDefinitionProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSubscriptionConditionTracker.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationThresholdTracker.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createCreditBalanceLowSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createCreditExhaustedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createDeliveryBacklogEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createLowCreditWarningRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createMonetizationLifecycleArtifact.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createMonetizationReferenceRecipes.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createPastDueGraceFollowUpRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createQuotaReachedNotificationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSeatDriftEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSeatQuantityDriftedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSubscriptionPastDueSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSubscriptionRecoveredSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createTrialEndingReminderRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createTrialEndingSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageDeliveryLaggingSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageDriftEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageSyncDriftedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageThresholdCrossedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageUpgradePromptRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/installMonetizationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/validateMonetizationRecipeCapabilities.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationCapabilitySource.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationConditionStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationThresholdStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/CreditBalanceLowSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/CreditExhaustedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/InMemoryMonetizationThresholdStoreOptions.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsDryRunDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsProviderOptions.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsRunDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleSignalType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionEvaluation.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionTransition.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionTransitionResult.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationLifecycleArtifact.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationLifecycleSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeCapabilities.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeCapabilityDiagnostic.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeDefinition.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeDescriptor.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeId.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSafeEvidence.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalData.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalDescriptor.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalEvidenceByType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalMetadataByType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalReason.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdClaim.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdClaimResult.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdDiagnostics.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdEvaluation.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdScope.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SeatQuantityDriftedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SubscriptionPastDueSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SubscriptionRecoveredSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/TrialEndingSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageDeliveryLaggingSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageSyncDriftedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageThresholdCrossedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/variables/MONETIZATION_SIGNAL_DESCRIPTORS.mdpackages/docs/src/content/docs/api/problems-core/src/classes/Problem.mdpackages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.mdpackages/docs/src/content/docs/en/reference/problem-recovery-cookbook.mdpackages/lifecycle-core/README.mdpackages/lifecycle-core/package.jsonpackages/lifecycle-core/src/index.tspackages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.tspackages/lifecycle-core/src/libs/monetization.tspackages/lifecycle-core/src/libs/problems/LifecycleProblems.tspackages/lifecycle-core/src/libs/types.tspackages/lifecycle-core/src/tests/MonetizationLifecycle.spec.tspublic-api-surface.snapshot.json
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 15
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/cli/package.json`:
- Line 40: Update the package.json test script to wrap the Vitest integration
exclusion glob in escaped double quotes instead of single quotes, ensuring
Windows cmd.exe passes the pattern correctly while preserving the existing
test:e2e scope and exclusion behavior.
In
`@packages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.md`:
- Line 8: Update the JSDoc for MonetizationSignalDefinitionProblem and
MonetizationRecipeCapabilityProblem in
packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts to describe their
specific problem details instead of the generic Problem class. Document signal
input definition issues for MonetizationSignalDefinitionProblem, and describe
missing unavailable recipe capabilities using recipeId and missingCapabilities
for MonetizationRecipeCapabilityProblem; then regenerate the TypeDoc pages
packages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSignalDefinitionProblem.md:8-8
and
packages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.md:8-8.
In
`@packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md`:
- Around line 8-18: Restore the API documentation generation path behind
CROCO_PROBLEM_CODE_REGISTRY and reconcile its source Problem metadata before
updating this generated Markdown. Run the canonical regeneration flow, verify
the regenerated registry matches the source metadata, and ensure pnpm
docs:api:check passes before committing the document.
In
`@packages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts`:
- Around line 173-184: Update the getHealth flow around
monetizationThresholdStore.getDiagnostics and
monetizationCapabilitySource.getCapabilities to handle each Promise
independently with an appropriate timeout; convert failures into degraded health
results and detailed diagnostics containing traceable diagnostic codes and
underlying causes instead of allowing getHealth to throw. Also emit a diagnostic
when monetizationRecipes is configured but no monetizationCapabilitySource
exists, rather than silently skipping capability validation.
- Around line 59-66: Update the monetizationSignalsByType property in
LifecycleDiagnosticsProvider to use MonetizationSignalType as the Record key
instead of string, and add MonetizationSignalType to the existing type import
from ../monetization.
In `@packages/lifecycle-core/src/libs/monetization.ts`:
- Around line 1211-1226: Update the when callback to access the threshold
through optional chaining from data.evidence, returning false when evidence is
absent while preserving the existing threshold-range checks. Anchor the change
in the when callback and its threshold evaluation; do not assume data.evidence
is always present.
- Around line 435-438: Update the trial-ending signal construction in the
function containing createMonetizationSignal so daysRemaining is included in the
signal identity material, ensuring D-7, D-3, and D-1 reminders receive distinct
IDs and are not deduplicated by createRecipe’s context.signal.idempotencyKey.
- Around line 977-991: Update acknowledgeCrossings and the
reservation-expiration flow so claims removed by pruneExpiredReservations are
surfaced rather than silently ignored. Add expiredClaimCount to
MonetizationThresholdDiagnostics, increment it when reservations expire, and
expose it through the existing diagnostics path; ensure acknowledgeCrossings
does not falsely treat an expired claim as successfully acknowledged.
In `@packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts`:
- Line 171: LifecycleProblems의 생성자에서 signalType을 MonetizationSignalType으로 좁히고,
관련 recipeId 파라미터와 MonetizationRecipeCapabilityDiagnostic.recipeId도
MonetizationRecipeId를 사용하도록 변경하십시오. 두 도메인 타입은 순환 import가 발생하지 않는 공용 타입 모듈에 선언하거나
재사용하여 Problem extensions 계약이 컴파일 시점에 검증되도록 하십시오.
- Around line 170-184: Update the category used by
MonetizationSignalDefinitionProblem from ProblemCategory.InternalServerError to
the input-validation category, ProblemCategory.ValidationError, while preserving
the existing error code, message, and extensions.
In `@packages/lifecycle-core/src/libs/types.ts`:
- Around line 6-14: Remove the duplicated monetization signal literals from
LifecycleSignalType and reuse MonetizationSignalType from monetization.ts as the
single source of truth. If direct reuse is not possible, add a compile-time
compatibility assertion between LifecycleSignalType and MonetizationSignalType
so future divergence fails type checking.
In `@packages/lifecycle-core/src/tests/MonetizationLifecycle.spec.ts`:
- Around line 180-184: Update the test around the
billing.usage.threshold_crossed signal to assert signal.type equals the expected
event type before checking reason, status, and evidence. Remove the conditional
guard so the test always validates the event type and payload.
- Around line 63-69: Update allCapabilities() to derive signalSources from each
recipe descriptor’s requiredSignalSources field instead of signalTypes, while
keeping requiredActionTypes unchanged. Ensure the helper matches the capability
fields checked by missingCapabilities so the diagnostics and installation tests
validate the actual contract.
- Around line 319-331: Update the asynchronous rejection assertion for
installMonetizationRecipe to include rejects.toThrow alongside the existing
toMatchObject checks, preserving the current error code and recipeId assertions.
Since MonetizationRecipeCapabilityProblem is currently type-only imported,
change it to a value import if using it for a class assertion.
- Line 152: The assertion at line 152 uses toHaveLength on a Set object, but Set
instances use the .size property instead of .length. Update the expect assertion
for the Set created from signals.map to use the toHaveSize matcher instead,
which correctly validates that the unique signal types collection contains
exactly 8 distinct entries.
🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 03bf0e79-56bb-47a4-a595-ae7061a4f431
⛔ Files ignored due to path filters (2)
packages/problems-core/src/generated/problem-code-registry.tsis excluded by!**/generated/**pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (85)
.changeset/calm-pandas-observe.md.changeset/steady-cli-tests.mddocs/problem-code-registry.jsonpackages/cli/package.jsonpackages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryMonetizationConditionStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryMonetizationThresholdStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleDiagnosticsProvider.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSignalDefinitionProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSubscriptionConditionTracker.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationThresholdTracker.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createCreditBalanceLowSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createCreditExhaustedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createDeliveryBacklogEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createLowCreditWarningRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createMonetizationLifecycleArtifact.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createMonetizationReferenceRecipes.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createPastDueGraceFollowUpRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createQuotaReachedNotificationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSeatDriftEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSeatQuantityDriftedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSubscriptionPastDueSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSubscriptionRecoveredSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createTrialEndingReminderRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createTrialEndingSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageDeliveryLaggingSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageDriftEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageSyncDriftedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageThresholdCrossedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageUpgradePromptRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/installMonetizationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/validateMonetizationRecipeCapabilities.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationCapabilitySource.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationConditionStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationThresholdStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/CreditBalanceLowSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/CreditExhaustedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/InMemoryMonetizationThresholdStoreOptions.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsDryRunDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsProviderOptions.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsRunDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleSignalType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionEvaluation.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionTransition.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionTransitionResult.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationLifecycleArtifact.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationLifecycleSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeCapabilities.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeCapabilityDiagnostic.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeDefinition.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeDescriptor.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeId.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSafeEvidence.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalData.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalDescriptor.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalEvidenceByType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalMetadataByType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalReason.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdClaim.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdClaimResult.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdDiagnostics.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdEvaluation.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdScope.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SeatQuantityDriftedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SubscriptionPastDueSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SubscriptionRecoveredSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/TrialEndingSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageDeliveryLaggingSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageSyncDriftedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageThresholdCrossedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/variables/MONETIZATION_SIGNAL_DESCRIPTORS.mdpackages/docs/src/content/docs/api/problems-core/src/classes/Problem.mdpackages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.mdpackages/docs/src/content/docs/en/reference/problem-recovery-cookbook.mdpackages/lifecycle-core/README.mdpackages/lifecycle-core/package.jsonpackages/lifecycle-core/src/index.tspackages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.tspackages/lifecycle-core/src/libs/monetization.tspackages/lifecycle-core/src/libs/problems/LifecycleProblems.tspackages/lifecycle-core/src/libs/types.tspackages/lifecycle-core/src/tests/MonetizationLifecycle.spec.tspublic-api-surface.snapshot.json
🛑 Comments failed to post (1)
packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md (1)
8-18: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail registry='packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md' source='packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts' expected="$(sed -nE 's/.*problemCount.*: `([0-9]+)`.*/\1/p' "$registry")" actual="$(rg -o '`code`:' "$registry" | wc -l | tr -d ' ')" test "$expected" = "$actual" rg -n -C 6 \ 'monetization-recipe-capability-missing|monetization-signal-invalid' \ "$source" "$registry" pnpm docs:api:checkRepository: croco-dev/framework
Length of output: 50376
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail registry='packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md' lifecycle='packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts' printf 'registry line count: ' wc -l < "$registry" printf '\nproblemCount in registry: ' sed -nE 's/.*problemCount.*?:.*?`([0-9]+)`.*/\1/p' "$registry" printf '\nnested code declarations in registry: ' rg -o '(`code`|code:)' "$registry" | wc -l | tr -d ' ' printf '\nmatches in registry and lifecycle for monetization codes:\n' rg -n -C 3 'monetization-(recipe-capability-missing|signal-invalid)' "$registry" "$lifecycle" || true printf '\npackage/scripts entries for docs APIs:\n' node - <<'JS' const fs = require('fs'); const pkg = JSON.parse(fs.readFileSync('package.json','utf8')); for (const [k,v] of Object.entries(pkg?.scripts||{})) { if (/docs|typedoc|api/.test(k)) console.log(k, '=', v); } JS printf '\nTypeDoc config files:\n' git ls-files | rg '(^|/)typedoc\.[cm]?[jt]s?$|(^|/)typedoc-config|packages/doc|docs:api' || trueRepository: croco-dev/framework
Length of output: 50376
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail registry='packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md' lifecycle='packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts' printf '%s: problemCount line\n' "$registry" rg -n -E '^\s*problemCount\s*:.*?`([0-9]+)`.+' "$registry" printf '\n%s: occurrences of `code` declarations and nested code references (no failures expected)\n' "$registry" python3 - <<'PY' import re from pathlib import Path p=Path('packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md') s=p.read_text() codes=re.findall(r'`code`:\s*"(.*?)"', s) print('declared codes:', len(codes)) print('first 20 codes:', codes[:20]) print('\ntotal nested code matches:', len(re.findall(r'`code`:', s))) PY printf '\n%s: metadata for monetization-recipe-capability-missing\n' "$lifecycle" rg -n -C 4 'monetization-recipe-capability-missing' "$lifecycle" printf '\n%s: metadata for monetization-signal-invalid\n' "$lifecycle" rg -n -C 4 'monetization-signal-invalid' "$lifecycle"Repository: croco-dev/framework
Length of output: 370
API 문서 생성 경로를 복구하세요.
pnpm docs:api:check가 실패했습니다.
이 Markdown은 생성물이라도 불일치를 원본 Problem 메타데이터 검사와 함께 확인해야 합니다. 결과로 API 문서 생성 경로가 실패하면 이 커밋 전에 원본 수정/재생성 경로를 먼저 복구하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md` around lines 8 - 18, Restore the API documentation generation path behind CROCO_PROBLEM_CODE_REGISTRY and reconcile its source Problem metadata before updating this generated Markdown. Run the canonical regeneration flow, verify the regenerated registry matches the source metadata, and ensure pnpm docs:api:check passes before committing the document.Source: Learnings
ae784dd to
26b9c8b
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/lifecycle-core/README.md`:
- Around line 157-160: Update the README example’s loop to use the previously
defined evaluator instead of the undefined lifecycle identifier, and ensure
createLifecycleContext is imported if the example is intended to stand alone.
Keep the crossing.signals evaluation and tracker.acknowledge flow unchanged.
- Line 195: Update the README description of
createMonetizationLifecycleArtifact() to remove the claim that fingerprints
cover versioned activation and dry-run paths, since executableFingerprint
currently includes only descriptor, executionModelVersion, actionDescriptors,
signal action IDs, cooldown, and thresholdRange. Keep the documented fingerprint
scope aligned with the implementation in executableFingerprint and
registerVersion().
In `@packages/lifecycle-core/src/libs/monetization.ts`:
- Around line 929-941: Update the latestSourceAt advancement guard near
crossedThresholds to also require that no unresolved reservation remains for the
same scope key. Use the existing reservations collection and key filtering, so
observations with pending claims—including those with an empty eligible
set—cannot advance latestSourceAt; preserve the current advancement behavior
when no matching reservation exists.
In `@packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts`:
- Around line 206-221: Update the extensions in
MonetizationThresholdClaimProblem so this permanently unavailable claim is
marked retryable: false, matching MonetizationSignalDefinitionProblem and
MonetizationRecipeCapabilityProblem. Preserve the existing claimId and error
message behavior.
🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 16407e24-a1ec-46f5-b5c8-3185473bd003
⛔ Files ignored due to path filters (2)
packages/problems-core/src/generated/problem-code-registry.tsis excluded by!**/generated/**pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (87)
.changeset/calm-pandas-observe.md.changeset/steady-cli-tests.mddocs/problem-code-registry.jsonpackages/cli/package.jsonpackages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryMonetizationConditionStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryMonetizationThresholdStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleDiagnosticsProvider.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationRecipeCapabilityProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSignalDefinitionProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationSubscriptionConditionTracker.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationThresholdClaimProblem.mdpackages/docs/src/content/docs/api/lifecycle-core/src/classes/MonetizationThresholdTracker.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createCreditBalanceLowSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createCreditExhaustedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createDeliveryBacklogEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createLowCreditWarningRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createMonetizationLifecycleArtifact.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createMonetizationReferenceRecipes.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createPastDueGraceFollowUpRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createQuotaReachedNotificationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSeatDriftEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSeatQuantityDriftedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSubscriptionPastDueSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createSubscriptionRecoveredSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createTrialEndingReminderRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createTrialEndingSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageDeliveryLaggingSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageDriftEscalationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageSyncDriftedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageThresholdCrossedSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/createUsageUpgradePromptRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/installMonetizationRecipe.mdpackages/docs/src/content/docs/api/lifecycle-core/src/functions/validateMonetizationRecipeCapabilities.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationCapabilitySource.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationConditionStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/interfaces/MonetizationThresholdStore.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/CreditBalanceLowSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/CreditExhaustedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/InMemoryMonetizationThresholdStoreOptions.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsDryRunDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsProviderOptions.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDiagnosticsRunDetails.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleMonetizationOperationalDiagnostic.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleSignalType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionEvaluation.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionTransition.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationConditionTransitionResult.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationLifecycleArtifact.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationLifecycleSignal.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeCapabilities.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeCapabilityDiagnostic.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeDefinition.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeDescriptor.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationRecipeId.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSafeEvidence.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalData.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalDescriptor.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalEvidenceByType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalMetadataByType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalReason.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationSignalType.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdClaim.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdClaimResult.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdDiagnostics.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdEvaluation.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/MonetizationThresholdScope.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SeatQuantityDriftedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SubscriptionPastDueSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/SubscriptionRecoveredSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/TrialEndingSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageDeliveryLaggingSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageSyncDriftedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/UsageThresholdCrossedSignalInput.mdpackages/docs/src/content/docs/api/lifecycle-core/src/variables/MONETIZATION_SIGNAL_DESCRIPTORS.mdpackages/docs/src/content/docs/api/problems-core/src/classes/Problem.mdpackages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.mdpackages/docs/src/content/docs/en/reference/problem-recovery-cookbook.mdpackages/lifecycle-core/README.mdpackages/lifecycle-core/package.jsonpackages/lifecycle-core/src/index.tspackages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.tspackages/lifecycle-core/src/libs/monetization.tspackages/lifecycle-core/src/libs/problems/LifecycleProblems.tspackages/lifecycle-core/src/libs/types.tspackages/lifecycle-core/src/tests/MonetizationLifecycle.spec.tspublic-api-surface.snapshot.json
26b9c8b to
d5a994c
Compare
|
@coderabbitai resolve |
✅ Action performedComments resolved and changes approved. |
Outcome
Fixes #1571
Verification
Review gates
Residual risk
The included stores are in-memory reference implementations. Distributed deployments must provide durable MonetizationThresholdStore and MonetizationConditionStore adapters with equivalent atomic claim and ordering semantics.
Summary by CodeRabbit
새 기능
문서
버그 수정