Skip to content

[pm-manager/pm-coder][refund-policy-page] the refund policy page + reconcile the ToS contradiction (Odoo #7729 S1) — HOLD for Hassan's click - #147

Merged
Smetools merged 2 commits into
mainfrom
hassan-refund-policy-page
Aug 6, 2026
Merged

[pm-manager/pm-coder][refund-policy-page] the refund policy page + reconcile the ToS contradiction (Odoo #7729 S1) — HOLD for Hassan's click#147
Smetools merged 2 commits into
mainfrom
hassan-refund-policy-page

Conversation

@Smetools

@Smetools Smetools commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

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/2331

The 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:

  • Terms of Service (app/app/terms/page.tsx): "Fees are non-refundable except as required by law or as expressly stated in these Terms."
  • Offer page (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/main today before writing anything, then re-derived what to do about it (used an Opus advisor pass first, per knowcap 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 /terms route 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)

  1. 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.
  2. 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): no dangerouslySetInnerHTML/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

  • New Features
    • Added a dedicated Refund Policy page with refund terms, eligibility details, request instructions, payment processing information, and navigation.
    • Added Refund Policy links to the offer page and site footer.
    • Added refund-guarantee language to the paid-plan billing terms.

…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
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
knowcap-landing Ready Ready Preview Aug 6, 2026 10:56am

Request Review

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The 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.

Changes

Refund policy

Layer / File(s) Summary
Refund Policy page
app/app/refund-policy/page.tsx
Adds refund terms, section navigation, pilot guarantee conditions, request instructions, processing details, document-title setup, and back-to-top behavior.
Policy links and billing terms
app/app/offer/page.tsx, app/app/terms/page.tsx, app/components/editorial/shell.tsx
Adds Refund Policy links to the offer page and editorial footer. Updates billing terms to reference refund guarantees published in the policy.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 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 clearly identifies the refund policy page and the Terms of Service reconciliation, which are the main changes in the pull request.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch hassan-refund-policy-page

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.

@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: 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

📥 Commits

Reviewing files that changed from the base of the PR and between f63e9d0 and 4313780.

📒 Files selected for processing (5)
  • app/app/offer/page.tsx
  • app/app/refund-policy/page.tsx
  • app/app/terms/page.tsx
  • app/components/editorial/shell.tsx
  • app/components/terms-of-service-content.tsx
💤 Files with no reviewable changes (1)
  • app/components/terms-of-service-content.tsx

Comment thread app/app/terms/page.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>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 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.

@Smetools
Smetools merged commit 8452c49 into main Aug 6, 2026
3 checks passed
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.

1 participant