# Product friction found during What Changes Hands

These are observed journey findings, not claims about untested deployments. No Numinor repository files were changed.

## 1. Free Reference fields falsely trigger a stale-basket warning

**Observed:** A brand-new basket with 30 priced fields plus free Reference fields displays “This basket can't be priced” and tells the user to recreate it. The same basket successfully opens Stripe checkout. Recreating it would not address the cause.

**Local reproduction:** Call `buildStagingPayload` with the current resolved atoms for `c2c_pit.equity_customer_pit.entity_id` and `reference.base_stock.abbr`. Result: annual list 1000, monthly 83, one paid field, and `unpriceable: ["reference"]`.

**Cause in inspected local code:** `lib/staging-view.ts:233` interprets `quoteSelection(...).count === 0` as an obsolete selection. `lib/source-pricing/index.ts:391` only counts fields with positive prices. Therefore a legitimate free-only dataset is labelled obsolete. This is outside the settled price-book policy: the problem is classification of a valid zero-price selection, not the pricing model.

**Suggested fix:** Distinguish unresolved selected keys from resolved free keys, and add a mixed paid-plus-free dataset regression case. The warning should name any genuinely unresolved fields and preserve a valid composition.

## 2. Free join keys are helpful but not sufficient for semantic reproducibility

Adding a counterparty ID auto-includes seven structural columns. Annual filtering (`p`), monetary units (`currency`) and exact source references (`file_id`, `element_id`) still need explicit selection. The agent added these separately. An agent can otherwise create a joinable export that cannot reproduce its in-Matrix filters or audit the original disclosure.

**Suggested improvement:** A construct dependency check comparing referenced source columns with the proposed export schema, with one action to include missing free semantics. This is a workflow improvement, not an argument to charge plumbing.

## 3. Trinity misses a codebook that the website does contain

`ask_trinity` could not map tender stage codes 21–24. Reading the detail table's dictionary in the website immediately supplied the definitions. Its retrieval included an overly broad field-reference chunk and irrelevant test lessons. The answer correctly abstained rather than inventing a mapping.

**Suggested improvement:** Route exact dataset/table/field queries to the corresponding dictionary entry before general vector retrieval. Include the resolved field citation and code/value map.

## 4. Live preview failed on a small derived example

`preview_data(data="wch_example_view", max_rows=10)` returned `preview_failed: The preview tool produced no parseable result.` The frame had one derived example candidate with eight columns. The numerical result-table tool and private report succeeded in the same session. No bulk-data export workaround was used.

**Suggested improvement:** Surface the actual serialization/validation error and return a request ID; test mixed Chinese/English text frames. The precise server-side cause is not established.

## 5. Generic timestamp hints conflict with the dictionary

The basket renders `_known_date` with “when this row became knowable — filter on it for point-in-time backtests.” The adjacent dictionary correctly says it is delivery transaction time and the source's `publish_date` is the market as-of field. Backfilled snapshots make the difference consequential.

**Suggested improvement:** Keep the generic hint aligned with each source's declared time model; distinguish public disclosure, vendor collection and platform delivery.

## 6. SAM's documented join path needs a grain-aware example

The Atlas suggests joining period headers by `(secu, report_date)`. The measured fact grain is `(id, product_code)`; 29,628 company/date/product groups have multiple rows, while `(id, product_code)` is unique. Joining `calc.id` to `period.id` matched 1,530,341 of 1,530,362 calculation rows. We used the header ID and explicitly handled latest publication and multi-listing membership.

**Suggested improvement:** Show and test the ID-based header join, explain the 21 unmatched rows, and expose join cardinality diagnostics. The current prose can invite multiplicative joins if followed mechanically.

## 7. Private report exposes a translation key

The verified private report renders its PDF action as `reportView.savePdf`, rather than a user-facing label. The report itself and the numerical table render successfully. The PDF endpoint was not tested.

**Suggested improvement:** Supply the English locale message and verify the report action labels in both languages.

## 8. Paid taxonomy fields activate but the export omits their table — resolved

The post-purchase job became ready in about 24 seconds, with all 30 required paid grants active. Its manifest nevertheless skipped Taxonomy with “no exportable data published.” The other nine required tables were offered successfully. A ready job therefore does not prove a complete purchased construct.

The inspected code maps Taxonomy onto the physical Reference panel for discovery (`lib/source-data.ts:72`), while field export passes the commercial slug directly to a physical-prefix resolver (`lib/field-export.ts:96`, `lib/source-export.ts`). The likely missing shared-panel mapping is documented with acceptance cases in `DELIVERY_ISSUE.md`.

**Historical workaround:** The paid SAM product paths recover depth and ancestry; Matrix checks show zero disagreement for the 5,296 represented codes. They do not contain labels. The gadget can run the construct, but most product names remain unavailable until the official taxonomy is delivered. This is the most consequential issue encountered because it occurs after payment and prevents a fully labelled marketing experience.

**Suggested improvement:** Align commercial-product/physical-panel resolution across discovery and export, preserve field/table entitlement restrictions, and clearly distinguish “ready, complete” from “ready, partial.” Test that a purchased dependency closure is actually deliverable before checkout.

**Resolution verified, 11 September 2026:** A fresh licensed export delivered all 6,544 official taxonomy rows and selected fields with complete grain and no skipped dataset. Download validation found zero disagreements with either reconstructed study hierarchy. The gadget now uses official bilingual names. The incident remains useful evidence for complete-versus-partial delivery checks; no claim is made here that the suggested acceptance cases were tested on other purchase recipes.

## Integration issues attributable to this agent/client

- The first hand-written MCP transport waited for an SSE stream to close after the result had already arrived. Fixed by returning after the matching JSON-RPC event.
- Concurrent calls initially reused JSON-RPC id 1. One completed validation result was not received by its caller. Fixed with unique UUID request IDs; recovered the completed kernel variables without rerunning the analysis or resetting the kernel.
- Several exploratory DuckDB aliases used reserved words. Corrected before the successful construct run. The failed call logs remain part of the audit trail.
- One diagnostic grouped a free-text column and generated an oversized, truncated print. Later outputs are bounded aggregate statistics and the report uses `emit_result_table`.

- Bulk transfers were slow in this local network environment (ordinary package downloads were slow too). Bounded, resumable HTTPS range requests recovered useful throughput. Each range was checked for exact position/length and the completed files were hashed. This is recorded as transport friction without attributing the cause to Numinor.
- An expired MCP session returned “Server not initialized.” Reinitializing the connection restored access without restarting or clearing the research kernel.

## Research limitations, not product defects

The document's counts and live mounted data differ; the graph exposes no confidence-grade column. Tender overlap is too small and selected to establish general product accuracy. Current ontology and corrected snapshots do not confer historical vintage safety. These limits shape the gadget's claims and labels.

## Company-network audit — reported vs. calculated SAM semantics

The precise field dictionary and Atlas distinguish calculation-table subtree metrics (`product_income`) from direct/block metrics (`product_b_income`). Trinity's cross-table answer conflated the separate original-product restated metric with the calculation-table rollup and did not reliably resolve the grain. The agent recovered by checking exact dictionary definitions and aggregate measurements in the Matrix. A field-level semantic response should identify the table-qualified name, direct/cumulative basis, units, denominator and join key consistently.

The original export also includes `fin_secu_sam_product` with purchased revenue but without its priced `product_code` grain component. Its manifest correctly declares incomplete grain; it must not be treated as a usable reported-node table. For this redesign, the smaller valid remedy is to license the two direct metrics on the already-keyed calculation table. Dependency recommendations could make this choice clearer before checkout.


## Company-network integration errors attributable to the agent/demo

- **CATL missing from search:** the first local preview indexed only 18 example companies. The paid reference data already contained CATL. Replaced the sample with the full company universe.
- **Multiple-listing aliases lost:** selecting one preferred listing also discarded names on other listings. Merge every alias before canonical deduplication; CATL and Contemporary Amperex plus both stock codes now resolve together.
- **Blank SAM and inferred paths:** the new map initially waited for direct reported fields without integrating the already purchased cumulative SAM metrics. Restored all available calculation coverage with explicit labels, then replaced it with actual reported nodes after the supplement arrived. The initial blank state was not evidence that Numinor had no SAM data.
- **Incorrect reported-node assumption:** a frontier of positive cumulative SAM nodes cannot identify every directly reported node, particularly a parent reported alongside children. The exact `product_b_*` fields solve that semantic dependency. Purchase composition needed to follow the expanded product requirement.
- **Company label/index mismatch risk:** mutable catalogs and period assets could combine an old numerical company index with a new data build. Release directories are now immutable and period data must match the catalog version and identity hash. Xihua and Harmontronics were never merged by guessed identity.
- **Incomplete English-name coverage:** stock/company master names alone do not cover all counterparties. Licensed original disclosure names expand coverage; explicitly labelled renderings handle Chinese-only names. Source abbreviations with punctuation, such as H&M, must not be rejected just because they lack adjacent Latin letters.

## Supplemental purchase outcome — verified 11 September 2026

The human completed checkout; all eight additional paid field grants activated. The licensed API supplied all eight required tables with complete grains and selected direct/cumulative SAM metrics, full names and original counterparty names. Hash, row count and version checks passed. No missing-table incident recurred for this recipe. This does not imply every other export recipe or earlier UI issue has been retested.

**Remaining improvement opportunities:** exact table-qualified field definitions should make direct/cumulative basis and COGS dependencies easy to find; construct readiness should distinguish entitlements, complete grain, delivered fields and actual company/period coverage. A supplied field can still be null for an individual reported product. The source does not provide official English labels or SAM coverage for every counterparty; those are coverage limits, not download failures.

**Observed ownership of friction:** Numinor taxonomy delivery was a platform blocker and is verified resolved. Preview search/SAM integration and stale-index handling were agent errors and are fixed. Slow bulk transfers were environment/transport friction. Initial private-hosting TLS failure belonged to Sites and was separately resolved. These categories must not be collapsed into a single platform score.


## Hosting transfer ceiling — separate from Numinor, recovered

The completed full-data Site package was 133,023,957 bytes. Native archive upload timed out twice at approximately 60 seconds, before saving a version. The source had already reached the Site repository successfully. After confirming that neither upload had saved a version, publication used a remote build of the same validated source and succeeded with owner-only access. The local verified package and exact failure receipts remain in the project. This newly observed transport ceiling belongs to the Sites publication path; all Numinor supplemental data had already passed delivery checks.


## Duplicate directed product/category edges — confirmed; demo workaround applied

**Observed in the licensed source:** The user’s Integrated Circuit Packaging and Testing Equipment → Chip Packaging and Testing example has six distinct active source IDs with identical upstream/downstream codes and `CAPEQ` category, all version 4. There are three descriptions (one repeated four times). The active graph contains 3,122 such duplicate identity groups, 4,847 excess rows and 2,764 groups with different descriptions. This duplication survives proper delivery-version resolution because the rows have different source IDs. We have not established the generating cause.

**Demo remedy:** One connection per exact directed product-code pair/category, preferring a nonblank original English description and then the lexically smallest source ID. The six screenshot entries become one. Counts and quick-select rankings are rebuilt using the same rule; all supported company pair-periods remain supported. Original source records and the frozen research construct remain unchanged. The complete ID/description mapping and regression checks are recorded locally.

**Suggested platform improvement:** Define whether multiple descriptions are independent annotations or duplicate relationship rows. For a single logical connection, provide a stable canonical identity and attach wording/provenance variants to it, or deduplicate/upsert by directed product codes, category and graph version. An agent should not have to treat repeated wording records as additional product paths. Different categories/directions and genuinely distinct nodes must remain separate. This is a verified source-identity duplication; the platform’s intended annotation model and root cause remain unverified.
