Skip to content

fix: make lifecycle rule activation auditable - #1551

Merged
kang-heewon merged 4 commits into
trunkfrom
fix/1546-versioned-lifecycle-rules
Jul 25, 2026
Merged

fix: make lifecycle rule activation auditable#1551
kang-heewon merged 4 commits into
trunkfrom
fix/1546-versioned-lifecycle-rules

Conversation

@kang-heewon

@kang-heewon kang-heewon commented Jul 25, 2026

Copy link
Copy Markdown
Member

Outcome

Lifecycle rules now have stable identities, immutable version descriptors, explicit build-artifact fingerprints, and audited activate, pause, resume, and supersede transitions. Optimistic revisions and idempotent command IDs prevent silent replacement and concurrent state races, while asynchronous state-store contracts support durable atomic persistence.

Production runs and action emissions record the exact rule version and fingerprint. Dispatch rechecks authoritative state after awaited evaluation work, so a concurrent pause prevents new actions while retaining a skipped run. Existing register, get, getAll, and match calls remain synchronous through a documented local compatibility view.

Dry runs evaluate an explicit context without dispatching, saving a production run, or consuming cooldown. Results expose only safe signal identity, boolean condition evidence, declared action descriptors, suppression decisions, and redacted Problems. Diagnostics report active, paused, unavailable, dry-run, and version-mismatch evidence.

Fixes #1546

Verification

  • lifecycle-core — 21/21 tests; lint, typecheck, and build passed
  • admin-ops — 17/17 tests; typecheck passed
  • Pre-push workspace tests — 226/226 tasks
  • Pre-push workspace typecheck — 225/225 tasks
  • Public API surface — 111 package snapshots match
  • Problem registry — 461 codes match generated evidence
  • Changeset-required gate — passed
  • Generated lifecycle API documentation — rebuilt from the final source

Review gates

  • Correctness and regression: PASS — transition matrix, immutable fingerprints, unavailable registrations, process restart, async shared-store CAS, pause-during-await, exact run evidence, and compatibility behavior are covered.
  • API, security, compatibility, and release: PASS — dry-run signal and action payloads are redacted, executable identity is an explicit build artifact contract, legacy synchronous reads are preserved and documented as local-only, generated snapshots and a minor changeset are included.
  • Maintainability and minimality: PASS — executable predicates and action mapping remain code-owned; persistence, dry-run evidence, diagnostics, and Problems use explicit exported contracts.
  • Independent adversarial review: APPROVE — final review reported no correctness, security, compatibility, or documentation findings.

Residual risk

Custom durable state stores must implement applyCommand as one atomic compare-and-swap transaction that also records command idempotency and activation history. Build pipelines must derive executableFingerprint from the deployed rule bundle and captured configuration. The synchronous compatibility view is intentionally not authoritative across processes; versioned execution and operations use the asynchronous store-backed APIs.

Summary by CodeRabbit

  • 새 기능

    • 라이프사이클 규칙의 불변 버전 등록, 활성화·일시정지·재개·대체 상태 전이를 지원합니다.
    • 규칙 버전과 실행 지문을 실행 기록, 액션 전송 및 진단 정보에 포함합니다.
    • 운영 실행 없이 규칙 평가 결과와 예상 액션을 확인하는 드라이 런을 제공합니다.
    • 버전 충돌, 잘못된 전이, 사용할 수 없는 버전 등 문제 정보를 세분화했습니다.
    • 일시정지 규칙과 버전 불일치를 진단하고, 상태에 따라 시스템을 degraded로 표시합니다.
  • 문서

    • 신규 버전 관리, 드라이 런, 상태 저장소 및 문제 복구 API 문서를 추가했습니다.

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@kang-heewon, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 31 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 87bf00b0-9242-4372-8282-01aa5a454b04

📥 Commits

Reviewing files that changed from the base of the PR and between 56e1c85 and bd062d9.

⛔ Files ignored due to path filters (1)
  • packages/problems-core/src/generated/problem-code-registry.ts is excluded by !**/generated/**
📒 Files selected for processing (61)
  • .changeset/versioned-lifecycle-rule-control.md
  • docs/problem-code-registry.json
  • packages/admin-ops/src/tests/RetryConsole.spec.ts
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleActionSink.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleDryRunStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleRuleStateStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleActionContractProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleCommandConflictProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleEvaluator.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleRegistry.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleTransitionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionConflictProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionDefinitionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/UnavailableLifecycleRuleVersionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/UnknownLifecycleRuleVersionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/WebhookLifecycleActionAdapter.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleActionAdapter.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleDryRunStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleRuleStateStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/InMemoryLifecycleRuleStateStoreOptions.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleConditionEvidence.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunInput.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunResult.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunSignalEvidence.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunSuppression.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRule.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActionDescriptor.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActivationCommand.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActivationCommandType.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActivationEvent.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleEvaluatorOptions.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleIdentityState.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleInspection.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleRegistration.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleRegistrationInput.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleRegistryOptions.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleState.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleStateMutation.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleStateStoreResult.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleVersionDescriptor.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleVersionRecord.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRun.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleSkipReason.md
  • packages/docs/src/content/docs/api/problems-core/src/classes/Problem.md
  • packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md
  • packages/docs/src/content/docs/en/reference/problem-recovery-cookbook.md
  • packages/lifecycle-core/README.md
  • packages/lifecycle-core/src/index.ts
  • packages/lifecycle-core/src/libs/InMemoryLifecycleActionSink.ts
  • packages/lifecycle-core/src/libs/InMemoryLifecycleDryRunStore.ts
  • packages/lifecycle-core/src/libs/InMemoryLifecycleRuleStateStore.ts
  • packages/lifecycle-core/src/libs/LifecycleRuleEvaluator.ts
  • packages/lifecycle-core/src/libs/LifecycleRuleRegistry.ts
  • packages/lifecycle-core/src/libs/WebhookLifecycleActionAdapter.ts
  • packages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts
  • packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts
  • packages/lifecycle-core/src/libs/types.ts
  • packages/lifecycle-core/src/tests/LifecycleCore.spec.ts
  • packages/lifecycle-core/src/tests/LifecycleRuleVersioning.spec.ts
  • public-api-surface.snapshot.json
📝 Walkthrough

Walkthrough

버전 기반 라이프사이클 룰 등록·활성화와 낙관적 상태 전이, 드라이런 평가, 실행 버전 증빙, 진단 정보, 문제 코드 및 공개 API 문서가 추가되었습니다.

Changes

라이프사이클 룰 버전 제어

Layer / File(s) Summary
버전 계약과 상태 저장소
packages/lifecycle-core/src/libs/types.ts, packages/lifecycle-core/src/libs/problems/*, packages/lifecycle-core/src/libs/InMemoryLifecycleRuleStateStore.ts
불변 버전, 상태 전이, 감사 이력, command idempotency, revision 충돌 및 관련 Problem 타입을 추가했습니다.
버전 등록과 활성화 오퍼레이션
packages/lifecycle-core/src/libs/LifecycleRuleRegistry.ts
결정적 fingerprint, registerVersion, activate, pause, resume, supersede, 버전 조회와 매칭 API를 구현했습니다.
평가, 액션 증빙과 진단
packages/lifecycle-core/src/libs/LifecycleRuleEvaluator.ts, packages/lifecycle-core/src/libs/*ActionAdapter.ts, packages/lifecycle-core/src/libs/diagnostics/*, packages/lifecycle-core/src/tests/*
버전 기반 production run, dry-run 결과 저장, 억제 사유, 액션·웹훅 증빙, version mismatch 진단과 관련 테스트를 추가했습니다.
공개 API와 문서
packages/lifecycle-core/src/index.ts, public-api-surface.snapshot.json, packages/docs/src/content/docs/api/lifecycle-core/*
새 구현체, 타입, 문제 클래스, 메서드 계약을 export·공개 API 스냅샷·API 문서에 반영했습니다.
문제 레지스트리와 운영 문서
docs/problem-code-registry.json, packages/docs/src/content/docs/en/reference/problem-recovery-cookbook.md, packages/lifecycle-core/README.md, .changeset/*
7개 lifecycle 문제 코드, 복구 문서, 버전 운영·dry-run·호환성 안내와 minor changeset을 추가했습니다.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant Registry as LifecycleRuleRegistry
  participant Store as InMemoryLifecycleRuleStateStore
  participant Evaluator as LifecycleRuleEvaluator
  participant DryRunStore as InMemoryLifecycleDryRunStore
  participant Diagnostics as LifecycleDiagnosticsProvider

  Operator->>Registry: registerVersion(input)
  Registry->>Store: saveRegistration(record)
  Operator->>Registry: activate(request)
  Registry->>Store: applyCommand(request)
  Operator->>Evaluator: dryRun(input)
  Evaluator->>Registry: getRegistrationState(ruleId, version)
  Evaluator->>DryRunStore: save(result)
  Diagnostics->>DryRunStore: list(options)
  Diagnostics-->>Operator: health details
Loading

Possibly related issues

  • #1547: lifecycle 버전 관리와 dry-run 결과를 소비하는 admin-react 콘솔의 요구사항과 직접 연결됩니다.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately reflects the main change: auditable lifecycle rule activation.
Linked Issues check ✅ Passed The changes implement versioned activation, audited transitions, dry runs, diagnostics, compatibility docs, tests, and snapshots for issue #1546.
Out of Scope Changes check ✅ Passed No clear unrelated changes stand out; the docs, tests, registry updates, and snapshots all support the lifecycle-rule versioning work.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/1546-versioned-lifecycle-rules

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.

@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown

📊 Benchmark Results

✅ All benchmarks passed

Benchmark p75 Threshold Baseline vs Baseline Status Notes
CrocoApp constructor 9.1μs 30.0ms 8.2μs +11.0% -
CrocoApp lambdaHandler (10 controllers) 252.0μs 50.0ms 258.4μs -2.5% -
Lambda cold-start simulation 429.4μs 80.0ms 418.1μs +2.7% -
Lambda cold-start with headers 382.0μs 80.0ms 369.7μs +3.3% -
Lambda cold-start with binary body 371.1μs 80.0ms 339.1μs +9.4% -
Lambda cold-start with query params 305.9μs 80.0ms 301.3μs +1.5% -
Lambda cold-start with authorizer context 295.9μs 80.0ms 299.8μs -1.3% -
Lambda cold-start realistic scenario 298.3μs 80.0ms 299.2μs -0.3% -
EventBusConfig.start (10 handlers) 1.7μs 10.0ms 1.4μs +18.1% -
EventPublisher.publishNow single event 2.0μs 2.0ms 1.7μs +16.0% -
DefaultHandlerResolver.resolve × 10 0.1μs 5.0ms 0.1μs +0.0% -
Container.get singleton (cold) 60.0μs 5.0ms 70.3μs -14.6% -
Container.register × 50 components 3.1ms 10.0ms 3.2ms -2.4% -
Container.validate (50 components) 3.6ms 20.0ms 3.4ms +7.3% -
Container.get singleton (warm) 1.6μs 500.0μs 1.6μs -2.5% -
TelemetryRuntime.init (lambda preset) 2.4μs 200.0ms 1.1ms -99.8% -
lambdaPreset config creation 1.5μs 2.0ms 1.4μs +2.8% -

Updated: 2026-07-25T22:21:50.968Z · Commit: 522ec46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts (1)

136-150: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

저하 원인을 상태 메시지에 포함하세요.

등록 불가 또는 버전 불일치만으로 degraded가 된 경우에도 메시지는 0 lifecycle run(s) and 0 action(s)만 표시합니다. 운영자가 실제 저하 원인을 확인할 수 있도록 unavailableRegistrations.lengthversionMismatchCount를 메시지에 포함하세요.

수정 예시
-            message: `${runsByStatus.failed} lifecycle run(s) and ${failedActionCount} action(s) need attention`,
+            message:
+              `${runsByStatus.failed} lifecycle run(s), ${failedActionCount} action(s), ` +
+              `${unavailableRegistrations.length} unavailable registration(s), and ` +
+              `${versionMismatchCount} version mismatch(es) need attention`,
🤖 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/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts`
around lines 136 - 150, Update the degraded status message in
LifecycleDiagnosticsProvider to include unavailableRegistrations.length and
versionMismatchCount alongside the existing failed run and action counts, so
every cause contributing to degraded status is reported.
🤖 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/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionConflictProblem.md`:
- Line 8: 각 Problem 문서의 설명을 구체적인 오류 의미로 수정하세요.
packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionConflictProblem.md:8-8은
stale optimistic revision conflict,
packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionDefinitionProblem.md:8-8은
불변 version 정의 검증 실패,
packages/docs/src/content/docs/api/lifecycle-core/src/classes/UnavailableLifecycleRuleVersionProblem.md:8-8은
executable registration 부재,
packages/docs/src/content/docs/api/lifecycle-core/src/classes/UnknownLifecycleRuleVersionProblem.md:8-8은
등록되지 않은 rule version을 설명하도록 각각 변경하세요.

In `@packages/lifecycle-core/README.md`:
- Around line 81-84: Update the executableFingerprint value in the registration
example to pass an empty string when RULE_BUNDLE_SHA256 is missing, rather than
propagating undefined. Preserve the environment variable when present so
registerVersion() can return the intended executableFingerprint validation
problem.

In `@packages/lifecycle-core/src/libs/InMemoryLifecycleRuleStateStore.ts`:
- Around line 74-76: In InMemoryLifecycleRuleStateStore, add TTL-based pruning
for expired entries in the commands map, invoked at the start of every
applyCommand call. Follow the existing InMemoryIdempotencyStore.replay
pruneExpired pattern, preserving command replay behavior for unexpired entries
while removing stale command results.

In `@packages/lifecycle-core/src/libs/LifecycleRuleEvaluator.ts`:
- Around line 246-252: LifecycleRuleEvaluator의 idempotency key 해석 흐름에서
resolveIdempotencyKey(registration, input.context)의 예외를 redaction 경계 안에서 처리하도록
변경하세요. registration.rule.idempotencyKey가 실패하면 raw 예외를 전파하지 말고 안정적인 redacted
dry-run Problem으로 변환한 뒤 해당 결과가 저장되도록 하며, 정상적인 idempotency key와
resolveSuppression 흐름은 유지하세요.

In `@packages/lifecycle-core/src/libs/LifecycleRuleRegistry.ts`:
- Around line 265-276: add a focused test for registerVersion that re-registers
the same version on the same registry instance, then issues an activation
request and verifies the request is reflected correctly. Keep existing tests
unchanged and cover the immutable-version reuse path shown by the
existingRegistration handling.

In `@packages/lifecycle-core/src/libs/types.ts`:
- Around line 331-337: Update the LifecycleDryRunStore contract in
LifecycleDryRunStore so save and list use the same sync/async result union type
as LifecycleRuleStateStoreResult<T>, allowing both void or Promise<void> and
readonly LifecycleDryRunResult[] or its Promise form. Update
LifecycleRuleEvaluator and LifecycleDiagnosticsProvider callers to await these
operations while preserving their existing behavior.
- Around line 119-128: Update the changeset for `@croco/lifecycle-core` to include
the required non-patch version bump for making ruleVersion and ruleFingerprint
mandatory in LifecycleRun and LifecycleActionAdapter.run. Keep the
rule_unavailable union addition unchanged, and ensure the breaking type-contract
changes are released together.

In `@packages/lifecycle-core/src/tests/LifecycleRuleVersioning.spec.ts`:
- Around line 231-245: Update the concurrent pause assertions around
registry.pause so they do not assume the first Promise.allSettled result
succeeds. Assert that exactly one operation is fulfilled and the other is
rejected with LifecycleRuleVersionConflictProblem, following the assertion
pattern used in the nearby test around lines 281-306.

---

Outside diff comments:
In
`@packages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts`:
- Around line 136-150: Update the degraded status message in
LifecycleDiagnosticsProvider to include unavailableRegistrations.length and
versionMismatchCount alongside the existing failed run and action counts, so
every cause contributing to degraded status is reported.
🪄 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: c96f6aed-84ac-46c1-a17b-83a5b0e49fb7

📥 Commits

Reviewing files that changed from the base of the PR and between 2a6e12c and 56e1c85.

⛔ Files ignored due to path filters (1)
  • packages/problems-core/src/generated/problem-code-registry.ts is excluded by !**/generated/**
📒 Files selected for processing (60)
  • .changeset/versioned-lifecycle-rule-control.md
  • docs/problem-code-registry.json
  • packages/admin-ops/src/tests/RetryConsole.spec.ts
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleActionSink.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleDryRunStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleRuleStateStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleActionContractProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleCommandConflictProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleEvaluator.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleRegistry.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleTransitionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionConflictProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/LifecycleRuleVersionDefinitionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/UnavailableLifecycleRuleVersionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/UnknownLifecycleRuleVersionProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/WebhookLifecycleActionAdapter.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleActionAdapter.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleDryRunStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleRuleStateStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleConditionEvidence.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunInput.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunProblem.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunResult.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunSignalEvidence.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleDryRunSuppression.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRule.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActionDescriptor.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActivationCommand.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActivationCommandType.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleActivationEvent.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleEvaluatorOptions.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleIdentityState.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleInspection.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleRegistration.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleRegistrationInput.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleRegistryOptions.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleState.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleStateMutation.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleStateStoreResult.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleVersionDescriptor.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRuleVersionRecord.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleRun.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/type-aliases/LifecycleSkipReason.md
  • packages/docs/src/content/docs/api/problems-core/src/classes/Problem.md
  • packages/docs/src/content/docs/api/problems-core/src/variables/CROCO_PROBLEM_CODE_REGISTRY.md
  • packages/docs/src/content/docs/en/reference/problem-recovery-cookbook.md
  • packages/lifecycle-core/README.md
  • packages/lifecycle-core/src/index.ts
  • packages/lifecycle-core/src/libs/InMemoryLifecycleActionSink.ts
  • packages/lifecycle-core/src/libs/InMemoryLifecycleDryRunStore.ts
  • packages/lifecycle-core/src/libs/InMemoryLifecycleRuleStateStore.ts
  • packages/lifecycle-core/src/libs/LifecycleRuleEvaluator.ts
  • packages/lifecycle-core/src/libs/LifecycleRuleRegistry.ts
  • packages/lifecycle-core/src/libs/WebhookLifecycleActionAdapter.ts
  • packages/lifecycle-core/src/libs/diagnostics/LifecycleDiagnosticsProvider.ts
  • packages/lifecycle-core/src/libs/problems/LifecycleProblems.ts
  • packages/lifecycle-core/src/libs/types.ts
  • packages/lifecycle-core/src/tests/LifecycleCore.spec.ts
  • packages/lifecycle-core/src/tests/LifecycleRuleVersioning.spec.ts
  • public-api-surface.snapshot.json

Comment thread packages/lifecycle-core/README.md
Comment thread packages/lifecycle-core/src/libs/InMemoryLifecycleRuleStateStore.ts
Comment thread packages/lifecycle-core/src/libs/LifecycleRuleEvaluator.ts Outdated
Comment thread packages/lifecycle-core/src/libs/LifecycleRuleRegistry.ts
Comment thread packages/lifecycle-core/src/libs/types.ts
Comment thread packages/lifecycle-core/src/libs/types.ts
Comment thread packages/lifecycle-core/src/tests/LifecycleRuleVersioning.spec.ts Outdated
@kang-heewon
kang-heewon force-pushed the fix/1546-versioned-lifecycle-rules branch from b7a7c12 to bd062d9 Compare July 25, 2026 22:13
@kang-heewon
kang-heewon merged commit a144d94 into trunk Jul 25, 2026
10 checks passed
@kang-heewon
kang-heewon deleted the fix/1546-versioned-lifecycle-rules branch July 25, 2026 23:08
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.

[lifecycle-core] Add versioned rule activation and dry-run evaluation

1 participant