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.
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));
The below render of the Entity-Relationship diagram Claude was asked to work from starting with Source_Database_Schema.md shows only eight tables.

# 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.'
},
}
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
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.

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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
- 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.
I told Claude I had a great plan in a subsequent project where the duplication will be very useful.
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
- 1937 image of sensory homunculus reproduced here from Harrison, Robert. Representing the Acoustic World within the Brain: Normal and Abnormal Development of Frequency Maps in the Auditory System is believed to be in the public domain.
- Image of cover of Phantoms in the Brain by V.S. Ramachandran and Sandra Blakeslee, a book well worth reading, is reproduced under Fair Use.
Published on October 27, 2026
