Skip to content

fix(lifecycle-core): align dry-run suppression with receipt expiry - #3500

Merged
kang-heewon merged 2 commits into
trunkfrom
fix/3223-receipt-preview
Oct 11, 2026
Merged

kang-heewon merged 2 commits into
trunkfrom
fix/3223-receipt-preview

Conversation

@kang-heewon

@kang-heewon kang-heewon commented Oct 11, 2026 •

Copy link
Copy Markdown
Member

Closes #3223.

Finalized receipt가 TTL에 도달하면 dry-run의 중복 억제·cooldown 판정이 같은 context.now의 실제 claim과 일치합니다. 만료 기준은 completedAt + receiptTtlMs <= context.now이며, indeterminate dispatch evidence는 계속 재실행을 억제합니다.

조회 메서드의 선택적 evaluatedAt으로 활성 receipt를 조회합니다. 인자를 생략한 기존 이력 조회는 유지하며, 미리보기는 receipt를 삭제하거나 claim·액션·cooldown을 소비하지 않습니다. 실제 claim의 만료 제거 정책과 기본 TTL은 유지합니다.

Validation

Elevated: 공개 store 조회 계약과 receipt idempotency.

  • 수정 전 TTL 경계·이후의 receipt/cooldown 회귀 assertion 4개 실패, 수정 후 통과.
  • lifecycle-core 149개 테스트, typecheck·lint·의존 패키지 및 ESM/CJS 선언 build 통과.
  • 이슈 원본 독립 fixture 통과: preview suppressed=false, actual succeeded, emissions 2.
  • 전체 test 311개 task 통과. 고정 임시 파일 경로는 실행별 TMP/TEMP로 격리했으며 훅·검증 설정·시간 제한은 유지.
  • 전체 build 302개 task, guarded 전체 typecheck 328개 task, 생성 API 문서 drift 검사, architecture/public API 계약 검사 통과.
  • pnpm check의 27개 통과·1개 비적용 결과를 재사용하고, 유일한 실패였던 benchmark를 같은 임계값으로 재실행해 통과.
  • 독립 코드 리뷰와 검증 리뷰 PASS. 최종 코드 정리 점검은 변경 없이 통과.

Head 895b2e8b45c293f9c4a4391d290fd85dcd0ebb2a, current trunk a7bf96ead90454032ec71847ae3b9a3868422cc8. 이후 HTTP·metrics·QStash·protocol schema 변경과 Problem registry 동기화, browser test harness 변경은 receipt 계약과 상호작용하지 않으며 병합 충돌이 없습니다. CI 재시작을 위한 빈 커밋은 소스 트리를 유지하므로 기존 로컬 검증과 독립 리뷰 증거를 재사용합니다.

Scope

외부 persistence, signal identity, 기본 TTL, 원격 액션은 변경하지 않습니다. 별도 저장소에 TTL 정책이 있다면 문서화된 evaluatedAt 읽기 계약을 구현해야 합니다. Preview는 실행 예약이 아니므로 두 호출 사이의 동시 상태 변경은 보장 범위 밖입니다.

Visual evidence

API 문서의 receipt 조회 계약, viewport 1440×1000. 정적 문서 변경이며 브라우저 오류와 가로 overflow가 없습니다.

  • /api/lifecycle-core/src/interfaces/lifecyclerunstore/, lookup methods

LifecycleRunStore lookup contract

  • /api/lifecycle-core/src/classes/inmemorylifecyclerunstore/, lookup methods

InMemoryLifecycleRunStore lookup contract

CI

현재 head의 CI, Performance Benchmark, PR Review Companion가 모두 통과했습니다. 문서 링크의 일시적 GitHub 503 실패도 재실행으로 통과했으며, 로컬 Elevated 검증과 독립 리뷰, 필수·선택 CI가 충족됐습니다.

Copilot AI balanced review requested due to automatic review settings October 11, 2026 05:50

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 39 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 67434dd7-6c5f-436d-9b52-c234cd073f04

📥 Commits

Reviewing files that changed from the base of the PR and between 4d3b429 and 895b2e8.


📒 Files selected for processing (9)
  • .changeset/tidy-receipt-preview.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/classes/InMemoryLifecycleRunStore.md
  • packages/docs/src/content/docs/api/lifecycle-core/src/interfaces/LifecycleRunStore.md
  • packages/lifecycle-core/README.md
  • packages/lifecycle-core/src/libs/InMemoryLifecycleRunStore.ts
  • packages/lifecycle-core/src/libs/LifecycleRuleEvaluator.ts
  • packages/lifecycle-core/src/libs/types.ts
  • packages/lifecycle-core/src/tests/LifecycleCore.spec.ts
  • packages/lifecycle-core/src/tests/LifecycleSourceIdentity.spec.ts

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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 Oct 11, 2026 •

Copy link
Copy Markdown

📊 Benchmark Results

✅ All benchmarks passed

Benchmark p75 Threshold Baseline vs Baseline Status Notes
CrocoApp constructor 11.3μs 30.0ms 8.2μs +37.7% ❌ -
CrocoApp lambdaHandler (10 controllers) 1.5ms 50.0ms 258.4μs +488.8% ❌ -
Lambda cold-start simulation 1.7ms 80.0ms 418.1μs +299.1% ❌ -
Lambda cold-start with headers 1.5ms 80.0ms 369.7μs +318.0% ❌ -
Lambda cold-start with binary body 1.5ms 80.0ms 339.1μs +330.5% ❌ -
Lambda cold-start with query params 1.4ms 80.0ms 301.3μs +373.9% ❌ -
Lambda cold-start with authorizer context 1.4ms 80.0ms 299.8μs +379.2% ❌ -
Lambda cold-start realistic scenario 1.4ms 80.0ms 299.2μs +370.9% ❌ -
EventBusConfig.start (10 handlers) 5.5μs 10.0ms 1.4μs +283.1% ❌ -
EventPublisher.publishNow single event 2.3μs 2.0ms 1.7μs +39.3% ❌ -
DefaultHandlerResolver.resolve × 10 0.2μs 5.0ms 0.1μs +113.8% ❌ -
Container.get singleton (cold) 117.1μs 5.0ms 70.3μs +66.7% ❌ -
Container.register × 50 components 3.2ms 10.0ms 3.2ms -0.8% ✅ -
Container.validate (50 components) 3.5ms 20.0ms 3.4ms +3.9% ✅ -
Container.get singleton (warm) 1.0μs 500.0μs 1.6μs -38.6% ✅ -
TelemetryRuntime.init (lambda preset) 13.7μs 200.0ms 1.1ms -98.8% ✅ -
lambdaPreset config creation 1.4μs 2.0ms 1.4μs +0.1% ✅ -

Updated: 2026-10-11T11:24:51.843Z · Commit: 895b2e8

@kang-heewon kang-heewon reopened this Oct 11, 2026
@kang-heewon
kang-heewon merged commit b19987a into trunk Oct 11, 2026
34 of 35 checks passed
@kang-heewon
kang-heewon deleted the fix/3223-receipt-preview branch October 11, 2026 13:46
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] 만료된 receipt를 dryRun이 계속 중복 억제로 표시하지만 실제 evaluate는 액션을 다시 실행한다

2 participants