Point server messages at Products, not Settings › Billing
Epic 5631 moved product configuration from Settings to the operator's Products area (PR #4959): Plans, Hosting terms (formerly Settings › Billing › Hosting), Hosting products and Jaah AI. Server-side sentences that operators read still send them to the old Settings location.
Reproduction (read-only, on develop at 2f87fd638): `grep -rn "Settings.\{0,4\}Billing" apps/api/app` turns up these operator-facing strings for sections that moved:
- `apps/api/app/hosting_provisioning.py:131` sets `_HOSTING_SETTINGS = "/settings?area=billing§ion=hosting"`. `:134` is `NO_CONNECTION = "... Set one in Settings > Billing > Hosting."` and `:136` is `_PICK_ANOTHER = " Pick another in Settings > Billing > Hosting."`. These are the catalog's NO_HOSTING sentences.
- `apps/api/app/operator_settings.py:2827` and `:2958` say "... must be one of the active plans in Settings > Billing > Plans."
- `apps/api/app/org_plan_admin.py:323` and `apps/api/app/routes/orgs.py:1030` say "Choose one of the plans in Settings > Billing > Plans."
- Docstrings that name the old place: `org_plans.py:1`, `routes/billing_hosting_prices.py:1` ("Settings > Billing > Hosting prices"), `token_billing/reconcile.py:6` ("Settings > Billing > Jaah AI").
Cause: PR #4959 changed only the web layer (AD16), and these server sentences were out of its scope. The old URLs still redirect, so the links work, but the text names a place that no longer exists.
Second, a stale test residue: `apps/api/tests/test_cloud_node_launch.py:881-973` still calls `_knobs(monkeypatch, cloud_node_instance_types=...)`. That knob was retired by PR #4954. The pin is dead, and those tests are really running against whatever the allow-list fixture seeds.
Fix:
1. Rewrite each operator-facing sentence above to name the new location: "Products › Hosting terms", "Products › Plans", "Products › Hosting products", "Products › Jaah AI". Use the same `›` style as `instance_types.NOT_ALLOWED_HINT`.
2. Point `_HOSTING_SETTINGS` at `/products?tab=hosting-terms`.
3. Update the three docstrings.
4. In `test_cloud_node_launch.py`, replace the dead `cloud_node_instance_types=` pins with the shared allow-list seeding fixture PR #4954 introduced, so each test pins the allow-list it means. Do not edit test assertions.
Stripe and Bedrock stay in Settings › Billing, so their sentences (`cron_system_activities.py`, `billing/events.py`, `token_billing/metering.py`, `routes/platform_bedrock.py`, `billing/__init__.py`) are correct and must stay as they are.
Out of scope: any web change, knob keys, validation, permissions, redirects, Stripe/Bedrock/Cloud-plumbing wording, and tenant-facing catalogue sentences (those must never name operator navigation).
Done means:
- Running `grep -rn "Settings.\{0,4\}Billing.\{0,4\}\(Plans\|Hosting\|Jaah AI\)" apps/api/app` returns nothing.
- An API test asserts that the NO_HOSTING sentence for a missing connection names "Products › Hosting terms", and that the plan-validation 422 (orgs route) names "Products › Plans". Update the existing tests that assert the old strings.
- Running `grep -n cloud_node_instance_types apps/api/tests/test_cloud_node_launch.py` returns nothing, and that file passes.
- `./dc check quick` is green, PR CI is green, and Jaah Deploy succeeds for the merge.
Outcome
Server sentences/docstrings now name Products › Plans/Hosting terms/Hosting products/Jaah AI; hosting link → /products?tab=hosting-terms; launch tests use allow_instance_types. Full gate green, PR #4984 merged, Jaah Deploy dev succeeded.
Artifacts
Activity
- Ready
- Runner started
- Runner ended (done)