[pm-manager/pm-coder][refund-policy-page] the refund policy page + reconcile the ToS contradiction (Odoo #7729 S1) — HOLD for Hassan's click - #147
Conversation
…cy page (Odoo #7729 S1, part 1/2) New /refund-policy page states what actually happens today: standard paid plans are non-refundable except as required by law; the Odoo Partner Edition pilot offer carries a specific 30-day conditional guarantee, mirrored verbatim from the offer page's own three conditions (not restated as an unconditional promise). Explains how to ask, both in-app and by email. Odoo: https://smetools.odoo.com/odoo/project.task/7729
…radictory refund statements (Odoo #7729 S1, part 2/2)
Hassan ruled 2026-08-04 (recorded on Odoo #7729's chatter): honour the
offer page's 100% guarantee and fix the Terms of Service, which flatly
contradicted it ("fees are non-refundable..."). That ruling was never
carried into this card's 2026-08-06 rescoping and had not been acted on.
- app/terms/page.tsx: the live ToS billing clause now carves out "or under
a refund guarantee published in our Refund Policy" instead of asserting
a blanket non-refundable rule the site was simultaneously contradicting.
- app/offer/page.tsx: links the guarantee to the new /refund-policy page.
- components/editorial/shell.tsx: adds Refund Policy to the shared footer
nav, alongside the existing Privacy/Terms links.
- components/terms-of-service-content.tsx: DELETED. Verified dead — zero
imports anywhere in the repo, only its own self-reference. It carried a
byte-identical copy of the same contradictory clause; two copies of one
legal clause where only one renders is the next version of this incident.
Odoo: https://smetools.odoo.com/odoo/project.task/7729
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughThe PR adds a client-side Refund Policy page, links to it from the offer page and editorial footer, updates paid-plan billing terms, and removes the previous terms content component. ChangesRefund policy
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 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 |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@app/app/terms/page.tsx`:
- Line 111: Update the “Last updated” date in the Terms page header to August 6,
2026, matching the publication date for the billing refund exception change;
leave the surrounding Terms content unchanged.
🪄 Autofix
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 Plus
Run ID: 772bd217-b7b0-4917-a4fd-470e6af0a9d1
📒 Files selected for processing (5)
app/app/offer/page.tsxapp/app/refund-policy/page.tsxapp/app/terms/page.tsxapp/components/editorial/shell.tsxapp/components/terms-of-service-content.tsx
💤 Files with no reviewable changes (1)
- app/components/terms-of-service-content.tsx
| </p> | ||
| <ul> | ||
| <li><strong>Billing cycles.</strong> Paid plans are billed in advance on a monthly or annual basis, depending on the plan you select. Fees are non-refundable except as required by law or as expressly stated in these Terms.</li> | ||
| <li><strong>Billing cycles.</strong> Paid plans are billed in advance on a monthly or annual basis, depending on the plan you select. Fees are non-refundable except as required by law, as expressly stated in these Terms, or under a refund guarantee published in our <a href="/refund-policy">Refund Policy</a>.</li> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Update the Terms “Last updated” date.
Line 111 changes the billing refund exception. The page still shows “Last updated: June 14, 2026” at Line 25. Section 13 states that Terms updates change this date. Set it to August 6, 2026, or to the actual publication date.
🤖 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 `@app/app/terms/page.tsx` at line 111, Update the “Last updated” date in the
Terms page header to August 6, 2026, matching the publication date for the
billing refund exception change; leave the surrounding Terms content unchanged.
Agent: pm-manager / pm-coder · run 22
PUBLIC WEB — do not merge this PR as an agent. It publishes a legal/refund policy page and edits the live Terms of Service to strangers. Hassan clicks merge himself, per standing rule.
What this is
Slice S1 of Odoo #7729 ("A refund a customer can actually ask for") — the written policy, findable by a logged-out stranger before they pay. Slice S2 (the in-app route to ask) is a separate PR on
knowcap Main: https://github.com/Knowcap-V2/knowcap/pull/2331The finding this PR exists to fix, not just the original card's scope
Hassan ruled on 2026-08-04 (recorded on Odoo #7729's chatter, message 158485) that the site carried two live, contradictory refund statements at once:
app/app/terms/page.tsx): "Fees are non-refundable except as required by law or as expressly stated in these Terms."app/app/offer/page.tsx): "We will refund 100% of your subscription."His ruling: honour the 100% guarantee, fix the Terms. That ruling had not been acted on — it was dropped from this card's 2026-08-06 rescoping, which excluded "the wider terms-of-service question" without citing it. I verified the contradiction is still live on
origin/maintoday before writing anything, then re-derived what to do about it (used an Opus advisor pass first, perknowcap Main/CLAUDE.md's contradictory-constraints escalation rule, given this touches money/legal copy) rather than either silently expanding scope or silently ignoring a direct, unreversed ruling.Correction the advisor pass caught that I verified myself: the file I was about to edit (
terms-of-service-content.tsx) is dead code — zero imports anywhere in the repo. The LIVE/termsroute is a separate file (app/app/terms/page.tsx) carrying a byte-identical copy of the same clause. Editing the dead file would have changed nothing a visitor sees.Changes (2 commits)
app/app/refund-policy/page.tsx(new) — states what actually happens today, not an aspiration: standard paid plans are non-refundable except as required by law; the Odoo Partner Edition pilot offer carries a specific 30-day conditional guarantee, restated verbatim from the offer page's own three named conditions (not an unconditional "100% refund" claim — the actual guarantee is conditional, and overstating it would be a bigger exposure than Hassan accepted). Explains how to ask: in-app via the new Contact Support → Refund Request route (S2), or by email if not signed in.app/app/terms/page.tsx— the live billing clause now carves out "or under a refund guarantee published in our Refund Policy" instead of a blanket non-refundable rule the site was simultaneously contradicting. One sentence changed, no other terms invented.app/app/offer/page.tsx— links the guarantee to the new page.app/components/editorial/shell.tsx— adds Refund Policy to the shared footer nav (same pattern as the adjacent Privacy/Terms links).app/components/terms-of-service-content.tsx— deleted. Confirmed dead (zero imports repo-wide, only its own self-reference). It carried the same contradictory clause; two copies of one legal clause where only one renders is the next version of this exact incident.Gates — this repo runs NEITHER /bug-radar NOR /security-review in CI, so this is the only pass either gate gets
/security-review: independent security-reviewer subagent, explicit worktree path. PASS, 0 findings ≥8/10. Confirmed independently (not on my say-so): nodangerouslySetInnerHTML/dynamic rendering anywhere in the diff, no secrets/internal URLs, the dead-code deletion re-verified dead by the reviewer's own repo-wide grep, no new dependency/route/form/data path./bug-radar-equivalent reasoning (no escapes-ledger class applies — this diff is static JSX content with zero new logic, no discriminant values, no async/catch paths): typecheck clean (tsc --noEmit, 0 errors).Success criterion this PR is actually accountable to
Card criterion: "WHEN the policy is written, THEN it SHALL state what actually happens today, not an aspiration. A refund promise nobody can honour is worse than none." This PR is what makes that true — before it, the site asserted two different things about refunds at once and neither page said what a customer should actually expect.
Odoo: https://smetools.odoo.com/odoo/project.task/7729
Summary by CodeRabbit