Ambiguity map
This page is intentionally not linked from the student specification.
- The first column names the planted issue.
- The middle column explains the risk students should be able to articulate
- the last column gives the canonical decision used by the supplied acceptance tests.
| Subsystem / issue | Why it matters | Canonical product decision |
|---|---|---|
| Dog age: conversion rule | “Dog terms” is undefined; real-world calculators may vary by size or breed, but size is absent. | For this fictional release, dog-age display is exactly human_years × 7.
Fractional years are permitted. This display value is not used by dosage. |
| Dog age: months | A value such as 18 could mean months or years. | Age is supplied in human years. If a UI accepts months, it must convert months ÷ 12 before calling the core logic. |
| Dog-age output “used in dosage” vs dosage age | The initial prose implies dog-years feed dosage, while the activity notes specify human years for dosage. | Dosage uses human years. The “used in dosage” sentence is stale. |
| Dosage ignores age | Age is an input but the displayed formula does not use it. | base × ((weight_kg + 5) - age_years / 3). |
| Dosage units | Weight, age, and output units are unspecified. | Weight = kg; age = human years; internal dosage = mL. Display US fluid ounces for U.S. delivery destinations and mL elsewhere. |
| One dose per “month” | Calendar month and rolling time window are different business rules. | Ordering limit uses a rolling 30-day period. |
| Medicine cost has no provider | Discounts need a base price but no named component supplies it. | Add a Medicine Cost component. Price = $0.033814057 per mL (equivalent to $1.00 per fluid ounce for this exercise). |
| Discount circular dependency | Discount takes Total_Cost, while total depends on discount/net cost. | Discounts apply to Medicine Cost, not Total_Cost. |
| Coupon reuse “once per month” | No history rule or month definition is given. | Each coupon type may be used once per owner per calendar month. History supplies the evidence. |
| Two 10% coupons | Concurrent vs sequential percentage discounts differ. | Coupons are applied sequentially, in the order supplied. Duplicate coupon types in one transaction are rejected by the once-per-calendar-month rule. |
| BOGO conflicts with one-dose limit | A “buy one get one” promotion requires quantity, but the system allows one dose. | BOGO is a stale coupon and is rejected for this release. This is an example of removing an inconsistent requirement rather than inventing behavior. |
| Owner location vs delivery location | Tax and shipping depend on destination, which may differ from current owner location. | Shipping and tax use Delivery Location. Owner Location remains separate metadata. |
| U.S. territories missing | The table is incomplete. | Unsupported destinations produce a clear input error; students should not silently guess a rate. |
| PennsylvaniaRhode Island merged | A malformed lookup key can make two valid locations impossible to use. | Treat Pennsylvania and Rhode Island as separate valid keys using the same provided value in this dataset. |
| Tax rates look like percentages | Multiplying by 5.59 vs 0.0559 changes tax by 100×. | The table stores percentages: tax = net × rate ÷ 100. A zero rate is valid. |
| Tax and shipping data are suspiciously identical | Copy/paste data can be syntactically valid but semantically wrong. | Use the supplied values for the exercise, but record the data-quality risk. The reduced table intentionally includes a few rows where tax and shipping differ. |
| Shipping formula adds Net Cost | The output is named Shipping Cost but the formula returns merchandise + shipping. | Shipping Cost is the lookup fee only. |
| Total Cost uses undefined X and omits shipping | The total cannot be computed consistently as written. | Total = Net Cost + Shipping Cost + Tax Amount. The Dosage × X sentence is
obsolete because medicine cost has already been computed. |
| Purchase Date source | History and monthly rules depend on a date that no component creates. | Checkout supplies the purchase date. Production would use the system clock; tests pass a date explicitly for determinism. |
| Rounding | Rounding inside a pipeline can accumulate error and make integrations disagree. | Keep full precision internally; round currency to two decimals only for display. Acceptance tests compare with tolerance. |