feat(plans): publish honest Free and Pro
CI and Deploy / test (pull_request) Successful in 5m6s
CI and Deploy / deploy (pull_request) Has been skipped

This commit is contained in:
cesnimda
2026-08-15 18:04:18 +02:00
parent a7c25499bb
commit a25c31b93a
26 changed files with 403 additions and 93 deletions
@@ -48,6 +48,10 @@ This is the rolling action-level evidence index. `PASS (automated/runtime)` is n
| Accessibility | icon control names and keyboard-operable CV cards | PASS (components + static audit) | PASS/PARTIAL — Chromium keyboard activation | NOT RUN | `accessibility-evidence.md`, V-170 |
| Accessibility | dark semantic Alert text contrast | PASS (theme ownership) | PASS — computed Chromium contrast >= 4.5:1 | NOT RUN | `ux-002-deterministic-theme-state.md`, V-170 |
| Public CV | responsive A4/multi-page framing without inner or outer overflow | PASS (component) | PASS — 375px Chromium | NOT RUN | `accessibility-evidence.md`, V-170 |
| Public plans | exactly Free/Pro; no invented tier, price, interval, trial or unlimited claim | PASS (catalogue + landing components) | PASS — Light/Dark at 375/768/1440 | NOT RUN | `product-001-honest-plans.md`, V-171 |
| Public plans | Free registration and Pro sign-in-to-Settings actions | PASS (component) | PASS — keyboard activation | NOT RUN | `product-001-honest-plans.md`, V-171 |
| Pro promotion | benefit-specific locked notice, preserved-data copy and session dismissal | PASS (components) | NOT RUN on every contextual surface | NOT RUN | `product-001-honest-plans.md`, V-171 |
| Billing presentation | checkout/portal only when server status permits; unconfigured deployment disclosed | PASS (components + policy slice) | NOT RUN with configured Stripe | NOT RUN | `product-001-honest-plans.md`, V-171 |
| Job match terms | bilingual/noisy/short/technology-heavy/filler extraction and honest labels | PASS (seven fixtures + component tests) | NOT RUN | NOT RUN | `qa-001-job-term-quality.md` |
| Career Workspace | first/returning/incomplete/loading/import processing/review/failure and recent CV actions | PASS (components; approval gate regression) | NOT RUN | NOT RUN | `career-001-career-workspace.md` |
| CV Builder | edit/collapse/add/delete/reorder/hide, save states/latest-data retry, navigation warning and preview failure/retry | PASS (components) | NOT RUN | NOT RUN | `career-002-cv-builder.md` |
@@ -52,7 +52,7 @@ Status: `IMPLEMENTED — NOT VERIFIED`. The server policy, worker rechecks, Free
- Browser localhost access is denied by the available browser policy, so 375/768/1440, keyboard, themes and actual navigation to the upgrade action are not claimed.
- Stripe webhook transitions were code-inspected and existing status tests cover active/trialing vs expired states, but no real or mocked end-to-end checkout/webhook cycle ran in this package.
- MariaDB and production were not changed or tested.
- Landing-page prices, a third “Bring your own key” tier and “Unlimited AI” claims remain assigned to PRODUCT-001; they are not presented as resolved by POL-001.
- PRODUCT-001 removed landing-page prices, the third “Bring your own key” tier, Free AI allowance and “Unlimited AI” claims. Public capability copy now comes from one two-plan catalogue; commercial terms remain in configured Stripe Checkout.
- Full cross-feature usage accounting is incomplete. It must be centralized with AI operation execution before provider rollout; current numeric ceilings must not be advertised as universal until then.
## Rollback
@@ -0,0 +1,41 @@
# PRODUCT-001 honest Free/Pro surfaces
Updated: 2026-08-15
Status: `IMPLEMENTED — NOT VERIFIED`. Repository and local Chromium scope passes. Configured Stripe checkout, expiry/downgrade browser behavior, native assistive technology and production remain external.
## Confirmed problem
The public homepage contradicted the server policy. It advertised three tiers, fixed prices and billing intervals, a Free AI allowance, a bring-your-own-key tier and unlimited AI. The authoritative `AccountPlans` model exposes only Free and Pro, gives Free no AI admission, and applies finite Pro ceilings. Commercial terms are owned by configured Stripe Checkout, not application copy.
## Implemented contract
- `planCatalog.ts` is the single frontend source for public plan names and capability copy. It contains exactly `free` and `pro`; the server remains authoritative for enforcement and numeric entitlements.
- Free describes core non-AI tracking, correspondence/documents, manual Career Profile/CV editing, deterministic matching and data export/retention.
- Pro describes the existing AI-assisted application/CV/Career capabilities and Pro themes. It does not claim an invented price, interval, trial or unlimited usage.
- The homepage uses two semantic plan sections, sends the Free action to registration and the Pro action through sign-in to Settings. Branding is consistently Jobjakt.
- Settings shows Checkout/portal actions only when the authenticated billing status permits them. A Free user sees an honest deployment-unavailable explanation when Stripe is not configured.
- Active AI surfaces reuse a dismissible `ProFeatureNotice`. Copy is benefit-specific, preserves access to manual/existing content and never implies that work was generated.
- Product/business-model and implementation-roadmap claims now match POL-001. Historical competitor pricing remains research, not current product copy.
No backend behavior, database, dependency, billing configuration or production state changed.
## Verification
- Public catalogue, landing, reusable notice, usage card and active AI surfaces: 7 suites, 30/30 tests.
- Current server entitlement/billing-policy slice: 30/30 tests, including Free, Pro, Admin, stale-role downgrade and subscription-status behavior.
- Full frontend: 57/57 suites, 232/232 tests.
- Optimized production frontend build/TypeScript: pass.
- Full Playwright: 8/8. The public plan page shows exactly Free/Pro, contains none of the retired claims, persists explicit Light/Dark, has no horizontal overflow at 375/768/1440, and both plan actions work from the keyboard.
- `git diff --check`: pass; line-ending notices only.
## Remaining gates
- Production Stripe price/interval/trial text must continue to come from hosted Checkout. No commercial term is claimed until the configured product is inspected in the authorized production account.
- Exercise a configured Free checkout, successful webhook/role transition, portal, cancellation/expiry/downgrade and existing-data access in an authorized synthetic production account.
- Native screen-reader and switch-control spot checks remain external.
- Complete cross-feature AI usage accounting remains an AI rollout gate; the public site deliberately makes no universal numeric or unlimited claim.
## Rollback
Revert the PRODUCT-001 frontend/documentation commit. No migration or data rollback is required; server-side Free/Pro enforcement is unchanged and must not be reverted with presentation copy.