Blog
Sorry, your browser does not support inline SVG.

Northwind and the Sensory Homunculus of Phantom Retail

Alex Woodhead

We thank Alex Woodhead for his second blog post, and hope there are many more to follow. If you would like to comment on this post, or submit a guest post for the YottaDB blog please contact us at info@yottadb.com.

TL;DR

A Claude fueled exploration of your missing product features that are of high value and or high pain points for customers in competing products. Claude understands mermaid Entity Relation Diagrams and can use them to aid research to build out new features.

  • Cost: Less than $15 of tokens
  • Duration: About 3 hours prompt processing

Sources of Inspiration

The Sensory Humunculus

In 1937 Wilder Penfield along with Edwin Boldrey and Hortense Cantile, devised the sensory homunculus. It visually communicates relation of cortex surface area serving locations of sensory input.

To give the best support to a customer you have to understand their pain ~ Anon.

Thought: Are the emotional manifestations to interaction with an electronic product analogous to a logical sensory input?

Sensory Ghosts

In 1871 American physician Silas Weir coined the phrase “Phantom Limb”. He observed and documented a syndrome among civil war amputees describing sensations as “sensory ghosts”.

Ref: Lippincott’s Magazine, vol. VIII, no. 48, December 1871

Thought experiment: When a customer interacts with your product, are you aware of “what feelings they are missing”?

Prompt Method

Armed with a minimal schema of a Northwind database and a New Mexico piñon coffee, I sat down with Claude to investigate. Lets do this!

The project files Source_Database_Schema and concepts.py are shown in their initial state. Ghost_Database_Schema.md starts as an empty file. They serve as a pattern to follow on what information is to be collated and how to relate it.

# project

Expert with relational database schemas for e-commerce ( online shopping ) and logistics ( shipping inventory and parcel delivery )
Meaning:
* the name, meaning and purpose of SQL tables
* the name, meaning and purpose of SQL columns

For purpose of this project documentation:
The phrase '[Source Database]' means the 'Northwind Database'
The phrase '[Source Table]' means a table in the 'Northwind Database'
The phrase '[Source Column]' means a column in the 'Northwind Datbase'
The phrade 'concept' means a logical placeholder for a named table or named column of a database table

Capture information context to help match with a customer natural language enquiry with common functionality that is:
* present in the [Source Database].
* missing from the [Source Database].

## Out of scope of project implementation
Mentioned for orientation
For example consider:
The customer question: "How can I track my package?"
This maps to the answer:
Pseudo concept 'tracking' ( example for illustrative purpose )
"Unfortunately we currently don't have ability to track your package. But your requirement to do this has been noted."
Here illustrative concept generalization of 'tracking' is a ghost feature for the [Source Database].

## adding ghost features
Your expert e-commerce and logistics expertise is needed to know about important *common* and *productive* functionally for customer interaction, tables, columns and features that exist on real production e-commerce and logistics systems, but are missing in the [Source Database].
These missing tables will be called 'ghost tables', with a name prefix of 'ghost'.
These missing columns will be called 'ghost columns', with a name prefix 'ghost'
For example: Source table 'nwOrders' defines an 'OrderDate' but not a 'ShippedDate' or 'DeliveredDate'.
Example: The illustrative externally determined 'ShippedDate' and 'DeliveredDate' would thus be included as 'ghostShippedDate' and 'ghostDeliveredDate' respectively. If these ghost columns are added to [Source Database] table 'nwOrders', their new enumeration names would be 'nwOrders_ghostShippedDate' and 'nwOrders_ghostDeliveredDate' respectively.
Ghost columns can be added to and removed via file Ghost_Database_Schema.md and concepts.py. However do not remove non-ghost columns from [Source Database] tables. Do not remove non-ghost tables from the [Source Database].
The file 'Ghost_Database_Schema.md' is to be populated with a larger overlay schema containing tables from [Source Database] but with ghost columns and tables added. This gives a SQL database audience understanding and documentation. This is maintained in tandem with concepts.py which must always agree ( be synchronized ).

## development environment
This is a python3 environment.

### Setup
No setup is required.
Don't create virtual environments. Just use the current python3 directly.
The file 'requirements.txt' shows available python libraries already loaded in the environment.
If you think additional dependencies are need then ask and justify why. Rationale: the pre-built development context will be reused.

## File Structure

Source_Database_Schema.md - Read-only. Shows relationships between columns in original [Source Database]
Ghost_Database_Schema.md - Expressions to recreate target [Source Database] plus additional ghost columns and ghost tables.
concepts.py - file to capture, manage, score and relate database tables and names

## Rules
Don't suggest adding or removing tables from the [Source Database]
Don't suggest removing non-ghost columns from the [Source Database] tables.
Don't create an actual database. We are simply exploring to understand and populate concepts.py from the e-commerce and logistic domain information analysis.
Project File: Claude.md (terminal Claude)

 

An ER diagram deconstructed from the SQL statements below, based on the Northwind database adapted for Octo, is shown below them.

# Source Database Schema
Readonly. Do not modify information in this file.
Instead use for reference for when working on Ghost_Database_Schema.md
## Relationships between tables

```mermaid
%%{init: {
'theme': 'default',
'look': 'classic',
'layout': 'dagre'
} }%%
erDiagram
nwCustomers || --o{ nwOrders : nwOrders.CustomerID
nwOrders }| --|| Employees : nwOrders.EmployeeID
nwOrders }| --|| Shippers : nwOrders.ShipperID
nwOrders || --|{ OrderDetails : OrderDetails.OrderID
Products }| --|| Suppliers : Products.SupplierID
Products }| --|| Categories : Products.CategoryID
Products || --|{ OrderDetails: OrderDetails.ProductID

nwCustomers {
INTEGER CustomerID PK
VARCHAR(48) CustomerName
VARCHAR(32) ContactName
VARCHAR(64) Address
VARCHAR(32) City
VARCHAR(16) PostalCode
VARCHAR(32) Country
}
nwOrders {
INTEGER OrderID PK
INTEGER CustomerID
INTEGER EmployeeID
DATE OrderDate
INTEGER ShipperID
}
Shippers {
INTEGER ShipperID PK
VARCHAR(32) ShipperName
VARCHAR(14) Phone
}
Suppliers {
INTEGER SupplierID PK
VARCHAR(48) SupplierName
VARCHAR(32) ContactName
VARCHAR(64) Address
VARCHAR(32) City
VARCHAR(16) PostalCode
VARCHAR(32) Country
VARCHAR(15) Phone
}
Products {
INTEGER ProductID PK
VARCHAR(48) ProductName
INTEGER SupplierID
INTEGER CategoryID
VARCHAR(32) Unit
NUMERIC Price
}
OrderDetails {
INTEGER OrderDetailID PK
INTEGER OrderID
INTEGER ProductID
INTEGER Quantity
}
Categories {
INTEGER CategoryID PK
VARCHAR(32) CategoryName
VARCHAR(64) Description
}
Employees {
INTEGER EmployeeID PK
VARCHAR(32) LastName
VARCHAR(32) FirstName
DATE BirthDate
VARCHAR(16) Photo
VARCHAR(512) Notes
}

# SQL creating Northwind database tables and columns
```sql
CREATE TABLE nwCustomers (CustomerID INTEGER PRIMARY KEY, CustomerName VARCHAR(48), ContactName VARCHAR(32), Address VARCHAR(64), City VARCHAR(32), PostalCode VARCHAR(16), Country VARCHAR(32));
CREATE TABLE nwOrders (OrderID INTEGER PRIMARY KEY, CustomerID INTEGER, EmployeeID INTEGER, OrderDate DATE, ShipperID INTEGER);
CREATE TABLE Shippers (ShipperID INTEGER PRIMARY KEY, ShipperName VARCHAR(32), Phone VARCHAR(14));
CREATE TABLE Suppliers (SupplierID INTEGER PRIMARY KEY, SupplierName VARCHAR(48), ContactName VARCHAR(32), Address VARCHAR(64), City VARCHAR(32), PostalCode VARCHAR(16), Country VARCHAR(32), Phone VARCHAR(15));
CREATE TABLE Products (ProductID INTEGER PRIMARY KEY, ProductName VARCHAR(48), SupplierID INTEGER, CategoryID INTEGER, Unit VARCHAR(32), Price NUMERIC);
CREATE TABLE OrderDetails (OrderDetailID INTEGER PRIMARY KEY, OrderID INTEGER, ProductID INTEGER, Quantity INTEGER);
CREATE TABLE Categories (CategoryID INTEGER PRIMARY KEY, CategoryName VARCHAR(32), Description VARCHAR(64));
CREATE TABLE Employees (EmployeeID INTEGER PRIMARY KEY, LastName VARCHAR(32), FirstName VARCHAR(32), BirthDate DATE, Photo VARCHAR(16), Notes VARCHAR(512));
File: Source_Database_Schema.md

 
The below render of the Entity-Relationship diagram Claude was asked to work from starting with Source_Database_Schema.md shows only eight tables.
ER diagram of 8 tables of Northwind database

# This file holds enumeration placeholder definitions and descriptions (Config) for existing Northwind database tables and columns. To be extended with ghost columns and tables. The table and column names in Ghost_Database_Schema.md must always be synchronized with values in the Concept enumeration
# Naming relation convention:
# * Table name is equivalent to Enumeration name.
#   For example table 'nwCustomers' related to enumeration entry 'nwCustomers'.
# * Column name in table is equivalent to Enumeration name.
#   For example: column 'Address" in table 'nwCustomers' has corresponding enumeration entry 'nwCustomers_Address'
# Where the table name and column name are concatenated with underscore character

from enum import Enum,auto

# Holds concept names used as keys by dictionary 'Config'
# Note: Integer and GUID (UUID) Primary keys that join relational tables are not assigned a corresponding enumeration entry. Rationale: Customers would not enquire about database primary keys unless they have some informational value.
class Concept(Enum):
    nwCustomers=auto()
    nwCustomers_CustomerName=auto()
    nwCustomers_ContactName=auto()
    nwCustomers_Address=auto()
    nwCustomers_City=auto()
    nwCustomers_PostalCode=auto()
    nwCustomers_Country=auto()

    nwOrders=auto()
    nwOrders_OrderDate=auto()
    
    Shippers=auto()
    Shippers_ShipperName=auto()
    Shippers_Phone=auto()

    Suppliers=auto()
    Suppliers_SupplierName=auto()
    Suppliers_ContactName=auto()
    Suppliers_Address=auto()
    Suppliers_City=auto()
    Suppliers_PostalCode=auto()
    Suppliers_Country=auto()
    Suppliers_Phone=auto()

    Products=auto()
    Products_ProductName=auto()
    Products_Unit=auto()
    Products_Price=auto()
    
    OrderDetails=auto()
    OrderDetails_Quantity=auto()

    Categories=auto()
    Categories_CategoryName=auto()
    Categories_Description=auto()

    Employees=auto()
    Employees_LastName=auto()
    Employees_FirstName=auto()
    Employees_BirthDate=auto()
    Employees_Photo=auto()
    Employees_Notes=auto()


# Describes concepts used by base Nothwind Database plus ghost concepts
# Each [SourceDatabase] existing columns and tables have 'useful' set to one. Don't change these.
# Ghost Tables and Columns can be fully evaluated, compared and their 'useful' values
# elevated or decremented as new ghost tables and columns are added and compared.
# If a Ghost Table is removed then All of its corresponding Column entries would also be removed
# A Ghost table MUST have at least one Ghost Column entry
# Each ghost table or column MUST have a tangible 'useful' rating in the range from 1 to 20 inclusive, where:
# '1' means very useful and highest priority for direct customer interaction
# '20' means least useful and lowest priority for direct customer interaction
# Usefulness for customer interaction would be in customer scenarios:
# * buying a product from a website with their mobile phone or home computer
# * shipping product to the customer
# * tracking delivery of a dispatched product to a customer address
# * returning a defective product and asking for a refund
# * finding and viewing product details and features
# * requesting information about an order they made.
# * requesting a brochure about a product category
# These scenarios are illustrative and not exhaustive. Others can be suggested
Config={
    # Concept table Template by comments example
    Concept.nwCustomers:{
       # Mandatory. Type int
       # integer between 1 and 20
       'useful': 1,
       
       # Mandatory. Type String.
       # Capture rationale for 'useful score'
       'useful_justification':' In Northwind Database',

        # Use only if table is from Northwind database table
        'northwind_label': 'nwCustomers',

        # Type: list[tuple[str,str]]
        # List of table names use by other products for the same thing
        # Where type is ( [product_name], [column_name] 
        # Can accommodate multiple labels from a product if needed
        'ghost_label': [('ACME','Customer')],

        # Mandatory. Type list[str].
        # English language aliases in one or more words, with and without abbreviations, that are terms used commonly by general public to refer to this functionality.
        # Language aliases are free to overlap with terms and phrases used by other concepts
        # Aim to create between five and fifty variations.
        # Include negative and complaint phrasing customers use (e.g. 'Overcharged', 'Wrong item') where the complaint is about this concept.
        # The Quality of alias term is more important than maximizing the number of entries
        'generic_aliases':[
            'Customer', 'Customers', 'Client', 'Buyer', 'Purchaser'
            ],

        # Describe in one to four sentences precisely the functional intention of this table.
        'description':'Holds information about the customer making a purchase on an e-commerce site.'
    },

    # Concept column Template by comments example
    Concept.nwCustomers_Address:{
       # Mandatory. Type int
       # integer between 1 and 20
       'useful': 1,
       
       # Mandatory. Type String.
       # Capture rationale for 'useful score'
       'useful_justification':' In Northwind Database',

        # Use only if column is from Northwind database
        'northwind_label': 'Address',

        # Type: list[tuple[str,str]]
        # List of column names use by other products for the same thing
        # Where tuple type meaning is ( [product_name], [column_name] )
        # Can accommodate multiple labels from a product if needed
        'ghost_label': [('ACME','Street_name')],

        # Mandatory. Type list[str].
        # Generic aliases have one or more words, with and without abbreviations, that are terms or phrases used commonly by general public to refer to this functionality.
        # Language aliases are free to overlap with terms and phrases used by other concepts
        # Aim to create between five and fifty variations.
        # Include negative and complaint phrasing customers use (e.g. 'Overcharged', 'Wrong item') where the complaint is about this concept.
        # The Quality of alias term is more important than maximizing the number of entries
        'generic_aliases':[
            'Address', 'Street address', 'Address line 1'
            ],

        # Optional. Type list[str]. Columns only, not tables.
        # Around ten example values the column holds. For columns with a fixed set of values
        # (e.g. a status) list the canonical values; otherwise give realistic examples.
        'values':[
            ],

        # Mandatory. Type String.
        # Describe in one to four sentences precisely the functional intention this column.
        'description':'Home or delivery address information the customer making a purchase on an e-commerce site.'
    },

}
Project File: concepts.py

 

Outputs

Filtered on usefulness scores 1 to 4. These are the maximum importance and or pain areas to the customer.
Northwind Sensory Homunculus Heat map

Northwind Sensory Homunculus Heat map

How to understand the heat map: The more sensitive the “information area” the brighter the color will be.

 

Claude generated 11 additional tables and enhanced the 8 existing tables to model features from competing products.

End ER diagram
 

Northwind Sensory Homunculus in Tabular format

Useful level 1

Table Linked to Justification for usefulness priority Description
nwOrders ghostOrderStatus “Where is my order / what is the status of my order” is the top support topic in every source (18-50% of tickets); every platform and schema.org has an order status.

  • Pending payment
  • Awaiting fulfilment
  • Processing
  • On hold
  • Partially shipped
  • Shipped
  • Delivered
  • Completed
  • Cancelled
  • Refunded
The current stage of the order, from payment through dispatch to completion. Answers the most common customer question: where is my order and what is happening to it.
ghostShipments ghostTrackingNumber Customers ask for, and complain about, tracking numbers; held by every platform and shipping tool researched. The carrier’s reference number for the parcel, used to follow its progress on the carrier’s website. Shown to the customer in dispatch emails and order history.
ghostShipmentStatus Delivery status is what WISMO customers want to know; AfterShip, EasyPost, Shippo, Shopify and Amazon all normalise to the same ten stages.

  • Label created
  • In transit
  • Out for delivery
  • Delivery attempted
  • Ready for collection
  • Delivered
  • Exception
  • Returning to sender
  • Cancelled
  • Unknown
The current stage of the parcel in the carrier network, from label created to delivered, or an exception such as a failed delivery.
ghostShippedDate “When will you ship / has it been dispatched” is a core WISMO question; WooCommerce, ShipStation, Shopify and Magento record the ship date. The date the parcel was handed to the carrier.
ghostEstimatedDeliveryFrom “When will it arrive / ETA” is a core WISMO question (Bitext delivery_period); Amazon, eBay and schema.org hold a delivery window. The earliest date the parcel is expected to arrive; the start of the delivery window shown to the customer.
ghostEstimatedDeliveryUntil Late delivery is the top delivery complaint (Citizens Advice; Which? 56% not arrived when expected); Amazon A-to-z claims open 3 days after the latest delivery date. The latest date the parcel is expected to arrive; after this the delivery is late.
ghostDeliveredDate “It says delivered but I have not got it” is a distinct high-volume complaint (Lorikeet, Royal Mail, USPS, Amazon); carriers record the delivery date. The date the carrier recorded the parcel as delivered, or empty if not yet delivered.

Useful level 2

Table Linked to Justification for usefulness priority Description
OrderDetails ghostQuantityShipped Partly shipped orders are a common cause of “items missing” contacts; Amazon (QuantityShipped, PartiallyShipped), eBay (IN_PROGRESS) and Shopify (partial) model them. How many units of this order line have been shipped so far. When less than the quantity ordered, the rest is still to come or on back order.
ghostShipments ghostTrackingUrl Customers use the tracking link to self-serve; Shopify, WooCommerce, Salesforce and schema.org store a tracking URL. A web link to the carrier’s tracking page for this parcel.
ghostShipmentEvents ghostEventStatus Scan wording (“arrived at hub”, “out for delivery”, “card left”) is what customers quote back; AfterShip sub-statuses give the standard list.

  • Label created
  • Collected by carrier
  • Arrived at sorting centre
  • Departed facility
  • Arrived in destination country
  • Out for delivery
  • Delivery attempted
  • Delivered
  • Exception
  • Returning to sender
The stage recorded at this scan, such as collected, arrived at a sorting centre, out for delivery or delivered.
ghostExceptionReason Delivery problems are the second biggest complaint area: late, lost, damaged, left unsafe, wrong address, refused (Citizens Advice, Which?, FTC, Trustpilot); AfterShip Exception and AttemptFail codes give the standard reasons.

  • Recipient not available
  • Business closed
  • Address incorrect
  • Customer moved
  • Refused by recipient
  • Damaged in transit
  • Lost in transit
  • Customs delay
  • Weather delay
  • Not collected from pickup point
Why delivery could not be completed at this scan, such as nobody available, address incorrect, damaged or lost.
ghostReturns ghostReturnStatus Customers chase returns (“did you get my return?”); Shopify, Adobe Commerce RMA and eBay all track return status. The progress of the return, from requested through received and inspected to refunded, exchanged or denied.
ghostReturnReason Return reasons are customers’ own complaint wording; Shopify ReturnReason, eBay ReturnReasonEnum, Adobe Commerce RMA and Amazon’s return menu all list them. Why the customer is returning the item. Reasons where the seller is at fault (damaged, wrong item, not as described) usually mean free return postage.
ghostRefunds ghostRefundAmount Customers dispute partial refunds and missing postage refunds; every refund model records an amount. The amount of money refunded to the customer.
ghostRefundStatus Refund chasing is a top post-purchase contact (Bitext track_refund); Shopify financial_status and WooCommerce statuses show refund progress.

  • Pending
  • Approved
  • Processing
  • Issued
  • Completed
  • Failed
  • Declined
  • Reversed
  • Cancelled
  • On hold
The progress of the refund, from pending to issued and completed, or failed.

Useful level 3

Table Column Justification for usefulness priority Description
nwCustomers ghostEmail Needed for order confirmations, dispatch notices and every contact request; held by all platforms researched. The email address of the customer contact. Used for order confirmations, dispatch and delivery notices, invoices and account login.
ghostPhone Needed by carriers for delivery contact and by staff for queries; held by all platforms researched. The telephone number of the customer contact. Used by the courier to arrange delivery and by staff to resolve order queries; mobile numbers can receive SMS delivery updates.
ghostRegion State / county / province is part of every address model researched (Shopify, WooCommerce, Magento, Amazon, schema.org) and is required for US addresses, tax and shipping zones. The state, county or province part of the customer address. Required for US addresses and used for delivery zones, sales tax and correspondence.
nwOrders ghostShipName Every platform stores a ship-to name separate from the customer (gifts, staff receiving deliveries); part of the original full Northwind Orders table. The name of the person or business the order is delivered to. May differ from the customer, for example a gift recipient or a member of staff receiving goods.
ghostShipAddress Wrong-address and change-address requests are frequent (Bitext address intents, Trustpilot complaints); all platforms store a shipping address on the order. The street address the order is delivered to. Copied from the customer at the time of ordering so it can differ from the account address and can be changed for one order.
ghostShipCity Part of the order shipping address in every platform researched. The city or town of the order shipping address.
ghostShipRegion Part of the order shipping address in every platform researched; required for US deliveries. The state, county or province of the order shipping address.
ghostShipPostalCode Part of the order shipping address in every platform researched; used for delivery routing. The postcode (UK) or ZIP code (US) of the order shipping address.
ghostShipCountry Part of the order shipping address in every platform researched; decides domestic vs international delivery and customs. The country of the order shipping address. Decides whether delivery is domestic or international and whether customs applies.
ghostCancelledDate Order cancellation is a frequent intent (Bitext cancel_order; 17% “order changes” in one store); Shopify, WooCommerce, Magento, Amazon, eBay and ShipStation all record cancellation. When the order was cancelled, or empty if it has not been. A cancelled order will not be dispatched and any payment should be refunded.
ghostCancelReason Customers ask why an order was cancelled; Shopify and eBay record a cancel reason. Why the order was cancelled, whether requested by the customer or by the business (for example out of stock or payment declined).
ghostShipmentEvents ghostEventDate “Tracking has not updated in days” is a common complaint (AfterShip Expired_001 / Pending_005). When the carrier recorded this tracking event.
ghostReturns ghostResolution Customers ask for a refund, replacement or exchange and complain about store credit; Adobe Commerce RMA resolution, schema.org RefundTypeEnumeration and Shopify exchanges model it. The outcome of the return: a refund, an exchange or replacement, or store credit.
ghostRefunds ghostRefundDate Customers ask how long refunds take; refund records carry a date (Shopify Refund.created_at). When the refund was issued.
ghostPayments ghostPaymentStatus “Did my payment go through / why was my card declined” are common (Bitext payment_issue); Shopify financial_status, eBay orderPaymentStatus and schema.org PaymentStatusType model it.

  • Pending
  • Authorised
  • Paid
  • Partially paid
  • Declined
  • Failed
  • Refunded
  • Partially refunded
  • Voided
  • Overdue
Whether the payment has been authorised, completed, declined or refunded.
ghostReturnPolicies ghostReturnable Perishable food is often non-returnable; customers ask “can I return food”; schema.org MerchantReturnNotPermitted models it. Whether products in this category can be returned at all.
‘Yes’, ‘No’
ghostReturnWindowDays “How long do I have to return it” is a common question; schema.org merchantReturnDays models it; UK 14-day cooling-off rules apply to online orders. How many days after delivery the customer has to start a return.

Useful level 4

Table Linked to Justification for usefulness priority Description
nwOrders ghostRequiredDate Customers ask whether an order will arrive in time (“I need it by Friday”); part of the original full Northwind Orders table and important for trade customers. The date by which the customer needs the order delivered. Used to choose a delivery service and to warn the customer if the date cannot be met.
ghostOrderTotal Customers ask what an order cost and dispute totals; every platform stores an order total. The total amount for the order including products, delivery and tax, after any discount.
ghostShippingCost Delivery charges are a frequent pre- and post-purchase question; every platform stores the shipping charge on the order. The delivery charge the customer paid for this order.
ghostTaxAmount VAT / sales tax is on every invoice and asked about by trade customers; stored by Magento, ShipStation and Amazon. The tax (VAT in the UK, sales tax in the US) charged on the order.
ghostShippingService Customers who paid for faster delivery ask about it; Shopify, WooCommerce, ShipStation and Amazon store the chosen service. The delivery service the customer chose for this order, such as standard, express or next day.
Products ghostAvailability “Is it in stock / when is it back” is a common pre-sales question (Gorgias); schema.org ItemAvailability, WooCommerce, Magento and Shopify all model it. Whether the product can be ordered now, and if not why: out of stock, on back order, pre-order or discontinued.
ghostStockLevel Trade customers ask whether there is enough stock for a quantity; Shopify, WooCommerce, Magento and schema.org hold a stock quantity. How many units of the product are currently in stock and available to order.
ghostDescription Product detail questions are 10-15% of tickets (vendor estimate) and “not as described” is a top return reason; every platform has a product description. Text describing the product for customers: what it is, what it tastes like and what makes it different.
ghostIngredients Northwind sells only food; GS1 ingredientStatement is the industry standard field and food labelling law requires it. The full list of ingredients as printed on the pack, in descending order of weight. Used to answer diet questions such as vegan, gluten free or halal.
ghostAllergens Allergen questions are safety-critical for a food seller; GS1 allergenStatement and allergen code lists are the industry standard. The allergens the product contains or may contain, as declared on the label. UK law names 14 allergens and US law 9, so wording differs by market.
ghostDietType Diet questions (vegan, gluten free, halal, kosher) are common for food; GS1 dietCode with 10 DietTypeCode values is the industry standard field.

  • Coeliac
  • Dietetic
  • Free From Gluten
  • Halal
  • Kosher
  • Organic
  • Vegan
  • Vegetarian
  • Without Beef
  • Without Pork
The special diets the product is suitable for, such as vegan, vegetarian, gluten free, halal, kosher or organic, as certified or claimed on the label. Values follow the GS1 diet type codes.
ghostShipmentEvents ghostEventLocation Customers ask where the parcel is now and why it has sat at a depot; every tracking source records a scan location. Where the parcel was when this event was recorded.
ghostCarrierMessage Customers quote tracking messages and ask what they mean; every tracking source keeps the carrier’s raw message. The carrier’s own wording for this tracking event, as shown on its tracking page.
ghostReturns ghostReturnQuantity Customers return part of an order line; Shopify Return.totalQuantity and eBay return line quantities record it. How many units of the order line are being returned.
ghostRequestedDate Return windows are counted from dates and customers dispute them; every returns model records when the return was requested. When the customer asked to return the item.
ghostReturnTrackingNumber Customers prove they posted a return and ask whether it arrived; return shipping fees and reverse fulfilment are modelled by Shopify. The tracking number of the parcel the customer sends back.
ghostRefunds ghostRefundMethod Customers ask where a refund will go and object to store credit; schema.org RefundTypeEnumeration and Adobe Commerce resolutions distinguish methods. How the refund is paid back: to the original payment method, as store credit, or by another method.
ghostPayments ghostPaymentMethod “How can I pay / do you accept…” is a frequent pre-sales question (Bitext check_payment_methods); stored by WooCommerce, ShipStation, Amazon and schema.org. How the customer paid, or will pay, for the order.
ghostAmountPaid Double charges and overcharges are recurring complaints (retailer help pages); ShipStation and Shopify record the amount paid. The amount taken from the customer for this payment.
ghostShippingOptions ghostServiceName Delivery speed options are asked about before ordering; Amazon ShipServiceLevel, ShipStation serviceCode and Shopify shipping lines name them. The name of the delivery service, describing its speed or type.
ghostShippingRate “How much is delivery” is a frequent pre-sales question and high delivery cost a common complaint; schema.org shippingRate and all platforms price delivery. The price of this delivery service.
ghostTransitDays “How long does shipping take” is a top pre-sales question (Branvas); schema.org ShippingDeliveryTime.transitTime models it. How many working days the service usually takes from dispatch to delivery.
ghostDestinationCountry “Do you ship to…?” is a typical pre-sales question (Branvas); schema.org shippingDestination and doesNotShip model coverage. A country this delivery service covers.
ghostReturnPolicies ghostReturnFees “Who pays return postage” is asked often and disputed (Amazon seller forums; eBay seller pays for not-as-described); schema.org ReturnFeesEnumeration models it. Who pays to send a return back and whether any fee is deducted from the refund.
ghostRefundType Customers ask whether they get money back or only credit; schema.org RefundTypeEnumeration models FullRefund, ExchangeRefund, StoreCreditRefund. What the customer receives for a return under this policy: a full refund, an exchange or store credit.

Conclusions

Logistics information domain area played a large part in usefulness weighting for the customer experience.
The starting project is a fairly generic prompt tool that can be reconfigured to give a different emphasis or explore different product information domains.

Further Observations

  • For research oriented tasks ask Claude to “plan the work” before doing the work.
  • After the plan is hatched, direct Claude to “Think harder about aliases” – This is more tokens but quality above quantity.
  • Early on in our project I needed to direct Claude to ignore that there were duplicate generic aliases between concepts and to stop de-duplicating them.
  • I told Claude I had a great plan in a subsequent project where the duplication will be very useful.

  • Giving a “future goal” modulates reward behavior. It is more effective in quality of output than simply directing to “stop duplicating aliases”.
  • I directed Claude to focus on customer feedback made in the US and UK product markets
  • I needed to correct some assumptions for example “US zipcode” and “UK postcode” mean the same concept in our scenario.
  • Direct Claude to “search for real sources information” instead of relying on “from memory” (training).
  • When Claude outputs large amounts of text to read through, in order to make for decisions reply immediately “it will take me while to read though this” to stop Claude jumping ahead to do things in parallel in auto-mode.
  • When Claude suggests the option of doing stages of work in parallel say “No. Do it sequentially”.
  • So subsequently when Claude recommends processing a list of 20 website sources you can interject and suggest “lets process only the first 3rd of items in the list and then decide whether to continue”. Most times Claude reflected that the usefulness of reviewing all sources had diminishing returns after processing the first group of items and was valid decision to skip on to the next plan step.
  • Having at least some project information in a python source file gets interesting in that Claude automatically works out how to write unit tests on the evolving information collation process. This can be rules on expected values for columns and also keeping information in sync between different project files.
  • I was impressed that Claude followed my example of labeling both the table and column name involved in the mermaid Entity Relationship diagrams. For me it removes ambiguity when thinking about these UML diagrams.

There once was a company that one day directed employees to “work smarter”. Somehow possibly through HR?, the local policy became to dress smarter. For example no trainers or jeans, maybe a shirt and tie for Project Managers. I have a suspicion in similar sense maybe the lead of an AI company with a background in physics, one day observed “be kind to the AI”. The implicit reasoning here, is that this games the context reward feedback to give better quality generative results. Somewhere I think the recent media hyper-cycle has whipped up another talking point for AI sentience. Well its all free advertising. So let that sucker spin.

So on my final point:

    Be kind with your prompt input and acknowledge good work at important steps in the context or when useful information is volunteered or alternative enhancements become apparent. Its all reward driven!! So without a new and deserved “great job on that…” the default stochastic expression of prompt metabolism seems simply to complete tasks faster.

About Alex Woodhead

An M programmer with almost a quarter century of experience, Alex Woodhead has worked on projects relating to clinical information system projects on multiple continents. Now living in Southern California, he is focused on synthetic data pipelines for generative AI for novel tools and automation, and is incubating genput.

Contact: info@genput.com

Credits

Published on October 27, 2026