chore(openspec): archive wallapop-make-offer + promote spec deltas - #56
Conversation
Promotes the new wallapop-offer-flow capability spec (with a real Purpose) and applies the two MODIFIED deltas (shipping-aware-pricing ceiling carve-out, listing-alert-state-updates offer-aware keyboard reconstruction) to openspec/specs/, then moves the change to openspec/changes/archive/2026-07-23-wallapop-make-offer/. 'openspec validate --specs --strict': 8/8 pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Djngz3hScLAcRoyKtBCZgb
📝 WalkthroughWalkthroughAdds archived and active specifications for an operator-confirmed Wallapop offer flow, covering eligibility, amount calculation, execution safeguards, Telegram alert states, budgets, lockout behavior, configuration, and audit persistence. ChangesWallapop offer flow
Estimated code review effort: 2 (Simple) | ~15 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 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 `@openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md`:
- Around line 31-32: Align the negotiable-band predicate across
openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md lines 31-32,
proposal.md lines 12-17, and tasks.md lines 14-17: retain over-ceiling listings
only when a computed offer is valid, strictly undercuts the buyer total, and
meets the 70% floor; state that floor-invalid listings produce no negotiable
alerts, and add the corresponding negative test to task 3.1.
In `@openspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.md`:
- Around line 32-39: Update the affected-code configuration inventory to include
offer.daily_limit, offer.lockout_threshold, and per-entry offer.target_total_eur
alongside band_pct and kill_switch, with each setting’s default documented; if
any are intentionally excluded, explicitly mark them out of scope so the PRD and
configuration examples remain consistent.
In `@openspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.md`:
- Line 51: Update task 8.2 to separate passing test gates from the two known
/app sandbox failures: explicitly document whether those tests are excluded or
marked xfail and identify their exact scope, while retaining “pytest green” only
for the remaining test suite.
In `@openspec/specs/shipping-aware-pricing/spec.md`:
- Around line 80-81: Replace the archival placeholder Purpose in the active
shipping-aware-pricing specification with a concise statement describing the
specification’s purpose, reflecting the promoted shipping-aware pricing and
offer-band behavior. Leave the normative requirement unchanged.
In `@openspec/specs/wallapop-offer-flow/spec.md`:
- Line 77: The offer preflight contract must atomically claim the listing and
reserve serialized daily budget before any execution. Update
openspec/specs/wallapop-offer-flow/spec.md at lines 77-77 and mirror the same
per-listing in-flight claim and serialized budget-reservation guarantee in
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md
at lines 74-74, while preserving the existing safety-abort requirements.
- Line 8: Update the offer target definition in the current specification at
openspec/specs/wallapop-offer-flow/spec.md:8-8 and the archived specification at
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md:5-5
to include max_price_in_device as the fallback when it is part of the entry’s
effective ceiling, while preserving the existing offer.target_total_eur
precedence and max_price_solo behavior.
- Line 103: Classify every send-uncertain outcome explicitly in the
OfferFailureReason requirements, and update both current and archived specs:
openspec/specs/wallapop-offer-flow/spec.md lines 103-103 and 119-119, plus
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md
lines 100-100 and 119-119. Ensure ambiguous outcomes remain terminal until
reconciled and never restore a tappable Ofertar row; mirror the same
classification and non-tappable retry behavior in the archived specification.
- Line 140: Define fail-closed reconstruction when offer recomputation returns
no offer: an alert still above its ceiling or otherwise no longer eligible must
render without the offer line and with the Ofertar action unavailable. Apply
this rule in openspec/specs/wallapop-offer-flow/spec.md (lines 140-140),
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md
(lines 140-140), and the corresponding reconstruction and price-change scenarios
in openspec/specs/listing-alert-state-updates/spec.md (lines 105-105 and
132-135) plus its archive mirror (lines 7-7 and 34-37).
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: de4f112f-1e76-42f5-8df3-59fc823cc66f
⛔ Files ignored due to path filters (3)
openspec/changes/archive/2026-07-23-wallapop-make-offer/captures/app-listing-hacer-oferta-button.jpgis excluded by!**/*.jpgopenspec/changes/archive/2026-07-23-wallapop-make-offer/captures/app-offer-form-10-restantes.jpgis excluded by!**/*.jpgopenspec/changes/archive/2026-07-23-wallapop-make-offer/captures/app-offer-form-floor-30pct.jpgis excluded by!**/*.jpg
📒 Files selected for processing (11)
openspec/changes/archive/2026-07-23-wallapop-make-offer/.openspec.yamlopenspec/changes/archive/2026-07-23-wallapop-make-offer/captures/NOTES.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/design.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/specs/listing-alert-state-updates/spec.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/specs/shipping-aware-pricing/spec.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.mdopenspec/specs/listing-alert-state-updates/spec.mdopenspec/specs/shipping-aware-pricing/spec.mdopenspec/specs/wallapop-offer-flow/spec.md
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: 8
🤖 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 `@openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md`:
- Around line 31-32: Align the negotiable-band predicate across
openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md lines 31-32,
proposal.md lines 12-17, and tasks.md lines 14-17: retain over-ceiling listings
only when a computed offer is valid, strictly undercuts the buyer total, and
meets the 70% floor; state that floor-invalid listings produce no negotiable
alerts, and add the corresponding negative test to task 3.1.
In `@openspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.md`:
- Around line 32-39: Update the affected-code configuration inventory to include
offer.daily_limit, offer.lockout_threshold, and per-entry offer.target_total_eur
alongside band_pct and kill_switch, with each setting’s default documented; if
any are intentionally excluded, explicitly mark them out of scope so the PRD and
configuration examples remain consistent.
In `@openspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.md`:
- Line 51: Update task 8.2 to separate passing test gates from the two known
/app sandbox failures: explicitly document whether those tests are excluded or
marked xfail and identify their exact scope, while retaining “pytest green” only
for the remaining test suite.
In `@openspec/specs/shipping-aware-pricing/spec.md`:
- Around line 80-81: Replace the archival placeholder Purpose in the active
shipping-aware-pricing specification with a concise statement describing the
specification’s purpose, reflecting the promoted shipping-aware pricing and
offer-band behavior. Leave the normative requirement unchanged.
In `@openspec/specs/wallapop-offer-flow/spec.md`:
- Line 77: The offer preflight contract must atomically claim the listing and
reserve serialized daily budget before any execution. Update
openspec/specs/wallapop-offer-flow/spec.md at lines 77-77 and mirror the same
per-listing in-flight claim and serialized budget-reservation guarantee in
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md
at lines 74-74, while preserving the existing safety-abort requirements.
- Line 8: Update the offer target definition in the current specification at
openspec/specs/wallapop-offer-flow/spec.md:8-8 and the archived specification at
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md:5-5
to include max_price_in_device as the fallback when it is part of the entry’s
effective ceiling, while preserving the existing offer.target_total_eur
precedence and max_price_solo behavior.
- Line 103: Classify every send-uncertain outcome explicitly in the
OfferFailureReason requirements, and update both current and archived specs:
openspec/specs/wallapop-offer-flow/spec.md lines 103-103 and 119-119, plus
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md
lines 100-100 and 119-119. Ensure ambiguous outcomes remain terminal until
reconciled and never restore a tappable Ofertar row; mirror the same
classification and non-tappable retry behavior in the archived specification.
- Line 140: Define fail-closed reconstruction when offer recomputation returns
no offer: an alert still above its ceiling or otherwise no longer eligible must
render without the offer line and with the Ofertar action unavailable. Apply
this rule in openspec/specs/wallapop-offer-flow/spec.md (lines 140-140),
openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md
(lines 140-140), and the corresponding reconstruction and price-change scenarios
in openspec/specs/listing-alert-state-updates/spec.md (lines 105-105 and
132-135) plus its archive mirror (lines 7-7 and 34-37).
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: de4f112f-1e76-42f5-8df3-59fc823cc66f
⛔ Files ignored due to path filters (3)
openspec/changes/archive/2026-07-23-wallapop-make-offer/captures/app-listing-hacer-oferta-button.jpgis excluded by!**/*.jpgopenspec/changes/archive/2026-07-23-wallapop-make-offer/captures/app-offer-form-10-restantes.jpgis excluded by!**/*.jpgopenspec/changes/archive/2026-07-23-wallapop-make-offer/captures/app-offer-form-floor-30pct.jpgis excluded by!**/*.jpg
📒 Files selected for processing (11)
openspec/changes/archive/2026-07-23-wallapop-make-offer/.openspec.yamlopenspec/changes/archive/2026-07-23-wallapop-make-offer/captures/NOTES.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/design.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/specs/listing-alert-state-updates/spec.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/specs/shipping-aware-pricing/spec.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.mdopenspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.mdopenspec/specs/listing-alert-state-updates/spec.mdopenspec/specs/shipping-aware-pricing/spec.mdopenspec/specs/wallapop-offer-flow/spec.md
🛑 Comments failed to post (8)
openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md (1)
31-32: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Align all negotiable-band documents on the valid-offer predicate.
The canonical shipping-aware-pricing spec and runtime keep an over-ceiling listing only when a valid computed offer exists; these three archived documents describe the band as unconditional. Add the strict-undercut and 70%-floor condition at every site.
openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md#L31-L32: require a valid offer amount in D3.openspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.md#L12-L17: state that floor-invalid listings do not produce negotiable alerts.openspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.md#L14-L17: add the predicate and corresponding negative test to task 3.1.📍 Affects 3 files
openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md#L31-L32(this comment)openspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.md#L12-L17openspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.md#L14-L17🤖 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 `@openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md` around lines 31 - 32, Align the negotiable-band predicate across openspec/changes/archive/2026-07-23-wallapop-make-offer/design.md lines 31-32, proposal.md lines 12-17, and tasks.md lines 14-17: retain over-ceiling listings only when a computed offer is valid, strictly undercuts the buyer total, and meets the 70% floor; state that floor-invalid listings produce no negotiable alerts, and add the corresponding negative test to task 3.1.openspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.md (1)
32-39: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Complete the public configuration inventory.
The affected-code list mentions only
band_pctandkill_switch, while the design/tasks exposedaily_limit,lockout_threshold, and per-entrytarget_total_eur. List all names and defaults, or explicitly mark them out of scope, to prevent the PRD and configuration examples from drifting.🤖 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 `@openspec/changes/archive/2026-07-23-wallapop-make-offer/proposal.md` around lines 32 - 39, Update the affected-code configuration inventory to include offer.daily_limit, offer.lockout_threshold, and per-entry offer.target_total_eur alongside band_pct and kill_switch, with each setting’s default documented; if any are intentionally excluded, explicitly mark them out of scope so the PRD and configuration examples remain consistent.openspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.md (1)
51-51: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Separate passing gates from excepted failures.
“pytest green” is inconsistent with “the 2 known
/appsandbox fails excepted.” Record whether those tests are excluded or xfailed, with their exact scope; otherwise the release-readiness checklist can mask a genuine regression.🤖 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 `@openspec/changes/archive/2026-07-23-wallapop-make-offer/tasks.md` at line 51, Update task 8.2 to separate passing test gates from the two known /app sandbox failures: explicitly document whether those tests are excluded or marked xfail and identify their exact scope, while retaining “pytest green” only for the remaining test suite.openspec/specs/shipping-aware-pricing/spec.md (1)
80-81: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Replace the active spec’s placeholder Purpose before promotion.
The canonical file still contains
TBD - created by archiving change shipping-aware-pricing. Update Purpose after archive.on Line 4 even though this PR applies and promotes the requirement. Add a concise purpose so generated specification documentation is not left with archival scaffolding.🤖 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 `@openspec/specs/shipping-aware-pricing/spec.md` around lines 80 - 81, Replace the archival placeholder Purpose in the active shipping-aware-pricing specification with a concise statement describing the specification’s purpose, reflecting the promoted shipping-aware pricing and offer-band behavior. Leave the normative requirement unchanged.openspec/specs/wallapop-offer-flow/spec.md (4)
8-8: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Align the documented offer target with the implemented effective ceiling.
openspec/specs/wallapop-offer-flow/spec.md#L8-L8: document themax_price_in_devicefallback if it is part of the effective ceiling.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L5-L5: apply the same target definition in the archived copy.📍 Affects 2 files
openspec/specs/wallapop-offer-flow/spec.md#L8-L8(this comment)openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L5-L5🤖 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 `@openspec/specs/wallapop-offer-flow/spec.md` at line 8, Update the offer target definition in the current specification at openspec/specs/wallapop-offer-flow/spec.md:8-8 and the archived specification at openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md:5-5 to include max_price_in_device as the fallback when it is part of the entry’s effective ceiling, while preserving the existing offer.target_total_eur precedence and max_price_solo behavior.
77-77: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Make offer preflight atomic across both specifications.
openspec/specs/wallapop-offer-flow/spec.md#L77-L77: require a per-listing in-flight claim and serialized daily-budget reservation before execution.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L74-L74: mirror the same concurrency guarantee in the archived contract.📍 Affects 2 files
openspec/specs/wallapop-offer-flow/spec.md#L77-L77(this comment)openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L74-L74🤖 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 `@openspec/specs/wallapop-offer-flow/spec.md` at line 77, The offer preflight contract must atomically claim the listing and reserve serialized daily budget before any execution. Update openspec/specs/wallapop-offer-flow/spec.md at lines 77-77 and mirror the same per-listing in-flight claim and serialized budget-reservation guarantee in openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md at lines 74-74, while preserving the existing safety-abort requirements.
103-103: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Make ambiguous outcomes terminal until reconciled.
openspec/specs/wallapop-offer-flow/spec.md#L103-L103: classify all send-uncertain failures explicitly.openspec/specs/wallapop-offer-flow/spec.md#L119-L119: do not restore a tappableOfertarrow for those outcomes.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L100-L100: mirror the ambiguity classification.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L119-L119: mirror the non-tappable retry behavior.📍 Affects 2 files
openspec/specs/wallapop-offer-flow/spec.md#L103-L103(this comment)openspec/specs/wallapop-offer-flow/spec.md#L119-L119openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L100-L100openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L119-L119🤖 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 `@openspec/specs/wallapop-offer-flow/spec.md` at line 103, Classify every send-uncertain outcome explicitly in the OfferFailureReason requirements, and update both current and archived specs: openspec/specs/wallapop-offer-flow/spec.md lines 103-103 and 119-119, plus openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md lines 100-100 and 119-119. Ensure ambiguous outcomes remain terminal until reconciled and never restore a tappable Ofertar row; mirror the same classification and non-tappable retry behavior in the archived specification.
140-140: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Define fail-closed rendering when recomputation returns no offer.
openspec/specs/wallapop-offer-flow/spec.md#L140-L140: specify the behavior when the listing remains above ceiling but loses offer eligibility.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L140-L140: mirror that behavior.openspec/specs/listing-alert-state-updates/spec.md#L105-L105: define the reconstruction result for an invalidated negotiable offer.openspec/specs/listing-alert-state-updates/spec.md#L132-L135: cover invalidation in the price-change scenario.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/listing-alert-state-updates/spec.md#L7-L7: mirror the reconstruction rule.openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/listing-alert-state-updates/spec.md#L34-L37: mirror the scenario coverage.📍 Affects 4 files
openspec/specs/wallapop-offer-flow/spec.md#L140-L140(this comment)openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md#L140-L140openspec/specs/listing-alert-state-updates/spec.md#L105-L105openspec/specs/listing-alert-state-updates/spec.md#L132-L135openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/listing-alert-state-updates/spec.md#L7-L7openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/listing-alert-state-updates/spec.md#L34-L37🤖 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 `@openspec/specs/wallapop-offer-flow/spec.md` at line 140, Define fail-closed reconstruction when offer recomputation returns no offer: an alert still above its ceiling or otherwise no longer eligible must render without the offer line and with the Ofertar action unavailable. Apply this rule in openspec/specs/wallapop-offer-flow/spec.md (lines 140-140), openspec/changes/archive/2026-07-23-wallapop-make-offer/specs/wallapop-offer-flow/spec.md (lines 140-140), and the corresponding reconstruction and price-change scenarios in openspec/specs/listing-alert-state-updates/spec.md (lines 105-105 and 132-135) plus its archive mirror (lines 7-7 and 34-37).
Version bump + CHANGELOG entry for #55/#56; README status blurb and recommended pinned tag, ROADMAP burn-in tag → 0.5.0. Claude-Session: https://claude.ai/code/session_01Djngz3hScLAcRoyKtBCZgb Co-authored-by: Claude Fable 5 <noreply@anthropic.com>



Post-merge housekeeping for #55: promotes the
wallapop-offer-flowcapability spec (Purpose written, 10 requirements) and applies the two MODIFIED deltas — the over-ceiling carve-out inshipping-aware-pricingand the offer-aware keyboard reconstruction inlisting-alert-state-updates— toopenspec/specs/, then archives the change asopenspec/changes/archive/2026-07-23-wallapop-make-offer/(captures + NOTES.md included).openspec validate --specs --strict: 8/8 pass. Docs-only; no runtime changes.🤖 Generated with Claude Code
https://claude.ai/code/session_01Djngz3hScLAcRoyKtBCZgb
Summary by CodeRabbit